diff options
1036 files changed, 23592 insertions, 21307 deletions
@@ -29,4 +29,10 @@ c6e6324f5be1401f077ad18a4a0f6b46451c2f7b last_sprint 9822eb3e25f7fe0c28ffd8aba45c507caa383cbc 2.2.0-beta2 b0cd7e150009809a0b5b0a9d5785cd4bb230413a 2.2.0-beta3 00a831292231faad7e44c69f76cb96f175b8dfad 2.2.0-beta4 +98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-beta1 1415e6538d54fd5d568ee88343424d57c6803c2c 2.2.0-release +98e0d6df638429fd2f0476667504bd5a6b298def 2.3.0-start +a3c12342b1af0951b8aa3b828aacef17fcea8178 2.3.0-beta1 +db0fe9bb65187f365e58a717dd23d0f4754a9c1d 2.3.0-beta2 +6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-beta3 +6ad3d6fa35a4e320e9ce442fce2bf9c7fc852556 2.3.0-release diff --git a/BuildParams b/BuildParams index 9c17a40d3f..abeaebae98 100644 --- a/BuildParams +++ b/BuildParams @@ -51,6 +51,7 @@ viewer-release.viewer_channel = "Second Life Release" viewer-release.login_channel = "Second Life Release" viewer-release.build_debug_release_separately = true viewer-release.build_viewer_update_version_manager = true +viewer-release.release-viewer.jira = DRTVWR-13 # ======================================== # aimee @@ -86,6 +87,7 @@ brad-parabuild.build_server_tests = false cg_viewer-development_lenny.collect_metrics = true cg_viewer-development_lenny.show_changes_since = 4b140ce7839d +cg_viewer-development_lenny.email = cg@lindenlab.com # ======================================== # gooey @@ -102,6 +104,26 @@ gooey.viewer_grid = agni gooey.build_viewer_update_version_manager = false # ======================================== +# Display Names project +# ======================================== + +#viewer-identity-evolution.email = leyla@lindenlab.com +viewer-identity.build_Debug = false +viewer-identity.build_RelWithDebInfo = false +viewer-identity.build_viewer = true +viewer-identity.build_server = false +viewer-identity.build_server_tests = false +viewer-identity.build_Linux = true +viewer-identity.build_hg_bundle = true +viewer-identity.bulld_docs = true +viewer-identity.viewer_channel = "Second Life Project Viewer" +viewer-identity.login_channel = "Second Life Project Viewer" +viewer-identity.viewer_grid = aditi +viewer-identity.build_viewer_update_version_manager = false + + + +# ======================================== # palange # ======================================== @@ -59,6 +59,7 @@ pre_build() -t $variant \ -G "$cmake_generator" \ configure \ + -DGRID:STRING="$viewer_grid" \ -DVIEWER_CHANNEL:STRING="$viewer_channel" \ -DVIEWER_LOGIN_CHANNEL:STRING="$login_channel" \ -DINSTALL_PROPRIETARY:BOOL=ON \ @@ -114,11 +115,15 @@ then if [ -x "$top/../buildscripts/hg/bin/build.sh" ] then exec "$top/../buildscripts/hg/bin/build.sh" "$top" + elif [ -r "$top/README" ] + then + cat "$top/README" + exit 1 else cat <<EOF This script, if called in a development environment, requires that the branch independent build script repository be checked out next to this repository. -This repository is located at http://hg.lindenlab.com/parabuild/buildscripts +This repository is located at http://hg.secondlife.com/buildscripts EOF exit 1 fi @@ -223,7 +228,7 @@ do fi else begin_section "Build$variant" - build "$variant" "$build_dir" > "$build_log" 2>&1 + build "$variant" "$build_dir" >> "$build_log" 2>&1 begin_section Tests grep --line-buffered "^##teamcity" "$build_log" end_section Tests @@ -284,6 +289,7 @@ then succeeded=$build_coverity else upload_item installer "$package" binary/octet-stream + upload_item quicklink "$package" binary/octet-stream # Upload crash reporter files. case "$last_built_variant" in diff --git a/doc/contributions.txt b/doc/contributions.txt index e48924d0f6..adfee2cce9 100644 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -20,6 +20,7 @@ Aimee Trescothick SNOW-227 SNOW-570 SNOW-572 + SNOW-575 VWR-3321 VWR-3336 VWR-3903 @@ -33,6 +34,7 @@ Aimee Trescothick VWR-6550 VWR-6583 VWR-6482 + VWR-6918 VWR-7109 VWR-7383 VWR-7800 @@ -59,16 +61,26 @@ Aimee Trescothick Alejandro Rosenthal VWR-1184 Aleric Inglewood + SNOW-522 + SNOW-626 + SNOW-756 + SNOW-764 VWR-10001 VWR-10759 VWR-10837 VWR-12691 + VWR-12984 VWR-13996 VWR-14426 + SNOW-84 + SNOW-477 SNOW-766 + STORM-163 Ales Beaumont VWR-9352 SNOW-240 +Alexandrea Fride + STORM-255 Alissa Sabre VWR-81 VWR-83 @@ -117,6 +129,7 @@ Alissa Sabre VWR-12617 VWR-12620 VWR-12789 + SNOW-322 Angus Boyd VWR-592 Ann Congrejo @@ -133,6 +146,7 @@ Asuka Neely Balp Allen VWR-4157 Be Holder + SNOW-322 SNOW-397 Benja Kepler VWR-746 @@ -163,8 +177,11 @@ Boroondas Gupte SNOW-610 SNOW-624 SNOW-737 + STORM-318 VWR-233 VWR-20583 + VWR-20891 + VWR-23455 WEB-262 Bulli Schumann CT-218 @@ -194,6 +211,8 @@ Catherine Pfeffer Celierra Darling VWR-1274 VWR-6975 +Cypren Christenson + STORM-417 Dale Glass VWR-120 VWR-560 @@ -336,6 +355,7 @@ Joghert LeSabre VWR-64 Jonathan Yap VWR-17801 + STORM-616 Kage Pixel VWR-11 Ken March @@ -373,6 +393,8 @@ Malwina Dollinger CT-138 march Korda SVC-1020 +Marine Kelley + STORM-281 Matthew Dowd VWR-1344 VWR-1651 @@ -381,6 +403,7 @@ Matthew Dowd VWR-1761 VWR-2681 McCabe Maxsted + SNOW-387 VWR-1318 VWR-4065 VWR-4826 @@ -393,6 +416,7 @@ McCabe Maxsted VWR-8689 VWR-9007 Michelle2 Zenovka + STORM-477 VWR-2652 VWR-2662 VWR-2834 @@ -520,6 +544,7 @@ Pf Shan CT-230 CT-231 CT-321 + SNOW-422 princess niven VWR-5733 CT-85 @@ -541,14 +566,19 @@ Ringo Tuxing Robin Cornelius SNOW-108 SNOW-204 + SNOW-287 SNOW-484 SNOW-504 SNOW-506 SNOW-507 SNOW-511 + SNOW-512 SNOW-514 SNOW-520 SNOW-585 + SNOW-599 + SNOW-747 + STORM-422 VWR-2488 VWR-9557 VWR-11128 @@ -557,6 +587,7 @@ Robin Cornelius VWR-12758 VWR-12763 VWR-12995 + VWR-20911 Ryozu Kojima VWR-53 VWR-287 @@ -571,6 +602,8 @@ Salahzar Stenvaag CT-321 Sammy Frederix VWR-6186 +Satomi Ahn + STORM-501 Scrippy Scofield VWR-3748 Seg Baphomet @@ -629,6 +662,7 @@ Strife Onizuka VWR-183 VWR-2265 VWR-4111 + SNOW-691 Tayra Dagostino SNOW-517 SNOW-543 @@ -646,12 +680,19 @@ Teardrops Fall VWR-5366 Techwolf Lupindo SNOW-92 + SNOW-592 SNOW-649 + SNOW-650 + SNOW-651 + SNOW-654 SNOW-687 SNOW-680 SNOW-681 + SNOW-685 SNOW-690 + SNOW-746 VWR-12385 + VWR-20893 tenebrous pau VWR-247 Tharax Ferraris @@ -661,8 +702,9 @@ Thickbrick Sleaford SNOW-390 SNOW-421 SNOW-462 - SNOW-635 SNOW-586 + SNOW-592 + SNOW-635 SNOW-743 VWR-7109 VWR-9287 @@ -673,6 +715,8 @@ Thraxis Epsilon VWR-383 tiamat bingyi CT-246 +Tofu Buzzard + STORM-546 TraductoresAnonimos Alter CT-324 Tue Torok @@ -718,8 +762,22 @@ Whoops Babii VWR-8298 Wilton Lundquist VWR-7682 +WolfPup Lowenhar + SNOW-622 + SNOW-772 + STORM-102 + STORM-103 + STORM-143 + STORM-535 + STORM-544 + STORM-654 + VWR-20741 + VWR-20933 Zai Lynch VWR-19505 +Wolfpup Lowenhar + STORM-255 + STORM-256 Zarkonnen Decosta VWR-253 Zi Ree diff --git a/etc/message.xml b/etc/message.xml index c17ae3656d..7c4a927cc5 100644 --- a/etc/message.xml +++ b/etc/message.xml @@ -370,6 +370,14 @@ </map> <!-- Server to client --> + <key>DisplayNameUpdate</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + <key>ParcelVoiceInfo</key> <map> <key>flavor</key> @@ -426,6 +434,22 @@ <boolean>true</boolean> </map> + <key>SetDisplayNameReply</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + + <key>SimConsoleResponse</key> + <map> + <key>flavor</key> + <string>llsd</string> + <key>trusted-sender</key> + <boolean>true</boolean> + </map> + <key>DirLandReply</key> <map> <key>flavor</key> diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 261c0b17e2..8d4969a49e 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -123,6 +123,8 @@ if (SERVER) endif (WINDOWS) endif (SERVER) -# Define after the custom viewer and server targets are created so individual -# apps can add themselves as dependencies -add_subdirectory(${INTEGRATION_TESTS_PREFIX}integration_tests) +if (LL_TESTS) + # Define after the custom viewer and server targets are created so + # individual apps can add themselves as dependencies + add_subdirectory(${INTEGRATION_TESTS_PREFIX}integration_tests) +endif (LL_TESTS) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 4fc25dcc24..6470836286 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -26,6 +26,7 @@ set(cmake_SOURCE_FILES FindBerkeleyDB.cmake FindCARes.cmake FindELFIO.cmake + FindFMOD.cmake FindGooglePerfTools.cmake FindMono.cmake FindMT.cmake diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 95ed5d6bc8..e852cf463c 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -55,9 +55,10 @@ if(WINDOWS) set(release_files ${release_files} libtcmalloc_minimal.dll) endif(USE_GOOGLE_PERFTOOLS) - if (FMOD_SDK_DIR) - set(fmod_files fmod.dll) - endif (FMOD_SDK_DIR) + if (FMOD) + set(debug_files ${debug_files} fmod.dll) + set(release_files ${release_files} fmod.dll) + endif (FMOD) #******************************* # LLKDU @@ -237,9 +238,9 @@ elseif(LINUX) libssl.so.0.9.7 ) - if (FMOD_SDK_DIR) - set(fmod_files "libfmod-3.75.so") - endif (FMOD_SDK_DIR) + if (FMOD) + set(release_files ${release_files} "libfmod-3.75.so") + endif (FMOD) #******************************* # LLKDU @@ -333,30 +334,6 @@ copy_if_different( ) set(third_party_targets ${third_party_targets} ${out_targets}) -if (FMOD_SDK_DIR) - copy_if_different( - ${FMOD_SDK_DIR} - "${CMAKE_CURRENT_BINARY_DIR}/Debug" - out_targets - ${fmod_files} - ) - set(all_targets ${all_targets} ${out_targets}) - copy_if_different( - ${FMOD_SDK_DIR} - "${CMAKE_CURRENT_BINARY_DIR}/Release" - out_targets - ${fmod_files} - ) - set(all_targets ${all_targets} ${out_targets}) - copy_if_different( - ${FMOD_SDK_DIR} - "${CMAKE_CURRENT_BINARY_DIR}/RelWithDbgInfo" - out_targets - ${fmod_files} - ) - set(all_targets ${all_targets} ${out_targets}) -endif (FMOD_SDK_DIR) - #******************************* # LLKDU set(internal_llkdu_path "${CMAKE_SOURCE_DIR}/llkdu") diff --git a/indra/cmake/FMOD.cmake b/indra/cmake/FMOD.cmake index 759b8f1340..dcf44cd642 100644 --- a/indra/cmake/FMOD.cmake +++ b/indra/cmake/FMOD.cmake @@ -1,64 +1,26 @@ # -*- cmake -*- -include(Linking) - -if(INSTALL_PROPRIETARY) - include(Prebuilt) - use_prebuilt_binary(fmod) -endif(INSTALL_PROPRIETARY) - -find_library(FMOD_LIBRARY_RELEASE - NAMES fmod fmodvc fmod-3.75 - PATHS - ${ARCH_PREBUILT_DIRS_RELEASE} - ) - -find_library(FMOD_LIBRARY_DEBUG - NAMES fmod fmodvc fmod-3.75 - PATHS - ${ARCH_PREBUILT_DIRS_DEBUG} - ) - -if (FMOD_LIBRARY_RELEASE AND FMOD_LIBRARY_DEBUG) - set(FMOD_LIBRARY - debug ${FMOD_LIBRARY_DEBUG} - optimized ${FMOD_LIBRARY_RELEASE}) -elseif (FMOD_LIBRARY_RELEASE) - set(FMOD_LIBRARY ${FMOD_LIBRARY_RELEASE}) -endif (FMOD_LIBRARY_RELEASE AND FMOD_LIBRARY_DEBUG) - -if (NOT FMOD_LIBRARY) - set(FMOD_SDK_DIR CACHE PATH "Path to the FMOD SDK.") - if (FMOD_SDK_DIR) - find_library(FMOD_LIBRARY - NAMES fmodvc fmod-3.75 fmod - PATHS - ${FMOD_SDK_DIR}/api/lib - ${FMOD_SDK_DIR}/api - ${FMOD_SDK_DIR}/lib - ${FMOD_SDK_DIR} - ) - endif (FMOD_SDK_DIR) -endif (NOT FMOD_LIBRARY) - -find_path(FMOD_INCLUDE_DIR fmod.h - ${LIBS_PREBUILT_DIR}/include - ${FMOD_SDK_DIR}/api/inc - ${FMOD_SDK_DIR}/inc - ${FMOD_SDK_DIR} - ) - -if (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) - set(FMOD ON CACHE BOOL "Use closed source FMOD sound library.") -else (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) - set(FMOD_LIBRARY "") - set(FMOD_INCLUDE_DIR "") - if (FMOD) - message(STATUS "No support for FMOD audio (need to set FMOD_SDK_DIR?)") - endif (FMOD) - set(FMOD OFF CACHE BOOL "Use closed source FMOD sound library.") -endif (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) +set(FMOD ON CACHE BOOL "Use FMOD sound library.") if (FMOD) - message(STATUS "Building with FMOD audio support") + if (STANDALONE) + set(FMOD_FIND_REQUIRED ON) + include(FindFMOD) + else (STANDALONE) + if (INSTALL_PROPRIETARY) + include(Prebuilt) + use_prebuilt_binary(fmod) + endif (INSTALL_PROPRIETARY) + + if (WINDOWS) + set(FMOD_LIBRARY fmod) + elseif (DARWIN) + set(FMOD_LIBRARY fmod) + elseif (LINUX) + set(FMOD_LIBRARY fmod-3.75) + endif (WINDOWS) + + SET(FMOD_LIBRARIES ${FMOD_LIBRARY}) + set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) + endif (STANDALONE) endif (FMOD) diff --git a/indra/cmake/FindFMOD.cmake b/indra/cmake/FindFMOD.cmake new file mode 100644 index 0000000000..e60b386027 --- /dev/null +++ b/indra/cmake/FindFMOD.cmake @@ -0,0 +1,44 @@ +# -*- cmake -*- + +# - Find FMOD +# Find the FMOD includes and library +# This module defines +# FMOD_INCLUDE_DIR, where to find fmod.h and fmod_errors.h +# FMOD_LIBRARIES, the libraries needed to use FMOD. +# FMOD, If false, do not try to use FMOD. +# also defined, but not for general use are +# FMOD_LIBRARY, where to find the FMOD library. + +FIND_PATH(FMOD_INCLUDE_DIR fmod.h PATH_SUFFIXES fmod) + +SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmod-3.75) +FIND_LIBRARY(FMOD_LIBRARY + NAMES ${FMOD_NAMES} + PATH_SUFFIXES fmod + ) + +IF (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) + SET(FMOD_LIBRARIES ${FMOD_LIBRARY}) + SET(FMOD_FOUND "YES") +ELSE (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) + SET(FMOD_FOUND "NO") +ENDIF (FMOD_LIBRARY AND FMOD_INCLUDE_DIR) + +IF (FMOD_FOUND) + IF (NOT FMOD_FIND_QUIETLY) + MESSAGE(STATUS "Found FMOD: ${FMOD_LIBRARIES}") + ENDIF (NOT FMOD_FIND_QUIETLY) +ELSE (FMOD_FOUND) + IF (FMOD_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find FMOD library") + ENDIF (FMOD_FIND_REQUIRED) +ENDIF (FMOD_FOUND) + +# Deprecated declarations. +SET (NATIVE_FMOD_INCLUDE_PATH ${FMOD_INCLUDE_DIR} ) +GET_FILENAME_COMPONENT (NATIVE_FMOD_LIB_PATH ${FMOD_LIBRARY} PATH) + +MARK_AS_ADVANCED( + FMOD_LIBRARY + FMOD_INCLUDE_DIR + ) diff --git a/indra/cmake/FindGoogleBreakpad.cmake b/indra/cmake/FindGoogleBreakpad.cmake new file mode 100644 index 0000000000..1a0493be5e --- /dev/null +++ b/indra/cmake/FindGoogleBreakpad.cmake @@ -0,0 +1,40 @@ +# -*- cmake -*- + +# - Find Google BreakPad +# Find the Google BreakPad includes and library +# This module defines +# BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR, where to find exception_handler.h, etc. +# BREAKPAD_EXCEPTION_HANDLER_LIBRARIES, the libraries needed to use Google BreakPad. +# BREAKPAD_EXCEPTION_HANDLER_FOUND, If false, do not try to use Google BreakPad. +# also defined, but not for general use are +# BREAKPAD_EXCEPTION_HANDLER_LIBRARY, where to find the Google BreakPad library. + +FIND_PATH(BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR google_breakpad/exception_handler.h) + +SET(BREAKPAD_EXCEPTION_HANDLER_NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} breakpad_client) +FIND_LIBRARY(BREAKPAD_EXCEPTION_HANDLER_LIBRARY + NAMES ${BREAKPAD_EXCEPTION_HANDLER_NAMES} + ) + +IF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + SET(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES ${BREAKPAD_EXCEPTION_HANDLER_LIBRARY}) + SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "YES") +ELSE (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + SET(BREAKPAD_EXCEPTION_HANDLER_FOUND "NO") +ENDIF (BREAKPAD_EXCEPTION_HANDLER_LIBRARY AND BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR) + + +IF (BREAKPAD_EXCEPTION_HANDLER_FOUND) + IF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) + MESSAGE(STATUS "Found Google BreakPad: ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}") + ENDIF (NOT BREAKPAD_EXCEPTION_HANDLER_FIND_QUIETLY) +ELSE (BREAKPAD_EXCEPTION_HANDLER_FOUND) + IF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Google BreakPad library") + ENDIF (BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED) +ENDIF (BREAKPAD_EXCEPTION_HANDLER_FOUND) + +MARK_AS_ADVANCED( + BREAKPAD_EXCEPTION_HANDLER_LIBRARY + BREAKPAD_EXCEPTION_HANDLER_INCLUDE_DIR + ) diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake index 8270c0fabb..7498674042 100644 --- a/indra/cmake/GoogleBreakpad.cmake +++ b/indra/cmake/GoogleBreakpad.cmake @@ -2,8 +2,8 @@ include(Prebuilt) if (STANDALONE) - MESSAGE(FATAL_ERROR "*TODO standalone support for google breakad is unimplemented") - # *TODO - implement this include(FindGoogleBreakpad) + set(BREAKPAD_EXCEPTION_HANDLER_FIND_REQUIRED ON) + include(FindGoogleBreakpad) else (STANDALONE) use_prebuilt_binary(google_breakpad) if (DARWIN) diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index a6a7989955..79c3bb7da2 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -256,6 +256,10 @@ MACRO(SET_TEST_PATH LISTVAR) set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib) ELSE(WINDOWS) # Linux uses a single staging directory anyway. - set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib) + IF (STANDALONE) + set(${LISTVAR} ${CMAKE_BINARY_DIR}/llcommon /usr/lib /usr/local/lib) + ELSE (STANDALONE) + set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib) + ENDIF (STANDALONE) ENDIF(WINDOWS) ENDMACRO(SET_TEST_PATH) diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake index f8087a8083..e918de0198 100644 --- a/indra/cmake/PulseAudio.cmake +++ b/indra/cmake/PulseAudio.cmake @@ -1,28 +1,28 @@ # -*- cmake -*- include(Prebuilt) -if (STANDALONE) - include(FindPkgConfig) +set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.") - pkg_check_modules(PULSEAUDIO REQUIRED libpulse-mainloop-glib) +if (PULSEAUDIO) + if (STANDALONE) + include(FindPkgConfig) + + pkg_check_modules(PULSEAUDIO libpulse) -elseif (LINUX) - use_prebuilt_binary(pulseaudio) - set(PULSEAUDIO_FOUND ON FORCE BOOL) - set(PULSEAUDIO_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include + elseif (LINUX) + use_prebuilt_binary(pulseaudio) + set(PULSEAUDIO_FOUND ON FORCE BOOL) + set(PULSEAUDIO_INCLUDE_DIRS + ${LIBS_PREBUILT_DIR}/include + ) + # We don't need to explicitly link against pulseaudio itself, because + # the viewer probes for the system's copy at runtime. + set(PULSEAUDIO_LIBRARIES + # none needed! ) - # We don't need to explicitly link against pulseaudio itself, because - # the viewer probes for the system's copy at runtime. - set(PULSEAUDIO_LIBRARIES - # none needed! - ) -endif (STANDALONE) + endif (STANDALONE) +endif (PULSEAUDIO) if (PULSEAUDIO_FOUND) - set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.") -endif (PULSEAUDIO_FOUND) - -if (PULSEAUDIO) add_definitions(-DLL_PULSEAUDIO_ENABLED=1) -endif (PULSEAUDIO) +endif (PULSEAUDIO_FOUND) diff --git a/indra/cmake/Python.cmake b/indra/cmake/Python.cmake index 0901c1b7a2..748c8c2bec 100644 --- a/indra/cmake/Python.cmake +++ b/indra/cmake/Python.cmake @@ -9,10 +9,12 @@ if (WINDOWS) NAMES python25.exe python23.exe python.exe NO_DEFAULT_PATH # added so that cmake does not find cygwin python PATHS + [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\2.3\\InstallPath] + [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.7\\InstallPath] [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.6\\InstallPath] [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.5\\InstallPath] [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\2.4\\InstallPath] diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake index fa4e387dd5..90d58d93ad 100644 --- a/indra/cmake/TemplateCheck.cmake +++ b/indra/cmake/TemplateCheck.cmake @@ -7,8 +7,9 @@ macro (check_message_template _target) TARGET ${_target} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} - ARGS ${SCRIPTS_DIR}/template_verifier.py - --mode=development --cache_master - COMMENT "Verifying message template" + ARGS ${SCRIPTS_DIR}/md5check.py + 3f19d130400c547de36278a6b6f9b028 + ${SCRIPTS_DIR}/messages/message_template.msg + COMMENT "Verifying message template - See http://wiki.secondlife.com/wiki/Template_verifier.py" ) endmacro (check_message_template) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index bfaf3f4f26..5dc0cabf03 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -54,19 +54,20 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(LINUX ON BOOl FORCE) # If someone has specified a word size, use that to determine the - # architecture. Otherwise, let the architecture specify the word size. + # architecture. Otherwise, let the compiler specify the word size. + # Using uname will break under chroots and other cross arch compiles. RC if (WORD_SIZE EQUAL 32) set(ARCH i686) elseif (WORD_SIZE EQUAL 64) set(ARCH x86_64) else (WORD_SIZE EQUAL 32) - execute_process(COMMAND uname -m COMMAND sed s/i.86/i686/ - OUTPUT_VARIABLE ARCH OUTPUT_STRIP_TRAILING_WHITESPACE) - if (ARCH STREQUAL x86_64) - set(WORD_SIZE 64) - else (ARCH STREQUAL x86_64) + if(CMAKE_SIZEOF_VOID_P MATCHES 4) + set(ARCH i686) set(WORD_SIZE 32) - endif (ARCH STREQUAL x86_64) + else(CMAKE_SIZEOF_VOID_P MATCHES 4) + set(ARCH x86_64) + set(WORD_SIZE 64) + endif(CMAKE_SIZEOF_VOID_P MATCHES 4) endif (WORD_SIZE EQUAL 32) set(LL_ARCH ${ARCH}_linux) @@ -86,7 +87,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if (NOT CMAKE_OSX_DEPLOYMENT_TARGET) # NOTE: setting -isysroot is NOT adequate: http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00696.html # see http://public.kitware.com/Bug/view.php?id=9959 + poppy - set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk) + set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.5.sdk) set(CMAKE_OSX_DEPLOYMENT_TARGET 10.4) endif (NOT CMAKE_OSX_DEPLOYMENT_TARGET) diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 32c4bc81df..df013b1665 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -3,7 +3,7 @@ include(Prebuilt) if (NOT STANDALONE) use_prebuilt_binary(libuuid) - use_prebuilt_binary(vivox) + use_prebuilt_binary(slvoice) use_prebuilt_binary(fontconfig) endif(NOT STANDALONE) diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py index e377aeef48..37aa75e364 100644 --- a/indra/cmake/run_build_test.py +++ b/indra/cmake/run_build_test.py @@ -24,7 +24,7 @@ myprog somearg otherarg $LicenseInfo:firstyear=2009&license=viewerlgpl$ Second Life Viewer Source Code -Copyright (C) 2010, Linden Research, Inc. +Copyright (C) 2009-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 diff --git a/indra/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index 713b82509e..c34115ee80 100644 --- a/indra/integration_tests/llui_libtest/llui_libtest.cpp +++ b/indra/integration_tests/llui_libtest/llui_libtest.cpp @@ -174,7 +174,7 @@ void export_test_floaters() std::string delim = gDirUtilp->getDirDelimiter(); std::string xui_dir = get_xui_dir() + "en" + delim; std::string filename; - while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename, false)) + while (gDirUtilp->getNextFileInDir(xui_dir, "floater_test_*.xml", filename)) { if (filename.find("_new.xml") != std::string::npos) { @@ -185,10 +185,9 @@ void export_test_floaters() // Build a floater and output new attributes LLXMLNodePtr output_node = new LLXMLNode(); LLFloater* floater = new LLFloater(LLSD()); - LLUICtrlFactory::getInstance()->buildFloater(floater, - filename, - // FALSE, // don't open floater - output_node); + floater->buildFromFile( filename, + // FALSE, // don't open floater + output_node); std::string out_filename = xui_dir + filename; std::string::size_type extension_pos = out_filename.rfind(".xml"); out_filename.resize(extension_pos); diff --git a/indra/integration_tests/llui_libtest/llwidgetreg.cpp b/indra/integration_tests/llui_libtest/llwidgetreg.cpp index b4921faece..0d0d9fbff6 100644 --- a/indra/integration_tests/llui_libtest/llwidgetreg.cpp +++ b/indra/integration_tests/llui_libtest/llwidgetreg.cpp @@ -78,7 +78,7 @@ void LLWidgetReg::initClass(bool register_widgets) LLDefaultChildRegistry::Register<LLMultiSlider> multi_slider_bar("multi_slider_bar"); LLDefaultChildRegistry::Register<LLMultiSliderCtrl> multi_slider("multi_slider"); LLDefaultChildRegistry::Register<LLPanel> panel("panel", &LLPanel::fromXML); - LLDefaultChildRegistry::Register<LLLayoutStack> layout_stack("layout_stack", &LLLayoutStack::fromXML); + LLDefaultChildRegistry::Register<LLLayoutStack> layout_stack("layout_stack"); LLDefaultChildRegistry::Register<LLProgressBar> progress_bar("progress_bar"); LLDefaultChildRegistry::Register<LLRadioGroup> radio_group("radio_group"); LLDefaultChildRegistry::Register<LLSearchEditor> search_editor("search_editor"); diff --git a/indra/lib/python/indra/__init__.py b/indra/lib/python/indra/__init__.py index e010741c1c..0c5053cf49 100644 --- a/indra/lib/python/indra/__init__.py +++ b/indra/lib/python/indra/__init__.py @@ -4,7 +4,7 @@ $LicenseInfo:firstyear=2006&license=viewerlgpl$ Second Life Viewer Source Code -Copyright (C) 2010, Linden Research, Inc. +Copyright (C) 2006-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 diff --git a/indra/lib/python/indra/util/named_query.py b/indra/lib/python/indra/util/named_query.py index 5c19368240..6bf956107d 100644 --- a/indra/lib/python/indra/util/named_query.py +++ b/indra/lib/python/indra/util/named_query.py @@ -36,14 +36,6 @@ import os.path import re import time -#import sys # *TODO: remove. only used in testing. -#import pprint # *TODO: remove. only used in testing. - -try: - set = set -except NameError: - from sets import Set as set - from indra.base import llsd from indra.base import config @@ -195,8 +187,6 @@ class NamedQuery(object): style. It also has to look for %:name% and :name% and ready them for use in LIKE statements""" if sql: - #print >>sys.stderr, "sql:",sql - # This first sub is to properly escape any % signs that # are meant to be literally passed through to mysql in the # query. It leaves any %'s that are used for @@ -408,7 +398,6 @@ class NamedQuery(object): # build the query from the options available and the params base_query = [] base_query.append(self._base_query) - #print >>sys.stderr, "base_query:",base_query for opt, extra_where in self._options.items(): if type(extra_where) in (dict, list, tuple): if opt in params: @@ -418,7 +407,6 @@ class NamedQuery(object): base_query.append(extra_where) if self._query_suffix: base_query.append(self._query_suffix) - #print >>sys.stderr, "base_query:",base_query full_query = '\n'.join(base_query) # Go through the query and rewrite all of the ones with the diff --git a/indra/lib/python/uuid.py b/indra/lib/python/uuid.py index 48dac84377..0bc21a35f8 100644 --- a/indra/lib/python/uuid.py +++ b/indra/lib/python/uuid.py @@ -446,8 +446,14 @@ def uuid1(node=None, clock_seq=None): def uuid3(namespace, name): """Generate a UUID from the MD5 hash of a namespace UUID and a name.""" - import md5 - hash = md5.md5(namespace.bytes + name).digest() + try: + # Python 2.6 + from hashlib import md5 + except ImportError: + # Python 2.5 and earlier + from md5 import new as md5 + + hash = md5(namespace.bytes + name).digest() return UUID(bytes=hash[:16], version=3) def uuid4(): diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp index be4d810860..23c34e52e7 100644 --- a/indra/linux_updater/linux_updater.cpp +++ b/indra/linux_updater/linux_updater.cpp @@ -216,7 +216,7 @@ gboolean rotate_image_cb(gpointer data) std::string next_image_filename(std::string& image_path) { std::string image_filename; - gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename, true); + gDirUtilp->getNextFileInDir(image_path, "/*.jpg", image_filename); return image_path + "/" + image_filename; } diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index e869b9717c..21ec622819 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -14,7 +14,6 @@ include(LLVFS) include_directories( ${LLAUDIO_INCLUDE_DIRS} - ${FMOD_INCLUDE_DIR} ${LLCOMMON_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLMESSAGE_INCLUDE_DIRS} @@ -45,6 +44,10 @@ set(llaudio_HEADER_FILES ) if (FMOD) + include_directories( + ${FMOD_INCLUDE_DIR} + ) + list(APPEND llaudio_SOURCE_FILES llaudioengine_fmod.cpp lllistener_fmod.cpp diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index 8843acc891..1cc03bddb8 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -97,6 +97,7 @@ void LLAudioEngine::setDefaults() } mMasterGain = 1.f; + mInternalGain = 0.f; mNextWindUpdate = 0.f; mStreamingAudioImpl = NULL; @@ -247,15 +248,6 @@ void LLAudioEngine::idle(F32 max_decode_time) // Primarily does position updating, cleanup of unused audio sources. // Also does regeneration of the current priority of each audio source. - if (getMuted()) - { - setInternalGain(0.f); - } - else - { - setInternalGain(getMasterGain()); - } - S32 i; for (i = 0; i < MAX_BUFFERS; i++) { @@ -284,6 +276,12 @@ void LLAudioEngine::idle(F32 max_decode_time) continue; } + if (sourcep->isMuted()) + { + ++iter; + continue; + } + if (!sourcep->getChannel() && sourcep->getCurrentBuffer()) { // We could potentially play this sound if its priority is high enough. @@ -336,9 +334,9 @@ void LLAudioEngine::idle(F32 max_decode_time) // attached to each channel, since only those with active channels // can have anything interesting happen with their queue? (Maybe not true) LLAudioSource *sourcep = iter->second; - if (!sourcep->mQueuedDatap) + if (!sourcep->mQueuedDatap || sourcep->isMuted()) { - // Nothing queued, so we don't care. + // Muted, or nothing queued, so we don't care. continue; } @@ -418,6 +416,10 @@ void LLAudioEngine::idle(F32 max_decode_time) for (iter = mAllSources.begin(); iter != mAllSources.end(); ++iter) { LLAudioSource *sourcep = iter->second; + if (sourcep->isMuted()) + { + continue; + } if (sourcep->isSyncMaster()) { if (sourcep->getPriority() > max_sm_priority) @@ -691,15 +693,23 @@ bool LLAudioEngine::isWindEnabled() void LLAudioEngine::setMuted(bool muted) { - mMuted = muted; + if (muted != mMuted) + { + mMuted = muted; + setMasterGain(mMasterGain); + } enableWind(!mMuted); } - void LLAudioEngine::setMasterGain(const F32 gain) { mMasterGain = gain; - setInternalGain(gain); + F32 internal_gain = getMuted() ? 0.f : gain; + if (internal_gain != mInternalGain) + { + mInternalGain = internal_gain; + setInternalGain(mInternalGain); + } } F32 LLAudioEngine::getMasterGain() @@ -1243,13 +1253,14 @@ LLAudioSource::LLAudioSource(const LLUUID& id, const LLUUID& owner_id, const F32 mOwnerID(owner_id), mPriority(0.f), mGain(gain), - mType(type), + mSourceMuted(false), mAmbient(false), mLoop(false), mSyncMaster(false), mSyncSlave(false), mQueueSounds(false), mPlayedOnce(false), + mType(type), mChannelp(NULL), mCurrentDatap(NULL), mQueuedDatap(NULL) @@ -1301,6 +1312,10 @@ void LLAudioSource::updatePriority() { mPriority = 1.f; } + else if (isMuted()) + { + mPriority = 0.f; + } else { // Priority is based on distance @@ -1349,25 +1364,33 @@ bool LLAudioSource::setupChannel() bool LLAudioSource::play(const LLUUID &audio_uuid) { + // Special abuse of play(); don't play a sound, but kill it. if (audio_uuid.isNull()) { if (getChannel()) { getChannel()->setSource(NULL); setChannel(NULL); - addAudioData(NULL, true); + if (!isMuted()) + { + mCurrentDatap = NULL; + } } + return false; } + // Reset our age timeout if someone attempts to play the source. mAgeTimer.reset(); LLAudioData *adp = gAudiop->getAudioData(audio_uuid); - - bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid); - - addAudioData(adp); + if (isMuted()) + { + return false; + } + + bool has_buffer = gAudiop->updateBufferForData(adp, audio_uuid); if (!has_buffer) { // Don't bother trying to set up a channel or anything, we don't have an audio buffer. @@ -1392,10 +1415,11 @@ bool LLAudioSource::play(const LLUUID &audio_uuid) } -bool LLAudioSource::isDone() +bool LLAudioSource::isDone() const { const F32 MAX_AGE = 60.f; const F32 MAX_UNPLAYED_AGE = 15.f; + const F32 MAX_MUTED_AGE = 11.f; if (isLoop()) { @@ -1403,7 +1427,6 @@ bool LLAudioSource::isDone() return false; } - if (hasPendingPreloads()) { return false; @@ -1420,10 +1443,10 @@ bool LLAudioSource::isDone() // This is a single-play source if (!mChannelp) { - if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce) + if ((elapsed > (mSourceMuted ? MAX_MUTED_AGE : MAX_UNPLAYED_AGE)) || mPlayedOnce) { // We don't have a channel assigned, and it's been - // over 5 seconds since we tried to play it. Don't bother. + // over 15 seconds since we tried to play it. Don't bother. //llinfos << "No channel assigned, source is done" << llendl; return true; } @@ -1449,7 +1472,7 @@ bool LLAudioSource::isDone() if ((elapsed > MAX_UNPLAYED_AGE) || mPlayedOnce) { - // The sound isn't playing back after 5 seconds or we're already done playing it, kill it. + // The sound isn't playing back after 15 seconds or we're already done playing it, kill it. return true; } diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h index 6a5000d7ed..30d2490635 100644 --- a/indra/llaudio/llaudioengine.h +++ b/indra/llaudio/llaudioengine.h @@ -118,8 +118,8 @@ public: // Use these for temporarily muting the audio system. // Does not change buffers, initialization, etc. but // stops playing new sounds. - virtual void setMuted(bool muted); - virtual bool getMuted() const { return mMuted; } + void setMuted(bool muted); + bool getMuted() const { return mMuted; } #ifdef USE_PLUGIN_MEDIA LLPluginClassMedia* initializeMedia(const std::string& media_type); #endif @@ -239,6 +239,7 @@ protected: LLAudioBuffer *mBuffers[MAX_BUFFERS]; F32 mMasterGain; + F32 mInternalGain; // Actual gain set; either mMasterGain or 0 when mMuted is true. F32 mSecondaryGain[AUDIO_TYPE_COUNT]; F32 mNextWindUpdate; @@ -303,7 +304,8 @@ public: virtual void setGain(const F32 gain) { mGain = llclamp(gain, 0.f, 1.f); } const LLUUID &getID() const { return mID; } - bool isDone(); + bool isDone() const; + bool isMuted() const { return mSourceMuted; } LLAudioData *getCurrentData(); LLAudioData *getQueuedData(); @@ -325,6 +327,7 @@ protected: LLUUID mOwnerID; // owner of the object playing the sound F32 mPriority; F32 mGain; + bool mSourceMuted; bool mAmbient; bool mLoop; bool mSyncMaster; diff --git a/indra/llaudio/llvorbisencode.cpp b/indra/llaudio/llvorbisencode.cpp index 9f479189d7..0e0c80a456 100644 --- a/indra/llaudio/llvorbisencode.cpp +++ b/indra/llaudio/llvorbisencode.cpp @@ -120,6 +120,13 @@ S32 check_for_invalid_wav_formats(const std::string& in_fname, std::string& erro + ((U32) wav_header[5] << 8) + wav_header[4]; + if (chunk_length > physical_file_size - file_pos - 4) + { + infile.close(); + error_msg = "SoundFileInvalidChunkSize"; + return(LLVORBISENC_CHUNK_SIZE_ERR); + } + // llinfos << "chunk found: '" << wav_header[0] << wav_header[1] << wav_header[2] << wav_header[3] << "'" << llendl; if (!(strncmp((char *)&(wav_header[0]),"fmt ",4))) diff --git a/indra/llaudio/llvorbisencode.h b/indra/llaudio/llvorbisencode.h index d33aacf1ea..6b22a2cb59 100644 --- a/indra/llaudio/llvorbisencode.h +++ b/indra/llaudio/llvorbisencode.h @@ -38,6 +38,7 @@ const S32 LLVORBISENC_MULTICHANNEL_ERR = 7; // can't do stereo const S32 LLVORBISENC_UNSUPPORTED_SAMPLE_RATE = 8; // unsupported sample rate const S32 LLVORBISENC_UNSUPPORTED_WORD_SIZE = 9; // unsupported word size const S32 LLVORBISENC_CLIP_TOO_LONG = 10; // source file is too long +const S32 LLVORBISENC_CHUNK_SIZE_ERR = 11; // chunk size is wrong const F32 LLVORBIS_CLIP_MAX_TIME = 10.0f; const U8 LLVORBIS_CLIP_MAX_CHANNELS = 2; diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 2a036df06e..478f2fedbd 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -33,6 +33,7 @@ set(llcommon_SOURCE_FILES llapp.cpp llapr.cpp llassettype.cpp + llavatarname.cpp llbase32.cpp llbase64.cpp llcommon.cpp @@ -69,6 +70,7 @@ set(llcommon_SOURCE_FILES llmemorystream.cpp llmemtype.cpp llmetrics.cpp + llmetricperformancetester.cpp llmortician.cpp lloptioninterface.cpp llptrto.cpp @@ -115,6 +117,7 @@ set(llcommon_HEADER_FILES llallocator.h llallocator_heap_profile.h llagentconstants.h + llavatarname.h llapp.h llapr.h llassettype.h @@ -157,6 +160,7 @@ set(llcommon_HEADER_FILES lleventemitter.h llextendedstatus.h llfasttimer.h + llfasttimer_class.h llfile.h llfindlocale.h llfixedbuffer.h @@ -183,6 +187,7 @@ set(llcommon_HEADER_FILES llmemorystream.h llmemtype.h llmetrics.h + llmetricperformancetester.h llmortician.h llnametable.h lloptioninterface.h @@ -251,8 +256,15 @@ set_source_files_properties(${llcommon_HEADER_FILES} list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) if(LLCOMMON_LINK_SHARED) - add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) - ll_stage_sharedlib(llcommon) + add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) + if(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + add_definitions(/FIXED:NO) + else(WINDOWS) # not windows therefore gcc LINUX and DARWIN + add_definitions(-fPIC) + endif(WINDOWS) + endif(NOT WORD_SIZE EQUAL 32) + ll_stage_sharedlib(llcommon) else(LLCOMMON_LINK_SHARED) add_library (llcommon ${llcommon_SOURCE_FILES}) endif(LLCOMMON_LINK_SHARED) diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp index eebd5ed0a6..39daefd1ad 100644 --- a/indra/llcommon/llapp.cpp +++ b/indra/llcommon/llapp.cpp @@ -90,6 +90,10 @@ S32 LL_HEARTBEAT_SIGNAL = (SIGRTMAX >= 0) ? (SIGRTMAX-0) : SIGUSR2; // the static application instance LLApp* LLApp::sApplication = NULL; +// Allows the generation of core files for post mortem under gdb +// and disables crashlogger +BOOL LLApp::sDisableCrashlogger = FALSE; + // Local flag for whether or not to do logging in signal handlers. //static BOOL LLApp::sLogInSignal = FALSE; @@ -461,11 +465,30 @@ bool LLApp::isQuitting() return (APP_STATUS_QUITTING == sStatus); } +// static bool LLApp::isExiting() { return isQuitting() || isError(); } +void LLApp::disableCrashlogger() +{ + // Disable Breakpad exception handler. + if (mExceptionHandler != 0) + { + delete mExceptionHandler; + mExceptionHandler = 0; + } + + sDisableCrashlogger = TRUE; +} + +// static +bool LLApp::isCrashloggerDisabled() +{ + return (sDisableCrashlogger == TRUE); +} + #if !LL_WINDOWS // static U32 LLApp::getSigChildCount() @@ -799,6 +822,15 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *) { llwarns << "Signal handler - Flagging error status and waiting for shutdown" << llendl; } + + if (LLApp::isCrashloggerDisabled()) // Don't gracefully handle any signal, crash and core for a gdb post mortem + { + clear_signals(); + llwarns << "Fatal signal received, not handling the crash here, passing back to operating system" << llendl; + raise(signum); + return; + } + // Flag status to ERROR, so thread_error does its work. LLApp::setError(); // Block in the signal handler until somebody says that we're done. diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index ee1d696829..a536a06ea5 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -189,6 +189,11 @@ public: // virtual bool mainLoop() = 0; // Override for the application main loop. Needs to at least gracefully notice the QUITTING state and exit. + // + // Crash logging + // + void disableCrashlogger(); // Let the OS handle the crashes + static bool isCrashloggerDisabled(); // Get the here above set value // // Application status @@ -280,6 +285,7 @@ protected: static void setStatus(EAppStatus status); // Use this to change the application status. static EAppStatus sStatus; // Reflects current application status static BOOL sErrorThreadRunning; // Set while the error thread is running + static BOOL sDisableCrashlogger; // Let the OS handle crashes for us. #if !LL_WINDOWS static LLAtomicU32* sSigChildCount; // Number of SIGCHLDs received. diff --git a/indra/llcommon/llavatarname.cpp b/indra/llcommon/llavatarname.cpp new file mode 100644 index 0000000000..b1ec9e9875 --- /dev/null +++ b/indra/llcommon/llavatarname.cpp @@ -0,0 +1,113 @@ +/** + * @file llavatarname.cpp + * @brief Represents name-related data for an avatar, such as the + * username/SLID ("bobsmith123" or "james.linden") and the display + * name ("James Cook") + * + * $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 "linden_common.h" + +#include "llavatarname.h" + +#include "lldate.h" +#include "llsd.h" + +// Store these in pre-built std::strings to avoid memory allocations in +// LLSD map lookups +static const std::string USERNAME("username"); +static const std::string DISPLAY_NAME("display_name"); +static const std::string LEGACY_FIRST_NAME("legacy_first_name"); +static const std::string LEGACY_LAST_NAME("legacy_last_name"); +static const std::string IS_DISPLAY_NAME_DEFAULT("is_display_name_default"); +static const std::string DISPLAY_NAME_EXPIRES("display_name_expires"); +static const std::string DISPLAY_NAME_NEXT_UPDATE("display_name_next_update"); + +LLAvatarName::LLAvatarName() +: mUsername(), + mDisplayName(), + mLegacyFirstName(), + mLegacyLastName(), + mIsDisplayNameDefault(false), + mIsDummy(false), + mExpires(F64_MAX), + mNextUpdate(0.0) +{ } + +bool LLAvatarName::operator<(const LLAvatarName& rhs) const +{ + if (mUsername == rhs.mUsername) + return mDisplayName < rhs.mDisplayName; + else + return mUsername < rhs.mUsername; +} + +LLSD LLAvatarName::asLLSD() const +{ + LLSD sd; + sd[USERNAME] = mUsername; + sd[DISPLAY_NAME] = mDisplayName; + sd[LEGACY_FIRST_NAME] = mLegacyFirstName; + sd[LEGACY_LAST_NAME] = mLegacyLastName; + sd[IS_DISPLAY_NAME_DEFAULT] = mIsDisplayNameDefault; + sd[DISPLAY_NAME_EXPIRES] = LLDate(mExpires); + sd[DISPLAY_NAME_NEXT_UPDATE] = LLDate(mNextUpdate); + return sd; +} + +void LLAvatarName::fromLLSD(const LLSD& sd) +{ + mUsername = sd[USERNAME].asString(); + mDisplayName = sd[DISPLAY_NAME].asString(); + mLegacyFirstName = sd[LEGACY_FIRST_NAME].asString(); + mLegacyLastName = sd[LEGACY_LAST_NAME].asString(); + mIsDisplayNameDefault = sd[IS_DISPLAY_NAME_DEFAULT].asBoolean(); + LLDate expires = sd[DISPLAY_NAME_EXPIRES]; + mExpires = expires.secondsSinceEpoch(); + LLDate next_update = sd[DISPLAY_NAME_NEXT_UPDATE]; + mNextUpdate = next_update.secondsSinceEpoch(); +} + +std::string LLAvatarName::getCompleteName() const +{ + std::string name; + if (!mUsername.empty()) + { + name = mDisplayName + " (" + mUsername + ")"; + } + else + { + // ...display names are off, legacy name is in mDisplayName + name = mDisplayName; + } + return name; +} + +std::string LLAvatarName::getLegacyName() const +{ + std::string name; + name.reserve( mLegacyFirstName.size() + 1 + mLegacyLastName.size() ); + name = mLegacyFirstName; + name += " "; + name += mLegacyLastName; + return name; +} diff --git a/indra/llcommon/llavatarname.h b/indra/llcommon/llavatarname.h new file mode 100644 index 0000000000..145aeccd35 --- /dev/null +++ b/indra/llcommon/llavatarname.h @@ -0,0 +1,95 @@ +/** + * @file llavatarname.h + * @brief Represents name-related data for an avatar, such as the + * username/SLID ("bobsmith123" or "james.linden") and the display + * name ("James Cook") + * + * $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 LLAVATARNAME_H +#define LLAVATARNAME_H + +#include <string> + +class LLSD; + +class LL_COMMON_API LLAvatarName +{ +public: + LLAvatarName(); + + bool operator<(const LLAvatarName& rhs) const; + + LLSD asLLSD() const; + + void fromLLSD(const LLSD& sd); + + // For normal names, returns "James Linden (james.linden)" + // When display names are disabled returns just "James Linden" + std::string getCompleteName() const; + + // Returns "James Linden" or "bobsmith123 Resident" for backwards + // compatibility with systems like voice and muting + // *TODO: Eliminate this in favor of username only + std::string getLegacyName() const; + + // "bobsmith123" or "james.linden", US-ASCII only + std::string mUsername; + + // "Jose' Sanchez" or "James Linden", UTF-8 encoded Unicode + // Contains data whether or not user has explicitly set + // a display name; may duplicate their username. + std::string mDisplayName; + + // For "James Linden", "James" + // For "bobsmith123", "bobsmith123" + // Used to communicate with legacy systems like voice and muting which + // rely on old-style names. + // *TODO: Eliminate this in favor of username only + std::string mLegacyFirstName; + + // For "James Linden", "Linden" + // For "bobsmith123", "Resident" + // see above for rationale + std::string mLegacyLastName; + + // If true, both display name and SLID were generated from + // a legacy first and last name, like "James Linden (james.linden)" + bool mIsDisplayNameDefault; + + // Under error conditions, we may insert "dummy" records with + // names like "???" into caches as placeholders. These can be + // shown in UI, but are not serialized. + bool mIsDummy; + + // Names can change, so need to keep track of when name was + // last checked. + // Unix time-from-epoch seconds for efficiency + F64 mExpires; + + // You can only change your name every N hours, so record + // when the next update is allowed + // Unix time-from-epoch seconds + F64 mNextUpdate; +}; + +#endif diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h index 52b85c7bba..87c2d6775b 100644 --- a/indra/llcommon/llchat.h +++ b/indra/llcommon/llchat.h @@ -28,7 +28,6 @@ #ifndef LL_LLCHAT_H #define LL_LLCHAT_H -#include "llstring.h" #include "lluuid.h" #include "v3math.h" @@ -71,7 +70,7 @@ typedef enum e_chat_style class LLChat { public: - LLChat(const std::string& text = LLStringUtil::null) + LLChat(const std::string& text = std::string()) : mText(text), mFromName(), mFromID(), diff --git a/indra/llcommon/lldarray.h b/indra/llcommon/lldarray.h index a8cd03b42a..131b819c99 100644 --- a/indra/llcommon/lldarray.h +++ b/indra/llcommon/lldarray.h @@ -51,7 +51,7 @@ public: LLDynamicArray(S32 size=0) : std::vector<Type>(size) { if (size < BlockSize) std::vector<Type>::reserve(BlockSize); } - void reset() { std::vector<Type>::resize(0); } + void reset() { std::vector<Type>::clear(); } // ACCESSORS const Type& get(S32 index) const { return std::vector<Type>::operator[](index); } diff --git a/indra/llcommon/lldictionary.h b/indra/llcommon/lldictionary.h index 552a805b70..bc3bc3e74a 100644 --- a/indra/llcommon/lldictionary.h +++ b/indra/llcommon/lldictionary.h @@ -78,7 +78,9 @@ protected: virtual Index notFound() const { // default is to assert - llassert(false); + // don't assert -- makes it impossible to work on mesh-development and viewer-development simultaneously + // -- davep 2010.10.29 + //llassert(false); return Index(-1); } void addEntry(Index index, Entry *entry) diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp index bc1ae37c2b..bce87ada96 100644 --- a/indra/llcommon/llfasttimer_class.cpp +++ b/indra/llcommon/llfasttimer_class.cpp @@ -56,6 +56,7 @@ bool LLFastTimer::sPauseHistory = 0; bool LLFastTimer::sResetHistory = 0; LLFastTimer::CurTimerData LLFastTimer::sCurTimerData; BOOL LLFastTimer::sLog = FALSE; +std::string LLFastTimer::sLogName = ""; BOOL LLFastTimer::sMetricLog = FALSE; LLMutex* LLFastTimer::sLogLock = NULL; std::queue<LLSD> LLFastTimer::sLogQueue; @@ -469,9 +470,9 @@ void LLFastTimer::NamedTimer::accumulateTimings() int hidx = cur_frame % HISTORY_NUM; timerp->mCountHistory[hidx] = timerp->mTotalTimeCounter; - timerp->mCountAverage = (timerp->mCountAverage * cur_frame + timerp->mTotalTimeCounter) / (cur_frame+1); + timerp->mCountAverage = ((U64)timerp->mCountAverage * cur_frame + timerp->mTotalTimeCounter) / (cur_frame+1); timerp->mCallHistory[hidx] = timerp->getFrameState().mCalls; - timerp->mCallAverage = (timerp->mCallAverage * cur_frame + timerp->getFrameState().mCalls) / (cur_frame+1); + timerp->mCallAverage = ((U64)timerp->mCallAverage * cur_frame + timerp->getFrameState().mCalls) / (cur_frame+1); } } } diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h index 1158ac5140..eb9789682b 100644 --- a/indra/llcommon/llfasttimer_class.h +++ b/indra/llcommon/llfasttimer_class.h @@ -211,6 +211,7 @@ public: static std::queue<LLSD> sLogQueue; static BOOL sLog; static BOOL sMetricLog; + static std::string sLogName; static bool sPauseHistory; static bool sResetHistory; static U64 sTimerCycles; diff --git a/indra/llcommon/llmetricperformancetester.cpp b/indra/llcommon/llmetricperformancetester.cpp new file mode 100644 index 0000000000..5fa3a5ea07 --- /dev/null +++ b/indra/llcommon/llmetricperformancetester.cpp @@ -0,0 +1,254 @@ +/** + * @file llmetricperformancetester.cpp + * @brief LLMetricPerformanceTesterBasic and LLMetricPerformanceTesterWithSession classes implementation + * + * $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 "linden_common.h" + +#include "indra_constants.h" +#include "llerror.h" +#include "llsdserialize.h" +#include "llstat.h" +#include "lltreeiterators.h" +#include "llmetricperformancetester.h" + +//---------------------------------------------------------------------------------------------- +// LLMetricPerformanceTesterBasic : static methods and testers management +//---------------------------------------------------------------------------------------------- + +LLMetricPerformanceTesterBasic::name_tester_map_t LLMetricPerformanceTesterBasic::sTesterMap ; + +/*static*/ +void LLMetricPerformanceTesterBasic::cleanClass() +{ + for (name_tester_map_t::iterator iter = sTesterMap.begin() ; iter != sTesterMap.end() ; ++iter) + { + delete iter->second ; + } + sTesterMap.clear() ; +} + +/*static*/ +BOOL LLMetricPerformanceTesterBasic::addTester(LLMetricPerformanceTesterBasic* tester) +{ + llassert_always(tester != NULL); + std::string name = tester->getTesterName() ; + if (getTester(name)) + { + llerrs << "Tester name is already used by some other tester : " << name << llendl ; + return FALSE; + } + + sTesterMap.insert(std::make_pair(name, tester)); + return TRUE; +} + +/*static*/ +LLMetricPerformanceTesterBasic* LLMetricPerformanceTesterBasic::getTester(std::string name) +{ + // Check for the requested metric name + name_tester_map_t::iterator found_it = sTesterMap.find(name) ; + if (found_it != sTesterMap.end()) + { + return found_it->second ; + } + return NULL ; +} + +/*static*/ +// Return TRUE if this metric is requested or if the general default "catch all" metric is requested +BOOL LLMetricPerformanceTesterBasic::isMetricLogRequested(std::string name) +{ + return (LLFastTimer::sMetricLog && ((LLFastTimer::sLogName == name) || (LLFastTimer::sLogName == DEFAULT_METRIC_NAME))); +} + + +//---------------------------------------------------------------------------------------------- +// LLMetricPerformanceTesterBasic : Tester instance methods +//---------------------------------------------------------------------------------------------- + +LLMetricPerformanceTesterBasic::LLMetricPerformanceTesterBasic(std::string name) : + mName(name), + mCount(0) +{ + if (mName == std::string()) + { + llerrs << "LLMetricPerformanceTesterBasic construction invalid : Empty name passed to constructor" << llendl ; + } + + mValidInstance = LLMetricPerformanceTesterBasic::addTester(this) ; +} + +LLMetricPerformanceTesterBasic::~LLMetricPerformanceTesterBasic() +{ +} + +void LLMetricPerformanceTesterBasic::preOutputTestResults(LLSD* sd) +{ + incrementCurrentCount() ; + (*sd)[getCurrentLabelName()]["Name"] = mName ; +} + +void LLMetricPerformanceTesterBasic::postOutputTestResults(LLSD* sd) +{ + LLMutexLock lock(LLFastTimer::sLogLock); + LLFastTimer::sLogQueue.push((*sd)); +} + +void LLMetricPerformanceTesterBasic::outputTestResults() +{ + LLSD sd; + + preOutputTestResults(&sd) ; + outputTestRecord(&sd) ; + postOutputTestResults(&sd) ; +} + +void LLMetricPerformanceTesterBasic::addMetric(std::string str) +{ + mMetricStrings.push_back(str) ; +} + +/*virtual*/ +void LLMetricPerformanceTesterBasic::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) +{ + resetCurrentCount() ; + + std::string current_label = getCurrentLabelName(); + BOOL in_base = (*base).has(current_label) ; + BOOL in_current = (*current).has(current_label) ; + + while(in_base || in_current) + { + LLSD::String label = current_label ; + + if(in_base && in_current) + { + *os << llformat("%s\n", label.c_str()) ; + + for(U32 index = 0 ; index < mMetricStrings.size() ; index++) + { + switch((*current)[label][ mMetricStrings[index] ].type()) + { + case LLSD::TypeInteger: + compareTestResults(os, mMetricStrings[index], + (S32)((*base)[label][ mMetricStrings[index] ].asInteger()), (S32)((*current)[label][ mMetricStrings[index] ].asInteger())) ; + break ; + case LLSD::TypeReal: + compareTestResults(os, mMetricStrings[index], + (F32)((*base)[label][ mMetricStrings[index] ].asReal()), (F32)((*current)[label][ mMetricStrings[index] ].asReal())) ; + break; + default: + llerrs << "unsupported metric " << mMetricStrings[index] << " LLSD type: " << (S32)(*current)[label][ mMetricStrings[index] ].type() << llendl ; + } + } + } + + incrementCurrentCount(); + current_label = getCurrentLabelName(); + in_base = (*base).has(current_label) ; + in_current = (*current).has(current_label) ; + } +} + +/*virtual*/ +void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) +{ + *os << llformat(" ,%s, %d, %d, %d, %.4f\n", metric_string.c_str(), v_base, v_current, + v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ; +} + +/*virtual*/ +void LLMetricPerformanceTesterBasic::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) +{ + *os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4f\n", metric_string.c_str(), v_base, v_current, + v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ; +} + +//---------------------------------------------------------------------------------------------- +// LLMetricPerformanceTesterWithSession +//---------------------------------------------------------------------------------------------- + +LLMetricPerformanceTesterWithSession::LLMetricPerformanceTesterWithSession(std::string name) : + LLMetricPerformanceTesterBasic(name), + mBaseSessionp(NULL), + mCurrentSessionp(NULL) +{ +} + +LLMetricPerformanceTesterWithSession::~LLMetricPerformanceTesterWithSession() +{ + if (mBaseSessionp) + { + delete mBaseSessionp ; + mBaseSessionp = NULL ; + } + if (mCurrentSessionp) + { + delete mCurrentSessionp ; + mCurrentSessionp = NULL ; + } +} + +/*virtual*/ +void LLMetricPerformanceTesterWithSession::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) +{ + // Load the base session + resetCurrentCount() ; + mBaseSessionp = loadTestSession(base) ; + + // Load the current session + resetCurrentCount() ; + mCurrentSessionp = loadTestSession(current) ; + + if (!mBaseSessionp || !mCurrentSessionp) + { + llerrs << "Error loading test sessions." << llendl ; + } + + // Compare + compareTestSessions(os) ; + + // Release memory + if (mBaseSessionp) + { + delete mBaseSessionp ; + mBaseSessionp = NULL ; + } + if (mCurrentSessionp) + { + delete mCurrentSessionp ; + mCurrentSessionp = NULL ; + } +} + + +//---------------------------------------------------------------------------------------------- +// LLTestSession +//---------------------------------------------------------------------------------------------- + +LLMetricPerformanceTesterWithSession::LLTestSession::~LLTestSession() +{ +} + diff --git a/indra/llcommon/llmetricperformancetester.h b/indra/llcommon/llmetricperformancetester.h new file mode 100644 index 0000000000..925010ac96 --- /dev/null +++ b/indra/llcommon/llmetricperformancetester.h @@ -0,0 +1,206 @@ +/** + * @file llmetricperformancetester.h + * @brief LLMetricPerformanceTesterBasic and LLMetricPerformanceTesterWithSession classes definition + * + * $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_METRICPERFORMANCETESTER_H +#define LL_METRICPERFORMANCETESTER_H + +const std::string DEFAULT_METRIC_NAME("metric"); + +/** + * @class LLMetricPerformanceTesterBasic + * @brief Performance Metric Base Class + */ +class LL_COMMON_API LLMetricPerformanceTesterBasic +{ +public: + /** + * @brief Creates a basic tester instance. + * @param[in] name - Unique string identifying this tester instance. + */ + LLMetricPerformanceTesterBasic(std::string name); + virtual ~LLMetricPerformanceTesterBasic(); + + /** + * @return Returns true if the instance has been added to the tester map. + * Need to be tested after creation of a tester instance so to know if the tester is correctly handled. + * A tester might not be added to the map if another tester with the same name already exists. + */ + BOOL isValid() const { return mValidInstance; } + + /** + * @brief Write a set of test results to the log LLSD. + */ + void outputTestResults() ; + + /** + * @brief Compare the test results. + * By default, compares the test results against the baseline one by one, item by item, + * in the increasing order of the LLSD record counter, starting from the first one. + */ + virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; + + /** + * @return Returns the number of the test metrics in this tester instance. + */ + S32 getNumberOfMetrics() const { return mMetricStrings.size() ;} + /** + * @return Returns the metric name at index + * @param[in] index - Index on the list of metrics managed by this tester instance. + */ + std::string getMetricName(S32 index) const { return mMetricStrings[index] ;} + +protected: + /** + * @return Returns the name of this tester instance. + */ + std::string getTesterName() const { return mName ;} + + /** + * @brief Insert a new metric to be managed by this tester instance. + * @param[in] str - Unique string identifying the new metric. + */ + void addMetric(std::string str) ; + + /** + * @brief Compare test results, provided in 2 flavors: compare integers and compare floats. + * @param[out] os - Formatted output string holding the compared values. + * @param[in] metric_string - Name of the metric. + * @param[in] v_base - Base value of the metric. + * @param[in] v_current - Current value of the metric. + */ + virtual void compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) ; + virtual void compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) ; + + /** + * @brief Reset internal record count. Count starts with 1. + */ + void resetCurrentCount() { mCount = 1; } + /** + * @brief Increment internal record count. + */ + void incrementCurrentCount() { mCount++; } + /** + * @return Returns the label to be used for the current count. It's "TesterName"-"Count". + */ + std::string getCurrentLabelName() const { return llformat("%s-%d", mName.c_str(), mCount) ;} + + /** + * @brief Write a test record to the LLSD. Implementers need to overload this method. + * @param[out] sd - The LLSD record to store metric data into. + */ + virtual void outputTestRecord(LLSD* sd) = 0 ; + +private: + void preOutputTestResults(LLSD* sd) ; + void postOutputTestResults(LLSD* sd) ; + + std::string mName ; // Name of this tester instance + S32 mCount ; // Current record count + BOOL mValidInstance; // TRUE if the instance is managed by the map + std::vector< std::string > mMetricStrings ; // Metrics strings + +// Static members managing the collection of testers +public: + // Map of all the tester instances in use + typedef std::map< std::string, LLMetricPerformanceTesterBasic* > name_tester_map_t; + static name_tester_map_t sTesterMap ; + + /** + * @return Returns a pointer to the tester + * @param[in] name - Name of the tester instance queried. + */ + static LLMetricPerformanceTesterBasic* getTester(std::string name) ; + + /** + * @return Returns TRUE if that metric *or* the default catch all metric has been requested to be logged + * @param[in] name - Name of the tester queried. + */ + static BOOL isMetricLogRequested(std::string name); + + /** + * @return Returns TRUE if there's a tester defined, FALSE otherwise. + */ + static BOOL hasMetricPerformanceTesters() { return !sTesterMap.empty() ;} + /** + * @brief Delete all testers and reset the tester map + */ + static void cleanClass() ; + +private: + // Add a tester to the map. Returns false if adding fails. + static BOOL addTester(LLMetricPerformanceTesterBasic* tester) ; +}; + +/** + * @class LLMetricPerformanceTesterWithSession + * @brief Performance Metric Class with custom session + */ +class LL_COMMON_API LLMetricPerformanceTesterWithSession : public LLMetricPerformanceTesterBasic +{ +public: + /** + * @param[in] name - Unique string identifying this tester instance. + */ + LLMetricPerformanceTesterWithSession(std::string name); + virtual ~LLMetricPerformanceTesterWithSession(); + + /** + * @brief Compare the test results. + * This will be loading the base and current sessions and compare them using the virtual + * abstract methods loadTestSession() and compareTestSessions() + */ + virtual void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; + +protected: + /** + * @class LLMetricPerformanceTesterWithSession::LLTestSession + * @brief Defines an interface for the two abstract virtual functions loadTestSession() and compareTestSessions() + */ + class LL_COMMON_API LLTestSession + { + public: + virtual ~LLTestSession() ; + }; + + /** + * @brief Convert an LLSD log into a test session. + * @param[in] log - The LLSD record + * @return Returns the record as a test session + */ + virtual LLMetricPerformanceTesterWithSession::LLTestSession* loadTestSession(LLSD* log) = 0; + + /** + * @brief Compare the base session and the target session. Assumes base and current sessions have been loaded. + * @param[out] os - The comparison result as a standard stream + */ + virtual void compareTestSessions(std::ofstream* os) = 0; + + LLTestSession* mBaseSessionp; + LLTestSession* mCurrentSessionp; +}; + +#endif + diff --git a/indra/llcommon/llprocesslauncher.cpp b/indra/llcommon/llprocesslauncher.cpp index 99308c94e7..81e5f8820d 100644 --- a/indra/llcommon/llprocesslauncher.cpp +++ b/indra/llcommon/llprocesslauncher.cpp @@ -58,6 +58,11 @@ void LLProcessLauncher::setWorkingDirectory(const std::string &dir) mWorkingDir = dir; } +const std::string& LLProcessLauncher::getExecutable() const +{ + return mExecutable; +} + void LLProcessLauncher::clearArguments() { mLaunchArguments.clear(); diff --git a/indra/llcommon/llprocesslauncher.h b/indra/llcommon/llprocesslauncher.h index 479aeb664a..954c249147 100644 --- a/indra/llcommon/llprocesslauncher.h +++ b/indra/llcommon/llprocesslauncher.h @@ -47,6 +47,8 @@ public: void setExecutable(const std::string &executable); void setWorkingDirectory(const std::string &dir); + const std::string& getExecutable() const; + void clearArguments(); void addArgument(const std::string &arg); void addArgument(const char *arg); diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index ae7e624a1a..f3b48b0156 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -731,14 +731,17 @@ void LLStringOps::setupDatetimeInfo (bool daylight) nowT = time (NULL); - tmpT = localtime (&nowT); - localT = mktime (tmpT); - tmpT = gmtime (&nowT); gmtT = mktime (tmpT); + tmpT = localtime (&nowT); + localT = mktime (tmpT); + sLocalTimeOffset = (long) (gmtT - localT); - + if (tmpT->tm_isdst) + { + sLocalTimeOffset -= 60 * 60; // 1 hour + } sPacificDaylightTime = daylight; sPacificTimeOffset = (sPacificDaylightTime? 7 : 8 ) * 60 * 60; diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp index 00c94404d4..10cdc7087b 100644 --- a/indra/llcommon/llsys.cpp +++ b/indra/llcommon/llsys.cpp @@ -635,6 +635,26 @@ U32 LLMemoryInfo::getPhysicalMemoryClamped() const } } +//static +void LLMemoryInfo::getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb) +{ +#if LL_WINDOWS + MEMORYSTATUSEX state; + state.dwLength = sizeof(state); + GlobalMemoryStatusEx(&state); + + avail_physical_mem_kb = (U32)(state.ullAvailPhys/1024) ; + avail_virtual_mem_kb = (U32)(state.ullAvailVirtual/1024) ; + +#else + //do not know how to collect available memory info for other systems. + //leave it blank here for now. + + avail_physical_mem_kb = -1 ; + avail_virtual_mem_kb = -1 ; +#endif +} + void LLMemoryInfo::stream(std::ostream& s) const { #if LL_WINDOWS diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h index 39af74e5c8..41a4f25000 100644 --- a/indra/llcommon/llsys.h +++ b/indra/llcommon/llsys.h @@ -114,6 +114,9 @@ public: ** be returned. */ U32 getPhysicalMemoryClamped() const; ///< Memory size in clamped bytes + + //get the available memory infomation in KiloBytes. + static void getAvailableMemoryKB(U32& avail_physical_mem_kb, U32& avail_virtual_mem_kb); }; diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index ffec9ea5b1..b209e4aa38 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -28,10 +28,14 @@ #define LL_LLVERSIONVIEWER_H const S32 LL_VERSION_MAJOR = 2; -const S32 LL_VERSION_MINOR = 2; +const S32 LL_VERSION_MINOR = 4; const S32 LL_VERSION_PATCH = 0; const S32 LL_VERSION_BUILD = 0; const char * const LL_CHANNEL = "Second Life Developer"; +#if LL_DARWIN +const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.snowglobe.viewer"; +#endif + #endif diff --git a/indra/llcommon/roles_constants.h b/indra/llcommon/roles_constants.h index 70bca821c7..effd15ea72 100644 --- a/indra/llcommon/roles_constants.h +++ b/indra/llcommon/roles_constants.h @@ -52,7 +52,6 @@ enum LLRoleChangeType // // KNOWN HOLES: use these for any single bit powers you need -// bit 0x1 << 41 // bit 0x1 << 46 // bit 0x1 << 49 and above @@ -103,6 +102,8 @@ const U64 GP_LAND_ALLOW_FLY = 0x1 << 24; // Bypass Fly Restriction const U64 GP_LAND_ALLOW_CREATE = 0x1 << 25; // Bypass Create/Edit Objects Restriction const U64 GP_LAND_ALLOW_LANDMARK = 0x1 << 26; // Bypass Landmark Restriction const U64 GP_LAND_ALLOW_SET_HOME = 0x1 << 28; // Bypass Set Home Point Restriction +const U64 GP_LAND_ALLOW_HOLD_EVENT = 0x1LL << 41; // Allowed to hold events on group-owned land + // Parcel Access const U64 GP_LAND_MANAGE_ALLOWED = 0x1 << 29; // Manage Allowed List diff --git a/indra/llcommon/stdenums.h b/indra/llcommon/stdenums.h index 5931ba67c2..9f86de124e 100644 --- a/indra/llcommon/stdenums.h +++ b/indra/llcommon/stdenums.h @@ -113,8 +113,8 @@ enum EObjectPropertiesExtraID enum EAddPosition { ADD_TOP, - ADD_SORTED, - ADD_BOTTOM + ADD_BOTTOM, + ADD_DEFAULT }; enum LLGroupChange diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp index 5ea4a236b5..835664c60f 100644 --- a/indra/llimage/llimagedimensionsinfo.cpp +++ b/indra/llimage/llimagedimensionsinfo.cpp @@ -30,6 +30,9 @@ #include "llimagedimensionsinfo.h" +// Value is true if one of Libjpeg's functions has encountered an error while working. +static bool sJpegErrorEncountered = false; + bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec) { clean(); @@ -101,9 +104,17 @@ bool LLImageDimensionsInfo::getImageDimensionsPng() return true; } +// Called instead of exit() if Libjpeg encounters an error. +void on_jpeg_error(j_common_ptr cinfo) +{ + (void) cinfo; + sJpegErrorEncountered = true; + llwarns << "Libjpeg has encountered an error!" << llendl; +} bool LLImageDimensionsInfo::getImageDimensionsJpeg() { + sJpegErrorEncountered = false; clean(); FILE *fp = fopen (mSrcFilename.c_str(), "rb"); if (fp == NULL) @@ -115,6 +126,9 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() jpeg_error_mgr jerr; jpeg_decompress_struct cinfo; cinfo.err = jpeg_std_error(&jerr); + // Call our function instead of exit() if Libjpeg encounters an error. + // This is done to avoid crash in this case (STORM-472). + cinfo.err->error_exit = on_jpeg_error; jpeg_create_decompress (&cinfo); jpeg_stdio_src (&cinfo, fp); @@ -128,6 +142,6 @@ bool LLImageDimensionsInfo::getImageDimensionsJpeg() jpeg_destroy_decompress(&cinfo); fclose(fp); - return true; + return !sJpegErrorEncountered; } diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index c8c866b7f2..d005aaf29f 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -30,6 +30,8 @@ #include "lldir.h" #include "llimagej2c.h" #include "llmemtype.h" +#include "lltimer.h" +#include "llmath.h" typedef LLImageJ2CImpl* (*CreateLLImageJ2CFunction)(); typedef void (*DestroyLLImageJ2CFunction)(LLImageJ2CImpl*); @@ -51,6 +53,10 @@ LLImageJ2CImpl* fallbackCreateLLImageJ2CImpl(); void fallbackDestroyLLImageJ2CImpl(LLImageJ2CImpl* impl); const char* fallbackEngineInfoLLImageJ2CImpl(); +// Test data gathering handle +LLImageCompressionTester* LLImageJ2C::sTesterp = NULL ; +const std::string sTesterName("ImageCompressionTester"); + //static //Loads the required "create", "destroy" and "engineinfo" functions needed void LLImageJ2C::openDSO() @@ -71,8 +77,8 @@ void LLImageJ2C::openDSO() #endif dso_path = gDirUtilp->findFile(dso_name, - gDirUtilp->getAppRODataDir(), - gDirUtilp->getExecutableDir()); + gDirUtilp->getAppRODataDir(), + gDirUtilp->getExecutableDir()); j2cimpl_dso_handle = NULL; j2cimpl_dso_memory_pool = NULL; @@ -102,7 +108,7 @@ void LLImageJ2C::openDSO() //so lets check for a destruction function rv = apr_dso_sym((apr_dso_handle_sym_t*)&dest_func, j2cimpl_dso_handle, - "destroyLLImageJ2CKDU"); + "destroyLLImageJ2CKDU"); if ( rv == APR_SUCCESS ) { //we've loaded the destroy function ok @@ -195,6 +201,17 @@ LLImageJ2C::LLImageJ2C() : LLImageFormatted(IMG_CODEC_J2C), { // Array size is MAX_DISCARD_LEVEL+1 mDataSizes[i] = 0; } + + // If that test log has ben requested but not yet created, create it + if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName)) + { + sTesterp = new LLImageCompressionTester() ; + if (!sTesterp->isValid()) + { + delete sTesterp; + sTesterp = NULL; + } + } } // virtual @@ -280,6 +297,7 @@ BOOL LLImageJ2C::decode(LLImageRaw *raw_imagep, F32 decode_time) // Returns TRUE to mean done, whether successful or not. BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 first_channel, S32 max_channel_count ) { + LLTimer elapsed; LLMemType mt1(mMemType); BOOL res = TRUE; @@ -318,6 +336,21 @@ BOOL LLImageJ2C::decodeChannels(LLImageRaw *raw_imagep, F32 decode_time, S32 fir LLImage::setLastError(mLastError); } + LLImageCompressionTester* tester = (LLImageCompressionTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + // Decompression stat gathering + // Note that we *do not* take into account the decompression failures data so we might overestimate the time spent processing + + // Always add the decompression time to the stat + tester->updateDecompressionStats(elapsed.getElapsedTimeF32()) ; + if (res) + { + // The whole data stream is finally decompressed when res is returned as TRUE + tester->updateDecompressionStats(this->getDataSize(), raw_imagep->getDataSize()) ; + } + } + return res; } @@ -330,6 +363,7 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, F32 encode_time) BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, F32 encode_time) { + LLTimer elapsed; LLMemType mt1(mMemType); resetLastError(); BOOL res = mImpl->encodeImpl(*this, *raw_imagep, comment_text, encode_time, mReversible); @@ -337,6 +371,22 @@ BOOL LLImageJ2C::encode(const LLImageRaw *raw_imagep, const char* comment_text, { LLImage::setLastError(mLastError); } + + LLImageCompressionTester* tester = (LLImageCompressionTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) + { + // Compression stat gathering + // Note that we *do not* take into account the compression failures cases so we night overestimate the time spent processing + + // Always add the compression time to the stat + tester->updateCompressionStats(elapsed.getElapsedTimeF32()) ; + if (res) + { + // The whole data stream is finally compressed when res is returned as TRUE + tester->updateCompressionStats(this->getDataSize(), raw_imagep->getDataSize()) ; + } + } + return res; } @@ -540,3 +590,125 @@ void LLImageJ2C::updateRawDiscardLevel() LLImageJ2CImpl::~LLImageJ2CImpl() { } + +//---------------------------------------------------------------------------------------------- +// Start of LLImageCompressionTester +//---------------------------------------------------------------------------------------------- +LLImageCompressionTester::LLImageCompressionTester() : LLMetricPerformanceTesterBasic(sTesterName) +{ + addMetric("Time Decompression (s)"); + addMetric("Volume In Decompression (kB)"); + addMetric("Volume Out Decompression (kB)"); + addMetric("Decompression Ratio (x:1)"); + addMetric("Perf Decompression (kB/s)"); + + addMetric("Time Compression (s)"); + addMetric("Volume In Compression (kB)"); + addMetric("Volume Out Compression (kB)"); + addMetric("Compression Ratio (x:1)"); + addMetric("Perf Compression (kB/s)"); + + mRunBytesInDecompression = 0; + mRunBytesInCompression = 0; + + mTotalBytesInDecompression = 0; + mTotalBytesOutDecompression = 0; + mTotalBytesInCompression = 0; + mTotalBytesOutCompression = 0; + + mTotalTimeDecompression = 0.0f; + mTotalTimeCompression = 0.0f; +} + +LLImageCompressionTester::~LLImageCompressionTester() +{ + LLImageJ2C::sTesterp = NULL; +} + +//virtual +void LLImageCompressionTester::outputTestRecord(LLSD *sd) +{ + std::string currentLabel = getCurrentLabelName(); + + F32 decompressionPerf = 0.0f; + F32 compressionPerf = 0.0f; + F32 decompressionRate = 0.0f; + F32 compressionRate = 0.0f; + + F32 totalkBInDecompression = (F32)(mTotalBytesInDecompression) / 1000.0; + F32 totalkBOutDecompression = (F32)(mTotalBytesOutDecompression) / 1000.0; + F32 totalkBInCompression = (F32)(mTotalBytesInCompression) / 1000.0; + F32 totalkBOutCompression = (F32)(mTotalBytesOutCompression) / 1000.0; + + if (!is_approx_zero(mTotalTimeDecompression)) + { + decompressionPerf = totalkBInDecompression / mTotalTimeDecompression; + } + if (!is_approx_zero(totalkBInDecompression)) + { + decompressionRate = totalkBOutDecompression / totalkBInDecompression; + } + if (!is_approx_zero(mTotalTimeCompression)) + { + compressionPerf = totalkBInCompression / mTotalTimeCompression; + } + if (!is_approx_zero(totalkBOutCompression)) + { + compressionRate = totalkBInCompression / totalkBOutCompression; + } + + (*sd)[currentLabel]["Time Decompression (s)"] = (LLSD::Real)mTotalTimeDecompression; + (*sd)[currentLabel]["Volume In Decompression (kB)"] = (LLSD::Real)totalkBInDecompression; + (*sd)[currentLabel]["Volume Out Decompression (kB)"]= (LLSD::Real)totalkBOutDecompression; + (*sd)[currentLabel]["Decompression Ratio (x:1)"] = (LLSD::Real)decompressionRate; + (*sd)[currentLabel]["Perf Decompression (kB/s)"] = (LLSD::Real)decompressionPerf; + + (*sd)[currentLabel]["Time Compression (s)"] = (LLSD::Real)mTotalTimeCompression; + (*sd)[currentLabel]["Volume In Compression (kB)"] = (LLSD::Real)totalkBInCompression; + (*sd)[currentLabel]["Volume Out Compression (kB)"] = (LLSD::Real)totalkBOutCompression; + (*sd)[currentLabel]["Compression Ratio (x:1)"] = (LLSD::Real)compressionRate; + (*sd)[currentLabel]["Perf Compression (kB/s)"] = (LLSD::Real)compressionPerf; +} + +void LLImageCompressionTester::updateCompressionStats(const F32 deltaTime) +{ + mTotalTimeCompression += deltaTime; +} + +void LLImageCompressionTester::updateCompressionStats(const S32 bytesCompress, const S32 bytesRaw) +{ + mTotalBytesInCompression += bytesRaw; + mRunBytesInCompression += bytesRaw; + mTotalBytesOutCompression += bytesCompress; + if (mRunBytesInCompression > (1000000)) + { + // Output everything + outputTestResults(); + // Reset the compression data of the run + mRunBytesInCompression = 0; + } +} + +void LLImageCompressionTester::updateDecompressionStats(const F32 deltaTime) +{ + mTotalTimeDecompression += deltaTime; +} + +void LLImageCompressionTester::updateDecompressionStats(const S32 bytesIn, const S32 bytesOut) +{ + mTotalBytesInDecompression += bytesIn; + mRunBytesInDecompression += bytesIn; + mTotalBytesOutDecompression += bytesOut; + if (mRunBytesInDecompression > (1000000)) + { + // Output everything + outputTestResults(); + // Reset the decompression data of the run + mRunBytesInDecompression = 0; + } +} + +//---------------------------------------------------------------------------------------------- +// End of LLTexturePipelineTester +//---------------------------------------------------------------------------------------------- + diff --git a/indra/llimage/llimagej2c.h b/indra/llimage/llimagej2c.h index cdb3faa207..cc3dabd7d8 100644 --- a/indra/llimage/llimagej2c.h +++ b/indra/llimage/llimagej2c.h @@ -29,8 +29,11 @@ #include "llimage.h" #include "llassettype.h" +#include "llmetricperformancetester.h" class LLImageJ2CImpl; +class LLImageCompressionTester ; + class LLImageJ2C : public LLImageFormatted { protected: @@ -72,11 +75,12 @@ public: static void openDSO(); static void closeDSO(); static std::string getEngineInfo(); - + protected: friend class LLImageJ2CImpl; friend class LLImageJ2COJ; friend class LLImageJ2CKDU; + friend class LLImageCompressionTester; void decodeFailed(); void updateRawDiscardLevel(); @@ -90,6 +94,9 @@ protected: BOOL mReversible; LLImageJ2CImpl *mImpl; std::string mLastError; + + // Image compression/decompression tester + static LLImageCompressionTester* sTesterp; }; // Derive from this class to implement JPEG2000 decoding @@ -118,4 +125,40 @@ protected: #define LINDEN_J2C_COMMENT_PREFIX "LL_" +// +// This class is used for performance data gathering only. +// Tracks the image compression / decompression data, +// records and outputs them to the log file. +// +class LLImageCompressionTester : public LLMetricPerformanceTesterBasic +{ + public: + LLImageCompressionTester(); + ~LLImageCompressionTester(); + + void updateDecompressionStats(const F32 deltaTime) ; + void updateDecompressionStats(const S32 bytesIn, const S32 bytesOut) ; + void updateCompressionStats(const F32 deltaTime) ; + void updateCompressionStats(const S32 bytesIn, const S32 bytesOut) ; + + protected: + /*virtual*/ void outputTestRecord(LLSD* sd); + + private: + // + // Data size + // + U32 mTotalBytesInDecompression; // Total bytes fed to decompressor + U32 mTotalBytesOutDecompression; // Total bytes produced by decompressor + U32 mTotalBytesInCompression; // Total bytes fed to compressor + U32 mTotalBytesOutCompression; // Total bytes produced by compressor + U32 mRunBytesInDecompression; // Bytes fed to decompressor in this run + U32 mRunBytesInCompression; // Bytes fed to compressor in this run + // + // Time + // + F32 mTotalTimeDecompression; // Total time spent in computing decompression + F32 mTotalTimeCompression; // Total time spent in computing compression + }; + #endif diff --git a/indra/llinventory/lltransactionflags.cpp b/indra/llinventory/lltransactionflags.cpp index 8f7eeb8efa..ee0e6ae26c 100644 --- a/indra/llinventory/lltransactionflags.cpp +++ b/indra/llinventory/lltransactionflags.cpp @@ -108,6 +108,9 @@ std::string build_transfer_message_to_source( std::ostringstream ostr; if(dest_id.isNull()) { + // *NOTE: Do not change these strings! The viewer matches + // them in llviewermessage.cpp to perform localization. + // If you need to make changes, add a new, localizable message. JC ostr << "You paid L$" << amount; switch(transaction_type) { @@ -154,6 +157,9 @@ std::string build_transfer_message_to_destination( return description; } std::ostringstream ostr; + // *NOTE: Do not change these strings! The viewer matches + // them in llviewermessage.cpp to perform localization. + // If you need to make changes, add a new, localizable message. JC ostr << source_name << " paid you L$" << amount; append_reason(ostr, transaction_type, description); ostr << "."; diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 1f8ee26716..1cad0f6d22 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -25,6 +25,7 @@ set(llmessage_SOURCE_FILES llares.cpp llareslistener.cpp llassetstorage.cpp + llavatarnamecache.cpp llblowfishcipher.cpp llbuffer.cpp llbufferstream.cpp @@ -110,6 +111,7 @@ set(llmessage_HEADER_FILES llares.h llareslistener.h llassetstorage.h + llavatarnamecache.h llblowfishcipher.h llbuffer.h llbufferstream.h @@ -248,6 +250,7 @@ if (LL_TESTS) "${CMAKE_CURRENT_SOURCE_DIR}/tests/test_llsdmessage_peer.py" ) + LL_ADD_INTEGRATION_TEST(llavatarnamecache "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llhost "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llpartdata "" "${test_libs}") LL_ADD_INTEGRATION_TEST(llxfer_file "" "${test_libs}") diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp new file mode 100644 index 0000000000..7396117d84 --- /dev/null +++ b/indra/llmessage/llavatarnamecache.cpp @@ -0,0 +1,812 @@ +/** + * @file llavatarnamecache.cpp + * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names + * ("James Cook") from avatar UUIDs. + * + * $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 "linden_common.h" + +#include "llavatarnamecache.h" + +#include "llcachename.h" // we wrap this system +#include "llframetimer.h" +#include "llhttpclient.h" +#include "llsd.h" +#include "llsdserialize.h" + +#include <boost/tokenizer.hpp> + +#include <map> +#include <set> + +namespace LLAvatarNameCache +{ + use_display_name_signal_t mUseDisplayNamesSignal; + + // Manual override for display names - can disable even if the region + // supports it. + bool sUseDisplayNames = true; + + // Cache starts in a paused state until we can determine if the + // current region supports display names. + bool sRunning = false; + + // Base lookup URL for name service. + // On simulator, loaded from indra.xml + // On viewer, usually a simulator capability (at People API team's request) + // Includes the trailing slash, like "http://pdp60.lindenlab.com:8000/agents/" + std::string sNameLookupURL; + + // accumulated agent IDs for next query against service + typedef std::set<LLUUID> ask_queue_t; + ask_queue_t sAskQueue; + + // agent IDs that have been requested, but with no reply + // maps agent ID to frame time request was made + typedef std::map<LLUUID, F64> pending_queue_t; + pending_queue_t sPendingQueue; + + // Callbacks to fire when we received a name. + // May have multiple callbacks for a single ID, which are + // represented as multiple slots bound to the signal. + // Avoid copying signals via pointers. + typedef std::map<LLUUID, callback_signal_t*> signal_map_t; + signal_map_t sSignalMap; + + // names we know about + typedef std::map<LLUUID, LLAvatarName> cache_t; + cache_t sCache; + + // Send bulk lookup requests a few times a second at most + // only need per-frame timing resolution + LLFrameTimer sRequestTimer; + + // Periodically clean out expired entries from the cache + //LLFrameTimer sEraseExpiredTimer; + + //----------------------------------------------------------------------- + // Internal methods + //----------------------------------------------------------------------- + + // Handle name response off network. + // Optionally skip adding to cache, used when this is a fallback to the + // legacy name system. + void processName(const LLUUID& agent_id, + const LLAvatarName& av_name, + bool add_to_cache); + + void requestNamesViaCapability(); + + // Legacy name system callback + void legacyNameCallback(const LLUUID& agent_id, + const std::string& full_name, + bool is_group); + + void requestNamesViaLegacy(); + + // Fill in an LLAvatarName with the legacy name data + void buildLegacyName(const std::string& full_name, + LLAvatarName* av_name); + + // Do a single callback to a given slot + void fireSignal(const LLUUID& agent_id, + const callback_slot_t& slot, + const LLAvatarName& av_name); + + // Is a request in-flight over the network? + bool isRequestPending(const LLUUID& agent_id); + + // Erase expired names from cache + void eraseExpired(); + + bool expirationFromCacheControl(LLSD headers, F64 *expires); +} + +/* Sample response: +<?xml version="1.0"?> +<llsd> + <map> + <key>agents</key> + <array> + <map> + <key>display_name_next_update</key> + <date>2010-04-16T21:34:02+00:00Z</date> + <key>display_name_expires</key> + <date>2010-04-16T21:32:26.142178+00:00Z</date> + <key>display_name</key> + <string>MickBot390 LLQABot</string> + <key>sl_id</key> + <string>mickbot390.llqabot</string> + <key>id</key> + <string>0012809d-7d2d-4c24-9609-af1230a37715</string> + <key>is_display_name_default</key> + <boolean>false</boolean> + </map> + <map> + <key>display_name_next_update</key> + <date>2010-04-16T21:34:02+00:00Z</date> + <key>display_name_expires</key> + <date>2010-04-16T21:32:26.142178+00:00Z</date> + <key>display_name</key> + <string>Bjork Gudmundsdottir</string> + <key>sl_id</key> + <string>sardonyx.linden</string> + <key>id</key> + <string>3941037e-78ab-45f0-b421-bd6e77c1804d</string> + <key>is_display_name_default</key> + <boolean>true</boolean> + </map> + </array> + </map> +</llsd> +*/ + +class LLAvatarNameResponder : public LLHTTPClient::Responder +{ +private: + // need to store agent ids that are part of this request in case of + // an error, so we can flag them as unavailable + std::vector<LLUUID> mAgentIDs; + + // Need the headers to look up Expires: and Retry-After: + LLSD mHeaders; + +public: + LLAvatarNameResponder(const std::vector<LLUUID>& agent_ids) + : mAgentIDs(agent_ids), + mHeaders() + { } + + /*virtual*/ void completedHeader(U32 status, const std::string& reason, + const LLSD& headers) + { + mHeaders = headers; + } + + /*virtual*/ void result(const LLSD& content) + { + // Pull expiration out of headers if available + F64 expires = LLAvatarNameCache::nameExpirationFromHeaders(mHeaders); + + LLSD agents = content["agents"]; + LLSD::array_const_iterator it = agents.beginArray(); + for ( ; it != agents.endArray(); ++it) + { + const LLSD& row = *it; + LLUUID agent_id = row["id"].asUUID(); + + LLAvatarName av_name; + av_name.fromLLSD(row); + + // Use expiration time from header + av_name.mExpires = expires; + + // Some avatars don't have explicit display names set + if (av_name.mDisplayName.empty()) + { + av_name.mDisplayName = av_name.mUsername; + } + + // cache it and fire signals + LLAvatarNameCache::processName(agent_id, av_name, true); + } + + // Same logic as error response case + LLSD unresolved_agents = content["bad_ids"]; + if (unresolved_agents.size() > 0) + { + const std::string DUMMY_NAME("\?\?\?"); + LLAvatarName av_name; + av_name.mUsername = DUMMY_NAME; + av_name.mDisplayName = DUMMY_NAME; + av_name.mIsDisplayNameDefault = false; + av_name.mIsDummy = true; + av_name.mExpires = expires; + + it = unresolved_agents.beginArray(); + for ( ; it != unresolved_agents.endArray(); ++it) + { + const LLUUID& agent_id = *it; + // cache it and fire signals + LLAvatarNameCache::processName(agent_id, av_name, true); + } + } + } + + /*virtual*/ void error(U32 status, const std::string& reason) + { + // We're going to construct a dummy record and cache it for a while, + // either briefly for a 503 Service Unavailable, or longer for other + // errors. + F64 retry_timestamp = errorRetryTimestamp(status); + + // *NOTE: "??" starts trigraphs in C/C++, escape the question marks. + const std::string DUMMY_NAME("\?\?\?"); + LLAvatarName av_name; + av_name.mUsername = DUMMY_NAME; + av_name.mDisplayName = DUMMY_NAME; + av_name.mIsDisplayNameDefault = false; + av_name.mIsDummy = true; + av_name.mExpires = retry_timestamp; + + // Add dummy records for all agent IDs in this request + std::vector<LLUUID>::const_iterator it = mAgentIDs.begin(); + for ( ; it != mAgentIDs.end(); ++it) + { + const LLUUID& agent_id = *it; + // cache it and fire signals + LLAvatarNameCache::processName(agent_id, av_name, true); + } + } + + // Return time to retry a request that generated an error, based on + // error type and headers. Return value is seconds-since-epoch. + F64 errorRetryTimestamp(S32 status) + { + F64 now = LLFrameTimer::getTotalSeconds(); + + // Retry-After takes priority + LLSD retry_after = mHeaders["retry-after"]; + if (retry_after.isDefined()) + { + // We only support the delta-seconds type + S32 delta_seconds = retry_after.asInteger(); + if (delta_seconds > 0) + { + // ...valid delta-seconds + return now + F64(delta_seconds); + } + } + + // If no Retry-After, look for Cache-Control max-age + F64 expires = 0.0; + if (LLAvatarNameCache::expirationFromCacheControl(mHeaders, &expires)) + { + return expires; + } + + // No information in header, make a guess + const F64 DEFAULT_DELAY = 120.0; // 2 mintues + return now + DEFAULT_DELAY; + } +}; + +void LLAvatarNameCache::processName(const LLUUID& agent_id, + const LLAvatarName& av_name, + bool add_to_cache) +{ + if (add_to_cache) + { + sCache[agent_id] = av_name; + } + + sPendingQueue.erase(agent_id); + + // signal everyone waiting on this name + signal_map_t::iterator sig_it = sSignalMap.find(agent_id); + if (sig_it != sSignalMap.end()) + { + callback_signal_t* signal = sig_it->second; + (*signal)(agent_id, av_name); + + sSignalMap.erase(agent_id); + + delete signal; + signal = NULL; + } +} + +void LLAvatarNameCache::requestNamesViaCapability() +{ + F64 now = LLFrameTimer::getTotalSeconds(); + + // URL format is like: + // http://pdp60.lindenlab.com:8000/agents/?ids=3941037e-78ab-45f0-b421-bd6e77c1804d&ids=0012809d-7d2d-4c24-9609-af1230a37715&ids=0019aaba-24af-4f0a-aa72-6457953cf7f0 + // + // Apache can handle URLs of 4096 chars, but let's be conservative + const U32 NAME_URL_MAX = 4096; + const U32 NAME_URL_SEND_THRESHOLD = 3000; + std::string url; + url.reserve(NAME_URL_MAX); + + std::vector<LLUUID> agent_ids; + agent_ids.reserve(128); + + ask_queue_t::const_iterator it = sAskQueue.begin(); + for ( ; it != sAskQueue.end(); ++it) + { + const LLUUID& agent_id = *it; + + if (url.empty()) + { + // ...starting new request + url += sNameLookupURL; + url += "?ids="; + } + else + { + // ...continuing existing request + url += "&ids="; + } + url += agent_id.asString(); + agent_ids.push_back(agent_id); + + // mark request as pending + sPendingQueue[agent_id] = now; + + if (url.size() > NAME_URL_SEND_THRESHOLD) + { + //llinfos << "requestNames " << url << llendl; + LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids)); + url.clear(); + agent_ids.clear(); + } + } + + if (!url.empty()) + { + //llinfos << "requestNames " << url << llendl; + LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids)); + url.clear(); + agent_ids.clear(); + } + + // We've moved all asks to the pending request queue + sAskQueue.clear(); +} + +void LLAvatarNameCache::legacyNameCallback(const LLUUID& agent_id, + const std::string& full_name, + bool is_group) +{ + // Construct a dummy record for this name. By convention, SLID is blank + // Never expires, but not written to disk, so lasts until end of session. + LLAvatarName av_name; + buildLegacyName(full_name, &av_name); + + // Don't add to cache, the data already exists in the legacy name system + // cache and we don't want or need duplicate storage, because keeping the + // two copies in sync is complex. + processName(agent_id, av_name, false); +} + +void LLAvatarNameCache::requestNamesViaLegacy() +{ + F64 now = LLFrameTimer::getTotalSeconds(); + std::string full_name; + ask_queue_t::const_iterator it = sAskQueue.begin(); + for (; it != sAskQueue.end(); ++it) + { + const LLUUID& agent_id = *it; + + // Mark as pending first, just in case the callback is immediately + // invoked below. This should never happen in practice. + sPendingQueue[agent_id] = now; + + gCacheName->get(agent_id, false, // legacy compatibility + boost::bind(&LLAvatarNameCache::legacyNameCallback, + _1, _2, _3)); + } + + // We've either answered immediately or moved all asks to the + // pending queue + sAskQueue.clear(); +} + +void LLAvatarNameCache::initClass(bool running) +{ + sRunning = running; +} + +void LLAvatarNameCache::cleanupClass() +{ +} + +void LLAvatarNameCache::importFile(std::istream& istr) +{ + LLSD data; + S32 parse_count = LLSDSerialize::fromXMLDocument(data, istr); + if (parse_count < 1) return; + + // by convention LLSD storage is a map + // we only store one entry in the map + LLSD agents = data["agents"]; + + LLUUID agent_id; + LLAvatarName av_name; + LLSD::map_const_iterator it = agents.beginMap(); + for ( ; it != agents.endMap(); ++it) + { + agent_id.set(it->first); + av_name.fromLLSD( it->second ); + sCache[agent_id] = av_name; + } + // entries may have expired since we last ran the viewer, just + // clean them out now + eraseExpired(); + llinfos << "loaded " << sCache.size() << llendl; +} + +void LLAvatarNameCache::exportFile(std::ostream& ostr) +{ + LLSD agents; + cache_t::const_iterator it = sCache.begin(); + for ( ; it != sCache.end(); ++it) + { + const LLUUID& agent_id = it->first; + const LLAvatarName& av_name = it->second; + if (!av_name.mIsDummy) + { + // key must be a string + agents[agent_id.asString()] = av_name.asLLSD(); + } + } + LLSD data; + data["agents"] = agents; + LLSDSerialize::toPrettyXML(data, ostr); +} + +void LLAvatarNameCache::setNameLookupURL(const std::string& name_lookup_url) +{ + sNameLookupURL = name_lookup_url; +} + +bool LLAvatarNameCache::hasNameLookupURL() +{ + return !sNameLookupURL.empty(); +} + +void LLAvatarNameCache::idle() +{ + // By convention, start running at first idle() call + sRunning = true; + + // *TODO: Possibly re-enabled this based on People API load measurements + // 100 ms is the threshold for "user speed" operations, so we can + // stall for about that long to batch up requests. + //const F32 SECS_BETWEEN_REQUESTS = 0.1f; + //if (!sRequestTimer.checkExpirationAndReset(SECS_BETWEEN_REQUESTS)) + //{ + // return; + //} + + // Must be large relative to above + + // No longer deleting expired entries, just re-requesting in the get + // this way first synchronous get call on an expired entry won't return + // legacy name. LF + + //const F32 ERASE_EXPIRED_TIMEOUT = 60.f; // seconds + //if (sEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT)) + //{ + // eraseExpired(); + //} + + if (sAskQueue.empty()) + { + return; + } + + if (useDisplayNames()) + { + requestNamesViaCapability(); + } + else + { + // ...fall back to legacy name cache system + requestNamesViaLegacy(); + } +} + +bool LLAvatarNameCache::isRequestPending(const LLUUID& agent_id) +{ + const F64 PENDING_TIMEOUT_SECS = 5.0 * 60.0; + F64 now = LLFrameTimer::getTotalSeconds(); + F64 expire_time = now - PENDING_TIMEOUT_SECS; + + pending_queue_t::const_iterator it = sPendingQueue.find(agent_id); + if (it != sPendingQueue.end()) + { + bool request_expired = (it->second < expire_time); + return !request_expired; + } + return false; +} + +void LLAvatarNameCache::eraseExpired() +{ + F64 now = LLFrameTimer::getTotalSeconds(); + cache_t::iterator it = sCache.begin(); + while (it != sCache.end()) + { + cache_t::iterator cur = it; + ++it; + const LLAvatarName& av_name = cur->second; + if (av_name.mExpires < now) + { + sCache.erase(cur); + } + } +} + +void LLAvatarNameCache::buildLegacyName(const std::string& full_name, + LLAvatarName* av_name) +{ + llassert(av_name); + av_name->mUsername = ""; + av_name->mDisplayName = full_name; + av_name->mIsDisplayNameDefault = true; + av_name->mIsDummy = true; + av_name->mExpires = F64_MAX; +} + +// fills in av_name if it has it in the cache, even if expired (can check expiry time) +// returns bool specifying if av_name was filled, false otherwise +bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) +{ + if (sRunning) + { + // ...only do immediate lookups when cache is running + if (useDisplayNames()) + { + // ...use display names cache + std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + *av_name = it->second; + + // re-request name if entry is expired + if (av_name->mExpires < LLFrameTimer::getTotalSeconds()) + { + if (!isRequestPending(agent_id)) + { + sAskQueue.insert(agent_id); + } + } + + return true; + } + } + else + { + // ...use legacy names cache + std::string full_name; + if (gCacheName->getFullName(agent_id, full_name)) + { + buildLegacyName(full_name, av_name); + return true; + } + } + } + + if (!isRequestPending(agent_id)) + { + sAskQueue.insert(agent_id); + } + + return false; +} + +void LLAvatarNameCache::fireSignal(const LLUUID& agent_id, + const callback_slot_t& slot, + const LLAvatarName& av_name) +{ + callback_signal_t signal; + signal.connect(slot); + signal(agent_id, av_name); +} + +void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) +{ + if (sRunning) + { + // ...only do immediate lookups when cache is running + if (useDisplayNames()) + { + // ...use new cache + std::map<LLUUID,LLAvatarName>::iterator it = sCache.find(agent_id); + if (it != sCache.end()) + { + const LLAvatarName& av_name = it->second; + + if (av_name.mExpires > LLFrameTimer::getTotalSeconds()) + { + // ...name already exists in cache, fire callback now + fireSignal(agent_id, slot, av_name); + + return; + } + } + } + else + { + // ...use old name system + std::string full_name; + if (gCacheName->getFullName(agent_id, full_name)) + { + LLAvatarName av_name; + buildLegacyName(full_name, &av_name); + fireSignal(agent_id, slot, av_name); + return; + } + } + } + + // schedule a request + if (!isRequestPending(agent_id)) + { + sAskQueue.insert(agent_id); + } + + // always store additional callback, even if request is pending + signal_map_t::iterator sig_it = sSignalMap.find(agent_id); + if (sig_it == sSignalMap.end()) + { + // ...new callback for this id + callback_signal_t* signal = new callback_signal_t(); + signal->connect(slot); + sSignalMap[agent_id] = signal; + } + else + { + // ...existing callback, bind additional slot + callback_signal_t* signal = sig_it->second; + signal->connect(slot); + } +} + + +void LLAvatarNameCache::setUseDisplayNames(bool use) +{ + if (use != sUseDisplayNames) + { + sUseDisplayNames = use; + // flush our cache + sCache.clear(); + + mUseDisplayNamesSignal(); + } +} + +bool LLAvatarNameCache::useDisplayNames() +{ + // Must be both manually set on and able to look up names. + return sUseDisplayNames && !sNameLookupURL.empty(); +} + +void LLAvatarNameCache::erase(const LLUUID& agent_id) +{ + sCache.erase(agent_id); +} + +void LLAvatarNameCache::fetch(const LLUUID& agent_id) +{ + // re-request, even if request is already pending + sAskQueue.insert(agent_id); +} + +void LLAvatarNameCache::insert(const LLUUID& agent_id, const LLAvatarName& av_name) +{ + // *TODO: update timestamp if zero? + sCache[agent_id] = av_name; +} + +F64 LLAvatarNameCache::nameExpirationFromHeaders(LLSD headers) +{ + F64 expires = 0.0; + if (expirationFromCacheControl(headers, &expires)) + { + return expires; + } + else + { + // With no expiration info, default to an hour + const F64 DEFAULT_EXPIRES = 60.0 * 60.0; + F64 now = LLFrameTimer::getTotalSeconds(); + return now + DEFAULT_EXPIRES; + } +} + +bool LLAvatarNameCache::expirationFromCacheControl(LLSD headers, F64 *expires) +{ + // Allow the header to override the default + LLSD cache_control_header = headers["cache-control"]; + if (cache_control_header.isDefined()) + { + S32 max_age = 0; + std::string cache_control = cache_control_header.asString(); + if (max_age_from_cache_control(cache_control, &max_age)) + { + F64 now = LLFrameTimer::getTotalSeconds(); + *expires = now + (F64)max_age; + return true; + } + } + return false; +} + + +void LLAvatarNameCache::addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb) +{ + mUseDisplayNamesSignal.connect(cb); +} + + +static const std::string MAX_AGE("max-age"); +static const boost::char_separator<char> EQUALS_SEPARATOR("="); +static const boost::char_separator<char> COMMA_SEPARATOR(","); + +bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age) +{ + // Split the string on "," to get a list of directives + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + tokenizer directives(cache_control, COMMA_SEPARATOR); + + tokenizer::iterator token_it = directives.begin(); + for ( ; token_it != directives.end(); ++token_it) + { + // Tokens may have leading or trailing whitespace + std::string token = *token_it; + LLStringUtil::trim(token); + + if (token.compare(0, MAX_AGE.size(), MAX_AGE) == 0) + { + // ...this token starts with max-age, so let's chop it up by "=" + tokenizer subtokens(token, EQUALS_SEPARATOR); + tokenizer::iterator subtoken_it = subtokens.begin(); + + // Must have a token + if (subtoken_it == subtokens.end()) return false; + std::string subtoken = *subtoken_it; + + // Must exactly equal "max-age" + LLStringUtil::trim(subtoken); + if (subtoken != MAX_AGE) return false; + + // Must have another token + ++subtoken_it; + if (subtoken_it == subtokens.end()) return false; + subtoken = *subtoken_it; + + // Must be a valid integer + // *NOTE: atoi() returns 0 for invalid values, so we have to + // check the string first. + // *TODO: Do servers ever send "0000" for zero? We don't handle it + LLStringUtil::trim(subtoken); + if (subtoken == "0") + { + *max_age = 0; + return true; + } + S32 val = atoi( subtoken.c_str() ); + if (val > 0 && val < S32_MAX) + { + *max_age = val; + return true; + } + return false; + } + } + return false; +} + diff --git a/indra/llmessage/llavatarnamecache.h b/indra/llmessage/llavatarnamecache.h new file mode 100644 index 0000000000..8f21ace96a --- /dev/null +++ b/indra/llmessage/llavatarnamecache.h @@ -0,0 +1,103 @@ +/** + * @file llavatarnamecache.h + * @brief Provides lookup of avatar SLIDs ("bobsmith123") and display names + * ("James Cook") from avatar UUIDs. + * + * $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 LLAVATARNAMECACHE_H +#define LLAVATARNAMECACHE_H + +#include "llavatarname.h" // for convenience + +#include <boost/signals2.hpp> + +class LLSD; +class LLUUID; + +namespace LLAvatarNameCache +{ + + typedef boost::signals2::signal<void (void)> use_display_name_signal_t; + + // Until the cache is set running, immediate lookups will fail and + // async lookups will be queued. This allows us to block requests + // until we know if the first region supports display names. + void initClass(bool running); + void cleanupClass(); + + void importFile(std::istream& istr); + void exportFile(std::ostream& ostr); + + // On the viewer, usually a simulator capabilitity + // If empty, name cache will fall back to using legacy name + // lookup system + void setNameLookupURL(const std::string& name_lookup_url); + + // Do we have a valid lookup URL, hence are we trying to use the + // new display name lookup system? + bool hasNameLookupURL(); + + // Periodically makes a batch request for display names not already in + // cache. Call once per frame. + void idle(); + + // If name is in cache, returns true and fills in provided LLAvatarName + // otherwise returns false + bool get(const LLUUID& agent_id, LLAvatarName *av_name); + + // Callback types for get() below + typedef boost::signals2::signal< + void (const LLUUID& agent_id, const LLAvatarName& av_name)> + callback_signal_t; + typedef callback_signal_t::slot_type callback_slot_t; + + // Fetches name information and calls callback. + // If name information is in cache, callback will be called immediately. + void get(const LLUUID& agent_id, callback_slot_t slot); + + // Allow display names to be explicitly disabled for testing. + void setUseDisplayNames(bool use); + bool useDisplayNames(); + + void erase(const LLUUID& agent_id); + + // Force a re-fetch of the most recent data, but keep the current + // data in cache + void fetch(const LLUUID& agent_id); + + void insert(const LLUUID& agent_id, const LLAvatarName& av_name); + + // Compute name expiration time from HTTP Cache-Control header, + // or return default value, in seconds from epoch. + F64 nameExpirationFromHeaders(LLSD headers); + + void addUseDisplayNamesCallback(const use_display_name_signal_t::slot_type& cb); +} + +// Parse a cache-control header to get the max-age delta-seconds. +// Returns true if header has max-age param and it parses correctly. +// Exported here to ease unit testing. +bool max_age_from_cache_control(const std::string& cache_control, S32 *max_age); + +#endif diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index 379f390625..4ab6bd2438 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -38,6 +38,8 @@ #include "message.h" #include "llmemtype.h" +#include <boost/regex.hpp> + // llsd serialization constants static const std::string AGENTS("agents"); static const std::string GROUPS("groups"); @@ -69,6 +71,8 @@ public: public: bool mIsGroup; U32 mCreateTime; // unix time_t + // IDEVO TODO collapse names to one field, which will eliminate + // many string compares on "Resident" std::string mFirstName; std::string mLastName; std::string mGroupName; @@ -214,7 +218,9 @@ public: Impl(LLMessageSystem* msg); ~Impl(); - + + BOOL getName(const LLUUID& id, std::string& first, std::string& last); + boost::signals2::connection addPending(const LLUUID& id, const LLCacheNameCallback& callback); void addPending(const LLUUID& id, const LLHost& host); @@ -300,89 +306,10 @@ boost::signals2::connection LLCacheName::addObserver(const LLCacheNameCallback& return impl.mSignal.connect(callback); } -void LLCacheName::importFile(LLFILE* fp) -{ - S32 count = 0; - - const S32 BUFFER_SIZE = 1024; - char buffer[BUFFER_SIZE]; /*Flawfinder: ignore*/ - - // *NOTE: These buffer sizes are hardcoded into sscanf() below - char id_string[MAX_STRING]; /*Flawfinder: ignore*/ - char firstname[MAX_STRING]; /*Flawfinder: ignore*/ - char lastname[MAX_STRING]; /*Flawfinder: ignore*/ - U32 create_time; - - // This is OK if the first line is actually a name. We just don't load it. - char* valid = fgets(buffer, BUFFER_SIZE, fp); - if (!valid) return; - - // *NOTE: This buffer size is hardcoded into sscanf() below - char version_string[BUFFER_SIZE]; /*Flawfinder: ignore*/ - S32 version = 0; - S32 match = sscanf( /* Flawfinder: ignore */ - buffer, - "%1023s %d", - version_string, &version); - if ( match != 2 - || strcmp(version_string, "version") - || version != CN_FILE_VERSION) - { - llwarns << "Ignoring old cache name file format" << llendl; - return; - } - - // We'll expire entries more than a week old - U32 now = (U32)time(NULL); - const U32 SECS_PER_DAY = 60 * 60 * 24; - U32 delete_before_time = now - (7 * SECS_PER_DAY); - - while(!feof(fp)) - { - valid = fgets(buffer, BUFFER_SIZE, fp); - if (!valid) break; - - match = sscanf( /* Flawfinder: ignore */ - buffer, - "%254s %u %254s %254s", - id_string, - &create_time, - firstname, - lastname); - if (4 != match) continue; - - LLUUID id(id_string); - if (id.isNull()) continue; - - // undo trivial XOR - S32 i; - for (i = 0; i < UUID_BYTES; i++) - { - id.mData[i] ^= 0x33; - } - - // Don't load entries that are more than a week old - if (create_time < delete_before_time) continue; - - LLCacheNameEntry* entry = new LLCacheNameEntry(); - entry->mIsGroup = false; - entry->mCreateTime = create_time; - entry->mFirstName = firstname; - entry->mLastName = lastname; - impl.mCache[id] = entry; - std::string fullname = entry->mFirstName + " " + entry->mLastName; - impl.mReverseCache[fullname] = id; - - count++; - } - - llinfos << "LLCacheName loaded " << count << " names" << llendl; -} - bool LLCacheName::importFile(std::istream& istr) { LLSD data; - if(LLSDSerialize::fromXML(data, istr) < 1) + if(LLSDSerialize::fromXMLDocument(data, istr) < 1) return false; // We'll expire entries more than a week old @@ -408,7 +335,7 @@ bool LLCacheName::importFile(std::istream& istr) entry->mFirstName = agent[FIRST].asString(); entry->mLastName = agent[LAST].asString(); impl.mCache[id] = entry; - std::string fullname = entry->mFirstName + " " + entry->mLastName; + std::string fullname = buildFullName(entry->mFirstName, entry->mLastName); impl.mReverseCache[fullname] = id; ++count; @@ -457,6 +384,7 @@ void LLCacheName::exportFile(std::ostream& ostr) // store it LLUUID id = iter->first; std::string id_str = id.asString(); + // IDEVO TODO: Should we store SLIDs with last name "Resident" or not? if(!entry->mFirstName.empty() && !entry->mLastName.empty()) { data[AGENTS][id_str][FIRST] = entry->mFirstName; @@ -474,7 +402,7 @@ void LLCacheName::exportFile(std::ostream& ostr) } -BOOL LLCacheName::getName(const LLUUID& id, std::string& first, std::string& last) +BOOL LLCacheName::Impl::getName(const LLUUID& id, std::string& first, std::string& last) { if(id.isNull()) { @@ -483,7 +411,7 @@ BOOL LLCacheName::getName(const LLUUID& id, std::string& first, std::string& las return TRUE; } - LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id ); + LLCacheNameEntry* entry = get_ptr_in_map(mCache, id ); if (entry) { first = entry->mFirstName; @@ -494,16 +422,17 @@ BOOL LLCacheName::getName(const LLUUID& id, std::string& first, std::string& las { first = sCacheName["waiting"]; last.clear(); - if (!impl.isRequestPending(id)) + if (!isRequestPending(id)) { - impl.mAskNameQueue.insert(id); + mAskNameQueue.insert(id); } return FALSE; } } + // static -void LLCacheName::LocalizeCacheName(std::string key, std::string value) +void LLCacheName::localizeCacheName(std::string key, std::string value) { if (key!="" && value!= "" ) sCacheName[key]=value; @@ -514,11 +443,13 @@ void LLCacheName::LocalizeCacheName(std::string key, std::string value) BOOL LLCacheName::getFullName(const LLUUID& id, std::string& fullname) { std::string first_name, last_name; - BOOL res = getName(id, first_name, last_name); - fullname = first_name + " " + last_name; + BOOL res = impl.getName(id, first_name, last_name); + fullname = buildFullName(first_name, last_name); return res; } + + BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) { if(id.isNull()) @@ -555,13 +486,13 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) BOOL LLCacheName::getUUID(const std::string& first, const std::string& last, LLUUID& id) { - std::string fullname = first + " " + last; - return getUUID(fullname, id); + std::string full_name = buildFullName(first, last); + return getUUID(full_name, id); } -BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id) +BOOL LLCacheName::getUUID(const std::string& full_name, LLUUID& id) { - ReverseCache::iterator iter = impl.mReverseCache.find(fullname); + ReverseCache::iterator iter = impl.mReverseCache.find(full_name); if (iter != impl.mReverseCache.end()) { id = iter->second; @@ -573,6 +504,89 @@ BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id) } } +//static +std::string LLCacheName::buildFullName(const std::string& first, const std::string& last) +{ + std::string fullname = first; + if (!last.empty() + && last != "Resident") + { + fullname += ' '; + fullname += last; + } + return fullname; +} + +//static +std::string LLCacheName::cleanFullName(const std::string& full_name) +{ + return full_name.substr(0, full_name.find(" Resident")); +} + +//static +std::string LLCacheName::buildUsername(const std::string& full_name) +{ + // rare, but handle hard-coded error names returned from server + if (full_name == "(\?\?\?) (\?\?\?)") + { + return "(\?\?\?)"; + } + + std::string::size_type index = full_name.find(' '); + + if (index != std::string::npos) + { + std::string username; + username = full_name.substr(0, index); + std::string lastname = full_name.substr(index+1); + + if (lastname != "Resident") + { + username = username + "." + lastname; + } + + LLStringUtil::toLower(username); + return username; + } + + // if the input wasn't a correctly formatted legacy name just return it unchanged + return full_name; +} + +//static +std::string LLCacheName::buildLegacyName(const std::string& complete_name) +{ + // regexp doesn't play nice with unicode, chop off the display name + S32 open_paren = complete_name.rfind(" ("); + + if (open_paren == std::string::npos) + { + return complete_name; + } + + std::string username = complete_name.substr(open_paren); + boost::regex complete_name_regex("( \\()([a-z0-9]+)(.[a-z]+)*(\\))"); + boost::match_results<std::string::const_iterator> name_results; + if (!boost::regex_match(username, name_results, complete_name_regex)) return complete_name; + + std::string legacy_name = name_results[2]; + // capitalize the first letter + std::string cap_letter = legacy_name.substr(0, 1); + LLStringUtil::toUpper(cap_letter); + legacy_name = cap_letter + legacy_name.substr(1); + + if (name_results[3].matched) + { + std::string last_name = name_results[3]; + std::string cap_letter = last_name.substr(1, 1); + LLStringUtil::toUpper(cap_letter); + last_name = cap_letter + last_name.substr(2); + legacy_name = legacy_name + " " + last_name; + } + + return legacy_name; +} + // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer. // The reason it is a slot is so that the legacy get() function below can bind an old callback // and pass it as a slot. The reason it isn't a boost::function is so that trackable behavior @@ -580,7 +594,7 @@ BOOL LLCacheName::getUUID(const std::string& fullname, LLUUID& id) // we call it immediately. -Steve // NOTE: Even though passing first and last name is a bit of extra overhead, it eliminates the // potential need for any parsing should any code need to handle first and last name independently. -boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, const LLCacheNameCallback& callback) +boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback) { boost::signals2::connection res; @@ -588,7 +602,7 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, co { LLCacheNameSignal signal; signal.connect(callback); - signal(id, sCacheName["nobody"], "", is_group); + signal(id, sCacheName["nobody"], is_group); return res; } @@ -600,11 +614,13 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, co // id found in map therefore we can call the callback immediately. if (entry->mIsGroup) { - signal(id, entry->mGroupName, "", entry->mIsGroup); + signal(id, entry->mGroupName, entry->mIsGroup); } else { - signal(id, entry->mFirstName, entry->mLastName, entry->mIsGroup); + std::string fullname = + buildFullName(entry->mFirstName, entry->mLastName); + signal(id, fullname, entry->mIsGroup); } } else @@ -626,9 +642,15 @@ boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, co return res; } -boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, old_callback_t callback, void* user_data) +boost::signals2::connection LLCacheName::getGroup(const LLUUID& group_id, + const LLCacheNameCallback& callback) { - return get(id, is_group, boost::bind(callback, _1, _2, _3, _4, user_data)); + return get(group_id, true, callback); +} + +boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, old_callback_t callback, void* user_data) +{ + return get(id, is_group, boost::bind(callback, _1, _2, _3, user_data)); } void LLCacheName::processPending() @@ -700,7 +722,7 @@ void LLCacheName::dump() { llinfos << iter->first << " = " - << entry->mFirstName << " " << entry->mLastName + << buildFullName(entry->mFirstName, entry->mLastName) << " @ " << entry->mCreateTime << llendl; } @@ -719,12 +741,24 @@ void LLCacheName::dumpStats() << llendl; } +void LLCacheName::clear() +{ + for_each(impl.mCache.begin(), impl.mCache.end(), DeletePairedPointer()); + impl.mCache.clear(); +} + //static std::string LLCacheName::getDefaultName() { return sCacheName["waiting"]; } +//static +std::string LLCacheName::getDefaultLastName() +{ + return "Resident"; +} + void LLCacheName::Impl::processPendingAsks() { LLMemType mt_ppa(LLMemType::MTYPE_CACHE_PROCESS_PENDING_ASKS); @@ -746,11 +780,13 @@ void LLCacheName::Impl::processPendingReplies() if (!entry->mIsGroup) { - (reply->mSignal)(reply->mID, entry->mFirstName, entry->mLastName, FALSE); + std::string fullname = + LLCacheName::buildFullName(entry->mFirstName, entry->mLastName); + (reply->mSignal)(reply->mID, fullname, false); } else { - (reply->mSignal)(reply->mID, entry->mGroupName, "", TRUE); + (reply->mSignal)(reply->mID, entry->mGroupName, true); } } @@ -921,13 +957,27 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup) if (!isGroup) { - mSignal(id, entry->mFirstName, entry->mLastName, FALSE); - std::string fullname = entry->mFirstName + " " + entry->mLastName; - mReverseCache[fullname] = id; + // NOTE: Very occasionally the server sends down a full name + // in the first name field with an empty last name, for example, + // first = "Ladanie1 Resident", last = "". + // I cannot reproduce this, nor can I find a bug in the server code. + // Ensure "Resident" does not appear via cleanFullName, because + // buildFullName only checks last name. JC + std::string full_name; + if (entry->mLastName.empty()) + { + full_name = cleanFullName(entry->mFirstName); + } + else + { + full_name = LLCacheName::buildFullName(entry->mFirstName, entry->mLastName); + } + mSignal(id, full_name, false); + mReverseCache[full_name] = id; } else { - mSignal(id, entry->mGroupName, "", TRUE); + mSignal(id, entry->mGroupName, true); mReverseCache[entry->mGroupName] = id; } } @@ -956,4 +1006,3 @@ void LLCacheName::Impl::handleUUIDGroupNameReply(LLMessageSystem* msg, void** us { ((LLCacheName::Impl*)userData)->processUUIDReply(msg, true); } - diff --git a/indra/llmessage/llcachename.h b/indra/llmessage/llcachename.h index ab65800cb0..b108e37157 100644 --- a/indra/llmessage/llcachename.h +++ b/indra/llmessage/llcachename.h @@ -36,13 +36,12 @@ class LLUUID; typedef boost::signals2::signal<void (const LLUUID& id, - const std::string& first_name, - const std::string& last_name, - BOOL is_group)> LLCacheNameSignal; + const std::string& name, + bool is_group)> LLCacheNameSignal; typedef LLCacheNameSignal::slot_type LLCacheNameCallback; // Old callback with user data for compatability -typedef void (*old_callback_t)(const LLUUID&, const std::string&, const std::string&, BOOL, void*); +typedef void (*old_callback_t)(const LLUUID&, const std::string&, bool, void*); // Here's the theory: // If you request a name that isn't in the cache, it returns "waiting" @@ -65,24 +64,37 @@ public: boost::signals2::connection addObserver(const LLCacheNameCallback& callback); - // janky old format. Remove after a while. Phoenix. 2008-01-30 - void importFile(LLFILE* fp); - // storing cache on disk; for viewer, in name.cache bool importFile(std::istream& istr); void exportFile(std::ostream& ostr); - // If available, copies the first and last name into the strings provided. - // first must be at least DB_FIRST_NAME_BUF_SIZE characters. - // last must be at least DB_LAST_NAME_BUF_SIZE characters. + // If available, copies name ("bobsmith123" or "James Linden") into string // If not available, copies the string "waiting". // Returns TRUE iff available. - BOOL getName(const LLUUID& id, std::string& first, std::string& last); - BOOL getFullName(const LLUUID& id, std::string& fullname); - + BOOL getFullName(const LLUUID& id, std::string& full_name); + // Reverse lookup of UUID from name BOOL getUUID(const std::string& first, const std::string& last, LLUUID& id); BOOL getUUID(const std::string& fullname, LLUUID& id); + + // IDEVO Temporary code + // Clean up new-style "bobsmith123 Resident" names to "bobsmith123" for display + static std::string buildFullName(const std::string& first, const std::string& last); + + // Clean up legacy "bobsmith123 Resident" to "bobsmith123" + // If name does not contain "Resident" returns it unchanged. + static std::string cleanFullName(const std::string& full_name); + + // Converts a standard legacy name to a username + // "bobsmith123 Resident" -> "bobsmith" + // "Random Linden" -> "random.linden" + static std::string buildUsername(const std::string& name); + + // Converts a complete display name to a legacy name + // if possible, otherwise returns the input + // "Alias (random.linden)" -> "Random Linden" + // "Something random" -> "Something random" + static std::string buildLegacyName(const std::string& name); // If available, this method copies the group name into the string // provided. The caller must allocate at least @@ -94,10 +106,15 @@ public: // If the data is currently available, may call the callback immediatly // otherwise, will request the data, and will call the callback when // available. There is no garuntee the callback will ever be called. - boost::signals2::connection get(const LLUUID& id, BOOL is_group, const LLCacheNameCallback& callback); - + boost::signals2::connection get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback); + + // Convenience method for looking up a group name, so you can + // tell the difference between avatar lookup and group lookup + // in global searches + boost::signals2::connection getGroup(const LLUUID& group_id, const LLCacheNameCallback& callback); + // LEGACY - boost::signals2::connection get(const LLUUID& id, BOOL is_group, old_callback_t callback, void* user_data); + boost::signals2::connection get(const LLUUID& id, bool is_group, old_callback_t callback, void* user_data); // This method needs to be called from time to time to send out // requests. void processPending(); @@ -108,9 +125,15 @@ public: // Debugging void dump(); // Dumps the contents of the cache void dumpStats(); // Dumps the sizes of the cache and associated queues. + void clear(); // Deletes all entries from the cache static std::string getDefaultName(); - static void LocalizeCacheName(std::string key, std::string value); + + // Returns "Resident", the default last name for SLID-based accounts + // that have no last name. + static std::string getDefaultLastName(); + + static void localizeCacheName(std::string key, std::string value); static std::map<std::string, std::string> sCacheName; private: diff --git a/indra/llmessage/mean_collision_data.h b/indra/llmessage/mean_collision_data.h index cf1063eb55..29de091603 100644 --- a/indra/llmessage/mean_collision_data.h +++ b/indra/llmessage/mean_collision_data.h @@ -55,7 +55,7 @@ public: LLMeanCollisionData(LLMeanCollisionData *mcd) : mVictim(mcd->mVictim), mPerp(mcd->mPerp), mTime(mcd->mTime), mType(mcd->mType), mMag(mcd->mMag), - mFirstName(mcd->mFirstName), mLastName(mcd->mLastName) + mFullName(mcd->mFullName) { } @@ -89,8 +89,7 @@ public: time_t mTime; EMeanCollisionType mType; F32 mMag; - std::string mFirstName; - std::string mLastName; + std::string mFullName; }; diff --git a/indra/llmessage/tests/llavatarnamecache_test.cpp b/indra/llmessage/tests/llavatarnamecache_test.cpp new file mode 100644 index 0000000000..ec6b65d483 --- /dev/null +++ b/indra/llmessage/tests/llavatarnamecache_test.cpp @@ -0,0 +1,102 @@ +/** + * @file llavatarnamecache_test.cpp + * @author James Cook + * @brief LLAvatarNameCache test cases. + * + * $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 "linden_common.h" + +#include "../llavatarnamecache.h" + +#include "../test/lltut.h" + +namespace tut +{ + struct avatarnamecache_data + { + }; + typedef test_group<avatarnamecache_data> avatarnamecache_test; + typedef avatarnamecache_test::object avatarnamecache_object; + tut::avatarnamecache_test avatarnamecache_testcase("LLAvatarNameCache"); + + template<> template<> + void avatarnamecache_object::test<1>() + { + bool valid = false; + S32 max_age = 0; + + valid = max_age_from_cache_control("max-age=3600", &max_age); + ensure("typical input valid", valid); + ensure_equals("typical input parsed", max_age, 3600); + + valid = max_age_from_cache_control( + " max-age=600 , no-cache,private=\"stuff\" ", &max_age); + ensure("complex input valid", valid); + ensure_equals("complex input parsed", max_age, 600); + + valid = max_age_from_cache_control( + "no-cache, max-age = 123 ", &max_age); + ensure("complex input 2 valid", valid); + ensure_equals("complex input 2 parsed", max_age, 123); + } + + template<> template<> + void avatarnamecache_object::test<2>() + { + bool valid = false; + S32 max_age = -1; + + valid = max_age_from_cache_control("", &max_age); + ensure("empty input returns invalid", !valid); + ensure_equals("empty input doesn't change val", max_age, -1); + + valid = max_age_from_cache_control("no-cache", &max_age); + ensure("no max-age field returns invalid", !valid); + + valid = max_age_from_cache_control("max", &max_age); + ensure("just 'max' returns invalid", !valid); + + valid = max_age_from_cache_control("max-age", &max_age); + ensure("partial max-age is invalid", !valid); + + valid = max_age_from_cache_control("max-age=", &max_age); + ensure("longer partial max-age is invalid", !valid); + + valid = max_age_from_cache_control("max-age=FOO", &max_age); + ensure("invalid integer max-age is invalid", !valid); + + valid = max_age_from_cache_control("max-age 234", &max_age); + ensure("space separated max-age is invalid", !valid); + + valid = max_age_from_cache_control("max-age=0", &max_age); + ensure("zero max-age is valid", valid); + + // *TODO: Handle "0000" as zero + //valid = max_age_from_cache_control("max-age=0000", &max_age); + //ensure("multi-zero max-age is valid", valid); + + valid = max_age_from_cache_control("max-age=-123", &max_age); + ensure("less than zero max-age is invalid", !valid); + } +} diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index fdd510b389..d3a73058c4 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -51,6 +51,14 @@ set(llplugin_HEADER_FILES set_source_files_properties(${llplugin_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) +if(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + add_definitions(/FIXED:NO) + else(WINDOWS) # not windows therefore gcc LINUX and DARWIN + add_definitions(-fPIC) + endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES}) add_library (llplugin ${llplugin_SOURCE_FILES}) diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index 9ce9ee2101..69ed0fb09c 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -74,6 +74,7 @@ bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::s // Queue up the media init message -- it will be sent after all the currently queued messages. LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init"); + message.setValue("target", mTarget); sendMessage(message); mPlugin->init(launcher_filename, plugin_filename, debug); @@ -143,7 +144,7 @@ void LLPluginClassMedia::reset() mProgressPercent = 0; mClickURL.clear(); mClickTarget.clear(); - mClickTargetType = TARGET_NONE; + mClickUUID.clear(); // media_time class mCurrentTime = 0.0f; @@ -669,6 +670,18 @@ F64 LLPluginClassMedia::getCPUUsage() return result; } +void LLPluginClassMedia::sendPickFileResponse(const std::string &file) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file_response"); + message.setValue("file", file); + if(mPlugin->isBlocked()) + { + // If the plugin sent a blocking pick-file request, the response should unblock it. + message.setValueBoolean("blocking_response", true); + } + sendMessage(message); +} + void LLPluginClassMedia::cut() { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "edit_cut"); @@ -715,24 +728,9 @@ void LLPluginClassMedia::setJavascriptEnabled(const bool enabled) sendMessage(message); } -LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type) +void LLPluginClassMedia::setTarget(const std::string &target) { - // convert a LinkTargetType value from llqtwebkit to an ETargetType - // so that we don't expose the llqtwebkit header in viewer code - switch (target_type) - { - case LLQtWebKit::LTT_TARGET_NONE: - return LLPluginClassMedia::TARGET_NONE; - - case LLQtWebKit::LTT_TARGET_BLANK: - return LLPluginClassMedia::TARGET_BLANK; - - case LLQtWebKit::LTT_TARGET_EXTERNAL: - return LLPluginClassMedia::TARGET_EXTERNAL; - - default: - return LLPluginClassMedia::TARGET_OTHER; - } + mTarget = target; } /* virtual */ @@ -945,6 +943,10 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mMediaName = message.getValue("name"); mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAME_CHANGED); } + else if(message_name == "pick_file") + { + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PICK_FILE_REQUEST); + } else { LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; @@ -987,15 +989,13 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) { mClickURL = message.getValue("uri"); mClickTarget = message.getValue("target"); - U32 target_type = message.getValueU32("target_type"); - mClickTargetType = ::getTargetTypeFromLLQtWebkit(target_type); + mClickUUID = message.getValue("uuid"); mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_HREF); } else if(message_name == "click_nofollow") { mClickURL = message.getValue("uri"); mClickTarget.clear(); - mClickTargetType = TARGET_NONE; mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW); } else if(message_name == "cookie_set") @@ -1005,6 +1005,20 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mOwner->handleCookieSet(this, message.getValue("cookie")); } } + else if(message_name == "close_request") + { + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLOSE_REQUEST); + } + else if(message_name == "geometry_change") + { + mClickUUID = message.getValue("uuid"); + mGeometryX = message.getValueS32("x"); + mGeometryY = message.getValueS32("y"); + mGeometryWidth = message.getValueS32("width"); + mGeometryHeight = message.getValueS32("height"); + + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE); + } else { LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL; @@ -1159,6 +1173,25 @@ void LLPluginClassMedia::setBrowserUserAgent(const std::string& user_agent) sendMessage(message); } +void LLPluginClassMedia::proxyWindowOpened(const std::string &target, const std::string &uuid) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_opened"); + + message.setValue("target", target); + message.setValue("uuid", uuid); + + sendMessage(message); +} + +void LLPluginClassMedia::proxyWindowClosed(const std::string &uuid) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "proxy_window_closed"); + + message.setValue("uuid", uuid); + + sendMessage(message); +} + void LLPluginClassMedia::crashPlugin() { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "crash"); diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index ee53f3a4da..9cb67fe909 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -156,6 +156,8 @@ public: void setLowPrioritySizeLimit(int size); F64 getCPUUsage(); + + void sendPickFileResponse(const std::string &file); // Valid after a MEDIA_EVENT_CURSOR_CHANGED event std::string getCursorName() const { return mCursorName; }; @@ -176,7 +178,8 @@ public: void setLanguageCode(const std::string &language_code); void setPluginsEnabled(const bool enabled); void setJavascriptEnabled(const bool enabled); - + void setTarget(const std::string &target); + /////////////////////////////////// // media browser class functions bool pluginSupportsMediaBrowser(void); @@ -193,6 +196,8 @@ public: void browse_back(); void set_status_redirect(int code, const std::string &url); void setBrowserUserAgent(const std::string& user_agent); + void proxyWindowOpened(const std::string &target, const std::string &uuid); + void proxyWindowClosed(const std::string &uuid); // This is valid after MEDIA_EVENT_NAVIGATE_BEGIN or MEDIA_EVENT_NAVIGATE_COMPLETE std::string getNavigateURI() const { return mNavigateURI; }; @@ -218,16 +223,14 @@ public: // This is valid after MEDIA_EVENT_CLICK_LINK_HREF std::string getClickTarget() const { return mClickTarget; }; - typedef enum - { - TARGET_NONE, // empty href target string - TARGET_BLANK, // target to open link in user's preferred browser - TARGET_EXTERNAL, // target to open link in external browser - TARGET_OTHER // nonempty and unsupported target type - }ETargetType; - - // This is valid after MEDIA_EVENT_CLICK_LINK_HREF - ETargetType getClickTargetType() const { return mClickTargetType; }; + // This is valid during MEDIA_EVENT_CLICK_LINK_HREF and MEDIA_EVENT_GEOMETRY_CHANGE + std::string getClickUUID() const { return mClickUUID; }; + + // These are valid during MEDIA_EVENT_GEOMETRY_CHANGE + S32 getGeometryX() const { return mGeometryX; }; + S32 getGeometryY() const { return mGeometryY; }; + S32 getGeometryWidth() const { return mGeometryWidth; }; + S32 getGeometryHeight() const { return mGeometryHeight; }; std::string getMediaName() const { return mMediaName; }; std::string getMediaDescription() const { return mMediaDescription; }; @@ -347,6 +350,8 @@ protected: LLColor4 mBackgroundColor; + std::string mTarget; + ///////////////////////////////////////// // media_browser class std::string mNavigateURI; @@ -359,7 +364,11 @@ protected: std::string mLocation; std::string mClickURL; std::string mClickTarget; - ETargetType mClickTargetType; + std::string mClickUUID; + S32 mGeometryX; + S32 mGeometryY; + S32 mGeometryWidth; + S32 mGeometryHeight; ///////////////////////////////////////// // media_time class diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index b48a5ca4ac..c9efff216c 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -54,6 +54,9 @@ public: MEDIA_EVENT_LOCATION_CHANGED, // browser location (URL) has changed (maybe due to internal navagation/frames/etc) MEDIA_EVENT_CLICK_LINK_HREF, // I'm not entirely sure what the semantics of these two are MEDIA_EVENT_CLICK_LINK_NOFOLLOW, + MEDIA_EVENT_CLOSE_REQUEST, // The plugin requested its window be closed (currently hooked up to javascript window.close in webkit) + MEDIA_EVENT_PICK_FILE_REQUEST, // The plugin wants the user to pick a file + MEDIA_EVENT_GEOMETRY_CHANGE, // The plugin requested its window geometry be changed (per the javascript window interface) MEDIA_EVENT_PLUGIN_FAILED_LAUNCH, // The plugin failed to launch MEDIA_EVENT_PLUGIN_FAILED // The plugin died unexpectedly diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index 08d35f9ae7..3fc54573a7 100644 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -79,4 +79,6 @@ if (DARWIN) ) endif (DARWIN) -ll_deploy_sharedlibs_command(SLPlugin) +if (LL_TESTS) + ll_deploy_sharedlibs_command(SLPlugin) +endif (LL_TESTS) diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp index 7d69e1c5cd..516a58db88 100644 --- a/indra/llplugin/slplugin/slplugin.cpp +++ b/indra/llplugin/slplugin/slplugin.cpp @@ -281,7 +281,7 @@ int main(int argc, char **argv) } // Check for a change in this process's frontmost window. - if(FrontWindow() != front_window) + if(GetFrontWindowOfClass(kAllWindowClasses, true) != front_window) { ProcessSerialNumber self = { 0, kCurrentProcess }; ProcessSerialNumber parent = { 0, kNoProcess }; @@ -307,7 +307,7 @@ int main(int argc, char **argv) } } - if((FrontWindow() != NULL) && (front_window == NULL)) + if((GetFrontWindowOfClass(kAllWindowClasses, true) != NULL) && (front_window == NULL)) { // Opening the first window @@ -319,7 +319,7 @@ int main(int argc, char **argv) if(layer_group) { - SetWindowGroup(FrontWindow(), layer_group); + SetWindowGroup(GetFrontWindowOfClass(kAllWindowClasses, true), layer_group); } if(parent_is_front_process) @@ -328,9 +328,9 @@ int main(int argc, char **argv) (void) SetFrontProcess( &self ); } - ActivateWindow(FrontWindow(), true); + ActivateWindow(GetFrontWindowOfClass(kAllWindowClasses, true), true); } - else if((FrontWindow() == NULL) && (front_window != NULL)) + else if((GetFrontWindowOfClass(kAllWindowClasses, true) == NULL) && (front_window != NULL)) { // Closing the last window @@ -350,7 +350,7 @@ int main(int argc, char **argv) window_hack_state = 2; } - front_window = FrontWindow(); + front_window = GetFrontWindowOfClass(kAllWindowClasses, true); } } diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 386bb987f9..13008292f6 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -977,37 +977,43 @@ LLFontGL::VAlign LLFontGL::vAlignFromName(const std::string& name) //static LLFontGL* LLFontGL::getFontMonospace() { - return getFont(LLFontDescriptor("Monospace","Monospace",0)); + static LLFontGL* fontp = getFont(LLFontDescriptor("Monospace","Monospace",0)); + return fontp; } //static LLFontGL* LLFontGL::getFontSansSerifSmall() { - return getFont(LLFontDescriptor("SansSerif","Small",0)); + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Small",0)); + return fontp; } //static LLFontGL* LLFontGL::getFontSansSerif() { - return getFont(LLFontDescriptor("SansSerif","Medium",0)); + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",0)); + return fontp; } //static LLFontGL* LLFontGL::getFontSansSerifBig() { - return getFont(LLFontDescriptor("SansSerif","Large",0)); + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Large",0)); + return fontp; } //static LLFontGL* LLFontGL::getFontSansSerifHuge() { - return getFont(LLFontDescriptor("SansSerif","Huge",0)); + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Large",0)); + return fontp; } //static LLFontGL* LLFontGL::getFontSansSerifBold() { - return getFont(LLFontDescriptor("SansSerif","Medium",BOLD)); + static LLFontGL* fontp = getFont(LLFontDescriptor("SansSerif","Medium",BOLD)); + return fontp; } //static diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index c0edd92bc1..6ea63809f8 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -610,41 +610,46 @@ void LLGLManager::shutdownGL() void LLGLManager::initExtensions() { #if LL_MESA_HEADLESS -# if GL_ARB_multitexture +# ifdef GL_ARB_multitexture mHasMultitexture = TRUE; # else mHasMultitexture = FALSE; # endif -# if GL_ARB_texture_env_combine +# ifdef GL_ARB_texture_env_combine mHasARBEnvCombine = TRUE; # else mHasARBEnvCombine = FALSE; # endif -# if GL_ARB_texture_compression +# ifdef GL_ARB_texture_compression mHasCompressedTextures = TRUE; # else mHasCompressedTextures = FALSE; # endif -# if GL_ARB_vertex_buffer_object +# ifdef GL_ARB_vertex_buffer_object mHasVertexBufferObject = TRUE; # else mHasVertexBufferObject = FALSE; # endif -# if GL_EXT_framebuffer_object +# ifdef GL_EXT_framebuffer_object mHasFramebufferObject = TRUE; # else mHasFramebufferObject = FALSE; # endif -# if GL_EXT_framebuffer_multisample +# ifdef GL_EXT_framebuffer_multisample mHasFramebufferMultisample = TRUE; # else mHasFramebufferMultisample = FALSE; # endif -# if GL_ARB_draw_buffers +# ifdef GL_ARB_draw_buffers mHasDrawBuffers = TRUE; #else mHasDrawBuffers = FALSE; # endif +# if defined(GL_NV_depth_clamp) || defined(GL_ARB_depth_clamp) + mHasDepthClamp = TRUE; +#else + mHasDepthClamp = FALSE; +#endif # if GL_EXT_blend_func_separate mHasBlendFuncSeparate = TRUE; #else @@ -671,6 +676,7 @@ void LLGLManager::initExtensions() mHasCompressedTextures = glh_init_extensions("GL_ARB_texture_compression"); mHasOcclusionQuery = ExtensionExists("GL_ARB_occlusion_query", gGLHExts.mSysExts); mHasVertexBufferObject = ExtensionExists("GL_ARB_vertex_buffer_object", gGLHExts.mSysExts); + mHasDepthClamp = ExtensionExists("GL_ARB_depth_clamp", gGLHExts.mSysExts) || ExtensionExists("GL_NV_depth_clamp", gGLHExts.mSysExts); // mask out FBO support when packed_depth_stencil isn't there 'cause we need it for LLRenderTarget -Brad mHasFramebufferObject = ExtensionExists("GL_EXT_framebuffer_object", gGLHExts.mSysExts) && ExtensionExists("GL_EXT_packed_depth_stencil", gGLHExts.mSysExts); @@ -694,6 +700,7 @@ void LLGLManager::initExtensions() if (getenv("LL_GL_NOEXT")) { //mHasMultitexture = FALSE; // NEEDED! + mHasDepthClamp = FALSE; mHasARBEnvCombine = FALSE; mHasCompressedTextures = FALSE; mHasVertexBufferObject = FALSE; @@ -755,6 +762,7 @@ void LLGLManager::initExtensions() if (strchr(blacklist,'s')) mHasFramebufferMultisample = FALSE; if (strchr(blacklist,'t')) mHasTextureRectangle = FALSE; if (strchr(blacklist,'u')) mHasBlendFuncSeparate = FALSE;//S + if (strchr(blacklist,'v')) mHasDepthClamp = FALSE; } #endif // LL_LINUX || LL_SOLARIS @@ -1047,6 +1055,33 @@ void flush_glerror() glGetError(); } +//this function outputs gl error to the log file, does not crash the code. +void log_glerror() +{ + if (LL_UNLIKELY(!gGLManager.mInited)) + { + return ; + } + // Create or update texture to be used with this data + GLenum error; + error = glGetError(); + while (LL_UNLIKELY(error)) + { + GLubyte const * gl_error_msg = gluErrorString(error); + if (NULL != gl_error_msg) + { + llwarns << "GL Error: " << error << " GL Error String: " << gl_error_msg << llendl ; + } + else + { + // gluErrorString returns NULL for some extensions' error codes. + // you'll probably have to grep for the number in glext.h. + llwarns << "GL Error: UNKNOWN 0x" << std::hex << error << std::dec << llendl; + } + error = glGetError(); + } +} + void do_assert_glerror() { if (LL_UNLIKELY(!gGLManager.mInited)) @@ -2037,7 +2072,7 @@ void LLGLDepthTest::checkState() } } -LLGLClampToFarClip::LLGLClampToFarClip(glh::matrix4f P) +LLGLSquashToFarClip::LLGLSquashToFarClip(glh::matrix4f P) { for (U32 i = 0; i < 4; i++) { @@ -2050,7 +2085,7 @@ LLGLClampToFarClip::LLGLClampToFarClip(glh::matrix4f P) glMatrixMode(GL_MODELVIEW); } -LLGLClampToFarClip::~LLGLClampToFarClip() +LLGLSquashToFarClip::~LLGLSquashToFarClip() { glMatrixMode(GL_PROJECTION); glPopMatrix(); diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 5e8965c06a..85fab7a0f8 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -92,6 +92,7 @@ public: BOOL mHasOcclusionQuery; BOOL mHasPointParameters; BOOL mHasDrawBuffers; + BOOL mHasDepthClamp; BOOL mHasTextureRectangle; // Other extensions. @@ -157,6 +158,7 @@ void rotate_quat(LLQuaternion& rotation); void flush_glerror(); // Flush GL errors when we know we're handling them correctly. +void log_glerror(); void assert_glerror(); void clear_glerror(); @@ -315,11 +317,11 @@ private: leaves this class. Does not stack. */ -class LLGLClampToFarClip +class LLGLSquashToFarClip { public: - LLGLClampToFarClip(glh::matrix4f projection); - ~LLGLClampToFarClip(); + LLGLSquashToFarClip(glh::matrix4f projection); + ~LLGLSquashToFarClip(); }; /* diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 5a34b46d0c..576969b81a 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -829,5 +829,15 @@ extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *); #endif // LL_MESA / LL_WINDOWS / LL_DARWIN +// Even when GL_ARB_depth_clamp is available in the driver, the (correct) +// headers, and therefore GL_DEPTH_CLAMP might not be defined. +// In that case GL_DEPTH_CLAMP_NV should be defined, but why not just +// use the known numeric. +// +// To avoid #ifdef's in the code. Just define this here. +#ifndef GL_DEPTH_CLAMP +// Probably (still) called GL_DEPTH_CLAMP_NV. +#define GL_DEPTH_CLAMP 0x864F +#endif #endif // LL_LLGLHEADERS_H diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index 9d037f2565..65940cb067 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -368,6 +368,18 @@ void LLImageGL::restoreGL() } } +//static +void LLImageGL::dirtyTexOptions() +{ + for (std::set<LLImageGL*>::iterator iter = sImageList.begin(); + iter != sImageList.end(); iter++) + { + LLImageGL* glimage = *iter; + glimage->mTexOptionsDirty = true; + stop_glerror(); + } + +} //---------------------------------------------------------------------------- //for server side use only. @@ -1057,6 +1069,8 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_ checkTexSize(true) ; llcallstacks << fb_x << " : " << fb_y << " : " << x_pos << " : " << y_pos << " : " << width << " : " << height << " : " << (S32)mComponents << llcallstacksendl ; + + log_glerror() ; } glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height); diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h index 87a835cdcc..6c980984c0 100644 --- a/indra/llrender/llimagegl.h +++ b/indra/llrender/llimagegl.h @@ -64,6 +64,7 @@ public: // Save off / restore GL textures static void destroyGL(BOOL save_state = TRUE); static void restoreGL(); + static void dirtyTexOptions(); // Sometimes called externally for textures not using LLImageGL (should go away...) static S32 updateBoundTexMem(const S32 mem, const S32 ncomponents, S32 category) ; diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp index e26acd53a3..8eb160f4e7 100644 --- a/indra/llrender/llrender.cpp +++ b/indra/llrender/llrender.cpp @@ -431,6 +431,9 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio if (gGL.mMaxAnisotropy < 1.f) { glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gGL.mMaxAnisotropy); + + llinfos << "gGL.mMaxAnisotropy: " << gGL.mMaxAnisotropy << llendl ; + gGL.mMaxAnisotropy = llmax(1.f, gGL.mMaxAnisotropy) ; } glTexParameterf(sGLTextureType[mCurrTexType], GL_TEXTURE_MAX_ANISOTROPY_EXT, gGL.mMaxAnisotropy); } diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index 890230bbe5..7205210fcc 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -384,8 +384,6 @@ void LLRenderTarget::flush(BOOL fetch_depth) } else { -#if !LL_DARWIN - stop_glerror(); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); @@ -429,7 +427,6 @@ void LLRenderTarget::flush(BOOL fetch_depth) } } } -#endif glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); } @@ -438,7 +435,6 @@ void LLRenderTarget::flush(BOOL fetch_depth) void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1, S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter) { -#if !LL_DARWIN gGL.flush(); if (!source.mFBO || !mFBO) { @@ -477,14 +473,12 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, stop_glerror(); } } -#endif } //static void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0, S32 srcY0, S32 srcX1, S32 srcY1, S32 dstX0, S32 dstY0, S32 dstX1, S32 dstY1, U32 mask, U32 filter) { -#if !LL_DARWIN if (!source.mFBO) { llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl; @@ -501,7 +495,6 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); stop_glerror(); } -#endif } BOOL LLRenderTarget::isComplete() const @@ -646,7 +639,6 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, BOOL depth void LLMultisampleBuffer::addColorAttachment(U32 color_fmt) { -#if !LL_DARWIN if (color_fmt == 0) { return; @@ -687,12 +679,10 @@ void LLMultisampleBuffer::addColorAttachment(U32 color_fmt) } mTex.push_back(tex); -#endif } void LLMultisampleBuffer::allocateDepth() { -#if !LL_DARWIN glGenRenderbuffersEXT(1, (GLuint* ) &mDepth); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth); if (mStencil) @@ -703,6 +693,5 @@ void LLMultisampleBuffer::allocateDepth() { glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH_COMPONENT16_ARB, mResX, mResY); } -#endif } diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index de4501dd0f..02160b09c4 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -27,7 +27,7 @@ #include "linden_common.h" #include <boost/static_assert.hpp> - +#include "llsys.h" #include "llvertexbuffer.h" // #include "llrender.h" #include "llglheaders.h" @@ -854,6 +854,14 @@ U8* LLVertexBuffer::mapBuffer(S32 access) if (!mMappedData) { + log_glerror(); + + //check the availability of memory + U32 avail_phy_mem, avail_vir_mem; + LLMemoryInfo::getAvailableMemoryKB(avail_phy_mem, avail_vir_mem) ; + llinfos << "Available physical mwmory(KB): " << avail_phy_mem << llendl ; + llinfos << "Available virtual memory(KB): " << avail_vir_mem << llendl; + //-------------------- //print out more debug info before crash llinfos << "vertex buffer size: (num verts : num indices) = " << getNumVerts() << " : " << getNumIndices() << llendl ; @@ -875,6 +883,8 @@ U8* LLVertexBuffer::mapBuffer(S32 access) if (!mMappedIndexData) { + log_glerror(); + GLint buff; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB, &buff); if ((GLuint)buff != mGLIndices) diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 8e78a5fefd..e98201ea63 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -158,6 +158,7 @@ set(llui_HEADER_FILES llnotifications.h llnotificationslistener.h llnotificationsutil.h + llnotificationtemplate.h llpanel.h llprogressbar.h llradiogroup.h diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp index f9ffaaa646..d636161baf 100644 --- a/indra/llui/llaccordionctrl.cpp +++ b/indra/llui/llaccordionctrl.cpp @@ -83,7 +83,7 @@ LLAccordionCtrl::LLAccordionCtrl() : LLPanel() mSingleExpansion = false; mFitParent = false; - LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml"); + buildFromFile( "accordion_parent.xml"); } //--------------------------------------------------------------------------------- diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 32112c6c51..9d49c1a831 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -141,6 +141,7 @@ LLAccordionCtrlTab::LLAccordionCtrlTabHeader::LLAccordionCtrlTabHeader( textboxParams.use_ellipses = true; textboxParams.bg_visible = false; textboxParams.mouse_opaque = false; + textboxParams.parse_urls = false; mHeaderTextbox = LLUICtrlFactory::create<LLTextBox>(textboxParams); addChild(mHeaderTextbox); } @@ -455,8 +456,7 @@ BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask) { if(y >= (getRect().getHeight() - HEADER_HEIGHT) ) { - LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - header->setFocus(true); + mHeader->setFocus(true); changeOpenClose(getDisplayChildren()); //reset stored state @@ -508,10 +508,9 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel) std::string LLAccordionCtrlTab::getTitle() const { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - return header->getTitle(); + return mHeader->getTitle(); } else { @@ -521,57 +520,51 @@ std::string LLAccordionCtrlTab::getTitle() const void LLAccordionCtrlTab::setTitle(const std::string& title, const std::string& hl) { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - header->setTitle(title, hl); + mHeader->setTitle(title, hl); } } void LLAccordionCtrlTab::setTitleFontStyle(std::string style) { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - header->setTitleFontStyle(style); + mHeader->setTitleFontStyle(style); } } void LLAccordionCtrlTab::setTitleColor(LLUIColor color) { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - header->setTitleColor(color); + mHeader->setTitleColor(color); } } boost::signals2::connection LLAccordionCtrlTab::setFocusReceivedCallback(const focus_signal_t::slot_type& cb) { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - return header->setFocusReceivedCallback(cb); + return mHeader->setFocusReceivedCallback(cb); } return boost::signals2::connection(); } boost::signals2::connection LLAccordionCtrlTab::setFocusLostCallback(const focus_signal_t::slot_type& cb) { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - return header->setFocusLostCallback(cb); + return mHeader->setFocusLostCallback(cb); } return boost::signals2::connection(); } void LLAccordionCtrlTab::setSelected(bool is_selected) { - LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if (header) + if (mHeader) { - header->setSelected(is_selected); + mHeader->setSelected(is_selected); } } @@ -775,8 +768,7 @@ S32 LLAccordionCtrlTab::notify(const LLSD& info) BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent) { - LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - if( !header->hasFocus() ) + if( !mHeader->hasFocus() ) return LLUICtrl::handleKey(key, mask, called_from_parent); if ( (key == KEY_RETURN )&& mask == MASK_NONE) @@ -829,15 +821,19 @@ BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent) void LLAccordionCtrlTab::showAndFocusHeader() { - LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME); - header->setFocus(true); - header->setSelected(mSelectionEnabled); + mHeader->setFocus(true); + mHeader->setSelected(mSelectionEnabled); LLRect screen_rc; - LLRect selected_rc = header->getRect(); + LLRect selected_rc = mHeader->getRect(); localRectToScreen(selected_rc, &screen_rc); - notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue())); + // This call to notifyParent() is intended to deliver "scrollToShowRect" command + // to the parent LLAccordionCtrl so by calling it from the direct parent of this + // accordion tab (assuming that the parent is an LLAccordionCtrl) the calls chain + // is shortened and messages from inside the collapsed tabs are avoided. + // See STORM-536. + getParent()->notifyParent(LLSD().with("scrollToShowRect",screen_rc.getValue())); } void LLAccordionCtrlTab::storeOpenCloseState() { diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h index d6ac8cbc8f..dddaa581e6 100644 --- a/indra/llui/llaccordionctrltab.h +++ b/indra/llui/llaccordionctrltab.h @@ -85,10 +85,10 @@ public: Optional<bool> selection_enabled; - Optional<S32> padding_left; - Optional<S32> padding_right; - Optional<S32> padding_top; - Optional<S32> padding_bottom; + Optional<S32> padding_left, + padding_right, + padding_top, + padding_bottom; Params(); }; @@ -170,7 +170,7 @@ public: virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks ); - virtual bool addChild(LLView* child, S32 tab_group); + virtual bool addChild(LLView* child, S32 tab_group = 0 ); bool isExpanded() const { return mDisplayChildren; } diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index cbc8f12472..bbd8db2645 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -50,9 +50,7 @@ template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>( const std::string& name, BOOL recurse) const; LLCheckBoxCtrl::Params::Params() -: text_enabled_color("text_enabled_color"), - text_disabled_color("text_disabled_color"), - initial_value("initial_value", false), +: initial_value("initial_value", false), label_text("label_text"), check_button("check_button"), radio_style("radio_style") @@ -61,8 +59,8 @@ LLCheckBoxCtrl::Params::Params() LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p) : LLUICtrl(p), - mTextEnabledColor(p.text_enabled_color()), - mTextDisabledColor(p.text_disabled_color()), + mTextEnabledColor(p.label_text.text_color()), + mTextDisabledColor(p.label_text.text_readonly_color()), mFont(p.font()) { mViewModel->setValue(LLSD(p.initial_value)); @@ -89,7 +87,6 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p) { tbparams.font(p.font); } - tbparams.text_color( p.enabled() ? p.text_enabled_color() : p.text_disabled_color() ); mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams); addChild(mLabel); diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h index 0147088280..67d8091a97 100644 --- a/indra/llui/llcheckboxctrl.h +++ b/indra/llui/llcheckboxctrl.h @@ -52,8 +52,6 @@ public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<LLUIColor> text_enabled_color; - Optional<LLUIColor> text_disabled_color; Optional<bool> initial_value; // override LLUICtrl initial_value Optional<LLTextBox::Params> label_text; diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 910bab9a97..2dabbc7767 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -52,8 +52,6 @@ #include "lltooltip.h" // Globals -S32 LLCOMBOBOX_HEIGHT = 0; -S32 LLCOMBOBOX_WIDTH = 0; S32 MAX_COMBO_WIDTH = 500; static LLDefaultChildRegistry::Register<LLComboBox> register_combo_box("combo_box"); @@ -139,8 +137,8 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p) // Grab the mouse-up event and make sure the button state is correct mList->setMouseUpCallback(boost::bind(&LLComboBox::onListMouseUp, this)); - for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin(); - it != p.items().end(); + for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items.begin(); + it != p.items.end(); ++it) { LLScrollListItem::Params item_params = *it; @@ -486,7 +484,7 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p) LLLineEditor::Params params = p.combo_editor; params.rect(text_entry_rect); params.default_text(LLStringUtil::null); - params.max_length_bytes(mMaxChars); + params.max_length.bytes(mMaxChars); params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2)); params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1)); params.commit_on_focus_lost(false); @@ -705,10 +703,10 @@ void LLComboBox::onItemSelected(const LLSD& data) setLabel(getSelectedItemLabel()); if (mAllowTextEntry) - { - gFocusMgr.setKeyboardFocus(mTextEntry); - mTextEntry->selectAll(); - } + { + gFocusMgr.setKeyboardFocus(mTextEntry); + mTextEntry->selectAll(); + } } // hiding the list reasserts the old value stored in the text editor/dropdown button hideList(); diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h index f369147ded..5f0e4a6843 100644 --- a/indra/llui/llcombobox.h +++ b/indra/llui/llcombobox.h @@ -43,9 +43,6 @@ class LLFontGL; class LLViewBorder; -extern S32 LLCOMBOBOX_HEIGHT; -extern S32 LLCOMBOBOX_WIDTH; - class LLComboBox : public LLUICtrl, public LLCtrlListInterface { @@ -224,8 +221,8 @@ private: commit_callback_t mPrearrangeCallback; commit_callback_t mTextEntryCallback; commit_callback_t mSelectionCallback; - boost::signals2::connection mTopLostSignalConnection; - S32 mLastSelectedIndex; + boost::signals2::connection mTopLostSignalConnection; + S32 mLastSelectedIndex; }; // A combo box with icons for the list of items. diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index d23b876543..34d8e9c500 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -36,6 +36,7 @@ #include "lluictrlfactory.h" #include "llbutton.h" #include "llcheckboxctrl.h" +#include "lldir.h" #include "lldraghandle.h" #include "llfloaterreg.h" #include "llfocusmgr.h" @@ -60,6 +61,9 @@ // use this to control "jumping" behavior when Ctrl-Tabbing const S32 TABBED_FLOATER_OFFSET = 0; +// static +F32 LLFloater::sActiveFloaterTransparency = 0.0f; +F32 LLFloater::sInactiveFloaterTransparency = 0.0f; std::string LLFloater::sButtonNames[BUTTON_COUNT] = { @@ -199,6 +203,21 @@ void LLFloater::initClass() { sButtonToolTips[i] = LLTrans::getString( sButtonToolTipsIndex[i] ); } + + LLControlVariable* ctrl = LLUI::sSettingGroups["config"]->getControl("ActiveFloaterTransparency").get(); + if (ctrl) + { + ctrl->getSignal()->connect(boost::bind(&LLFloater::updateActiveFloaterTransparency)); + sActiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("ActiveFloaterTransparency"); + } + + ctrl = LLUI::sSettingGroups["config"]->getControl("InactiveFloaterTransparency").get(); + if (ctrl) + { + ctrl->getSignal()->connect(boost::bind(&LLFloater::updateInactiveFloaterTransparency)); + sInactiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("InactiveFloaterTransparency"); + } + } // defaults for floater param block pulled from widgets/floater.xml @@ -346,6 +365,18 @@ void LLFloater::layoutDragHandle() updateTitleButtons(); } +// static +void LLFloater::updateActiveFloaterTransparency() +{ + sActiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("ActiveFloaterTransparency"); +} + +// static +void LLFloater::updateInactiveFloaterTransparency() +{ + sInactiveFloaterTransparency = LLUI::sSettingGroups["config"]->getF32("InactiveFloaterTransparency"); +} + void LLFloater::addResizeCtrls() { // Resize bars (sides) @@ -1621,7 +1652,8 @@ void LLFloater::onClickCloseBtn() // virtual void LLFloater::draw() { - F32 alpha = getDrawContext().mAlpha; + mCurrentTransparency = hasFocus() ? sActiveFloaterTransparency : sInactiveFloaterTransparency; + // draw background if( isBackgroundVisible() ) { @@ -1652,12 +1684,12 @@ void LLFloater::draw() if (image) { // We're using images for this floater's backgrounds - image->draw(getLocalRect(), overlay_color % alpha); + image->draw(getLocalRect(), overlay_color % mCurrentTransparency); } else { // We're not using images, use old-school flat colors - gl_rect_2d( left, top, right, bottom, color % alpha ); + gl_rect_2d( left, top, right, bottom, color % mCurrentTransparency ); // draw highlight on title bar to indicate focus. RDW if(hasFocus() @@ -1669,7 +1701,7 @@ void LLFloater::draw() const LLFontGL* font = LLFontGL::getFontSansSerif(); LLRect r = getRect(); gl_rect_2d_offset_local(0, r.getHeight(), r.getWidth(), r.getHeight() - (S32)font->getLineHeight() - 1, - titlebar_focus_color % alpha, 0, TRUE); + titlebar_focus_color % mCurrentTransparency, 0, TRUE); } } } @@ -1719,7 +1751,6 @@ void LLFloater::draw() void LLFloater::drawShadow(LLPanel* panel) { - F32 alpha = panel->getDrawContext().mAlpha; S32 left = LLPANEL_BORDER_WIDTH; S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH; S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH; @@ -1736,7 +1767,7 @@ void LLFloater::drawShadow(LLPanel* panel) shadow_color.mV[VALPHA] *= 0.5f; } gl_drop_shadow(left, top, right, bottom, - shadow_color % alpha, + shadow_color % mCurrentTransparency, llround(shadow_offset)); } @@ -2829,7 +2860,8 @@ LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build"); bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node) { Params params(LLUICtrlFactory::getDefaultParams<LLFloater>()); - LLXUIParser::instance().readXUI(node, params, filename); // *TODO: Error checking + LLXUIParser parser; + parser.readXUI(node, params, filename); // *TODO: Error checking if (output_node) { @@ -2837,8 +2869,7 @@ bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::str setupParamsForExport(output_params, parent); Params default_params(LLUICtrlFactory::getDefaultParams<LLFloater>()); output_node->setName(node->getName()->mString); - LLXUIParser::instance().writeXUI( - output_node, output_params, &default_params); + parser.writeXUI(output_node, output_params, &default_params); } // Default floater position to top-left corner of screen @@ -2933,3 +2964,64 @@ bool LLFloater::isVisible(const LLFloater* floater) { return floater && floater->getVisible(); } + +static LLFastTimer::DeclareTimer FTM_BUILD_FLOATERS("Build Floaters"); + +bool LLFloater::buildFromFile(const std::string& filename, LLXMLNodePtr output_node) +{ + LLFastTimer timer(FTM_BUILD_FLOATERS); + LLXMLNodePtr root; + + //if exporting, only load the language being exported, + //instead of layering localized version on top of english + if (output_node) + { + if (!LLUICtrlFactory::getLocalizedXMLNode(filename, root)) + { + llwarns << "Couldn't parse floater from: " << LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; + return false; + } + } + else if (!LLUICtrlFactory::getLayeredXMLNode(filename, root)) + { + llwarns << "Couldn't parse floater from: " << LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; + return false; + } + + // root must be called floater + if( !(root->hasName("floater") || root->hasName("multi_floater")) ) + { + llwarns << "Root node should be named floater in: " << filename << llendl; + return false; + } + + bool res = true; + + lldebugs << "Building floater " << filename << llendl; + LLUICtrlFactory::instance().pushFileName(filename); + { + if (!getFactoryMap().empty()) + { + LLPanel::sFactoryStack.push_front(&getFactoryMap()); + } + + // for local registry callbacks; define in constructor, referenced in XUI or postBuild + getCommitCallbackRegistrar().pushScope(); + getEnableCallbackRegistrar().pushScope(); + + res = initFloaterXML(root, getParent(), filename, output_node); + + setXMLFilename(filename); + + getCommitCallbackRegistrar().popScope(); + getEnableCallbackRegistrar().popScope(); + + if (!getFactoryMap().empty()) + { + LLPanel::sFactoryStack.pop_front(); + } + } + LLUICtrlFactory::instance().popFileName(); + + return res; +} diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index d26f41b4c7..fa806bb632 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -141,6 +141,7 @@ public: // Don't export top/left for rect, only height/width static void setupParamsForExport(Params& p, LLView* parent); + bool buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL); boost::signals2::connection setMinimizeCallback( const commit_signal_t::slot_type& cb ); @@ -340,6 +341,9 @@ private: void addDragHandle(); void layoutDragHandle(); // repair layout + static void updateActiveFloaterTransparency(); + static void updateInactiveFloaterTransparency(); + public: // Called when floater is opened, passes mKey // Public so external views or floaters can watch for this floater opening @@ -407,6 +411,11 @@ private: bool mDocked; bool mTornOff; + F32 mCurrentTransparency; + + static F32 sActiveFloaterTransparency; + static F32 sInactiveFloaterTransparency; + static LLMultiFloater* sHostp; static BOOL sQuitting; static std::string sButtonNames[BUTTON_COUNT]; diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp index 4720ebb822..4677d535db 100644 --- a/indra/llui/llfloaterreg.cpp +++ b/indra/llui/llfloaterreg.cpp @@ -121,7 +121,7 @@ LLFloater* LLFloaterReg::getInstance(const std::string& name, const LLSD& key) res = build_func(key); - bool success = LLUICtrlFactory::getInstance()->buildFloater(res, xui_file, NULL); + bool success = res->buildFromFile(xui_file, NULL); if (!success) { llwarns << "Failed to build floater type: '" << name << "'." << llendl; diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 0ff7557ead..940c7e7e18 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -35,95 +35,66 @@ #include "llresizebar.h" #include "llcriticaldamp.h" -static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack", &LLLayoutStack::fromXML); - +static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("layout_stack"); +static LLLayoutStack::LayoutStackRegistry::Register<LLLayoutPanel> register_layout_panel("layout_panel"); // -// LLLayoutStack +// LLLayoutPanel // -struct LLLayoutStack::LayoutPanel -{ - LayoutPanel(LLPanel* panelp, ELayoutOrientation orientation, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize) : mPanel(panelp), - mMinWidth(min_width), - mMinHeight(min_height), - mMaxWidth(max_width), - mMaxHeight(max_height), - mAutoResize(auto_resize), - mUserResize(user_resize), - mOrientation(orientation), +LLLayoutPanel::LLLayoutPanel(const Params& p) +: LLPanel(p), + mMinDim(p.min_dim), + mMaxDim(p.max_dim), + mAutoResize(p.auto_resize), + mUserResize(p.user_resize), mCollapsed(FALSE), mCollapseAmt(0.f), mVisibleAmt(1.f), // default to fully visible mResizeBar(NULL) { - LLResizeBar::Side side = (orientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM; - LLRect resize_bar_rect = panelp->getRect(); - - S32 min_dim; - if (orientation == HORIZONTAL) + // panels initialized as hidden should not start out partially visible + if (!getVisible()) { - min_dim = mMinHeight; + mVisibleAmt = 0.f; } - else - { - min_dim = mMinWidth; - } - LLResizeBar::Params p; - p.name("resize"); - p.resizing_view(mPanel); - p.min_size(min_dim); - p.side(side); - p.snapping_enabled(false); - mResizeBar = LLUICtrlFactory::create<LLResizeBar>(p); - // panels initialized as hidden should not start out partially visible - if (!mPanel->getVisible()) - { - mVisibleAmt = 0.f; } + +void LLLayoutPanel::initFromParams(const Params& p) + { + LLPanel::initFromParams(p); + setFollowsNone(); } - ~LayoutPanel() + +LLLayoutPanel::~LLLayoutPanel() { // probably not necessary, but... delete mResizeBar; mResizeBar = NULL; } - F32 getCollapseFactor() +F32 LLLayoutPanel::getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation) { - if (mOrientation == HORIZONTAL) + if (orientation == LLLayoutStack::HORIZONTAL) { F32 collapse_amt = - clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinWidth / (F32)llmax(1, mPanel->getRect().getWidth())); + clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, (F32)mMinDim / (F32)llmax(1, getRect().getWidth())); return mVisibleAmt * collapse_amt; } else { F32 collapse_amt = - clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, llmin(1.f, (F32)mMinHeight / (F32)llmax(1, mPanel->getRect().getHeight()))); + clamp_rescale(mCollapseAmt, 0.f, 1.f, 1.f, llmin(1.f, (F32)mMinDim / (F32)llmax(1, getRect().getHeight()))); return mVisibleAmt * collapse_amt; } } - LLPanel* mPanel; - S32 mMinWidth; - S32 mMinHeight; - - // mMaxWidth & mMaxHeight are added to make configurable max width of the nearby chat bar. EXT-5589 - // they are not processed by LLLayoutStack but they can be if necessary - S32 mMaxWidth; - S32 mMaxHeight; - BOOL mAutoResize; - BOOL mUserResize; - BOOL mCollapsed; - LLResizeBar* mResizeBar; - ELayoutOrientation mOrientation; - F32 mVisibleAmt; - F32 mCollapseAmt; -}; +// +// LLLayoutStack +// LLLayoutStack::Params::Params() -: orientation("orientation", std::string("vertical")), +: orientation("orientation"), animate("animate", true), clip("clip", true), border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0)) @@ -157,18 +128,18 @@ void LLLayoutStack::draw() for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { // clip to layout rectangle, not bounding rectangle - LLRect clip_rect = (*panel_it)->mPanel->getRect(); + LLRect clip_rect = (*panel_it)->getRect(); // scale clipping rectangle by visible amount if (mOrientation == HORIZONTAL) { - clip_rect.mRight = clip_rect.mLeft + llround((F32)clip_rect.getWidth() * (*panel_it)->getCollapseFactor()); + clip_rect.mRight = clip_rect.mLeft + llround((F32)clip_rect.getWidth() * (*panel_it)->getCollapseFactor(mOrientation)); } else { - clip_rect.mBottom = clip_rect.mTop - llround((F32)clip_rect.getHeight() * (*panel_it)->getCollapseFactor()); + clip_rect.mBottom = clip_rect.mTop - llround((F32)clip_rect.getHeight() * (*panel_it)->getCollapseFactor(mOrientation)); } - LLPanel* panelp = (*panel_it)->mPanel; + LLPanel* panelp = (*panel_it); LLLocalClipRect clip(clip_rect, mClip); // only force drawing invisible children if visible amount is non-zero @@ -179,7 +150,7 @@ void LLLayoutStack::draw() void LLLayoutStack::removeChild(LLView* view) { - LayoutPanel* embedded_panelp = findEmbeddedPanel(dynamic_cast<LLPanel*>(view)); + LLLayoutPanel* embedded_panelp = findEmbeddedPanel(dynamic_cast<LLPanel*>(view)); if (embedded_panelp) { @@ -200,149 +171,16 @@ BOOL LLLayoutStack::postBuild() return TRUE; } -static void get_attribute_s32_and_write(LLXMLNodePtr node, - const char* name, - S32 *value, - S32 default_value, - LLXMLNodePtr output_child) -{ - BOOL has_attr = node->getAttributeS32(name, *value); - if (has_attr && *value != default_value && output_child) - { - // create an attribute child node - LLXMLNodePtr child_attr = output_child->createChild(name, TRUE); - child_attr->setIntValue(*value); - } -} - -static void get_attribute_bool_and_write(LLXMLNodePtr node, - const char* name, - BOOL *value, - BOOL default_value, - LLXMLNodePtr output_child) -{ - BOOL has_attr = node->getAttributeBOOL(name, *value); - if (has_attr && *value != default_value && output_child) - { - LLXMLNodePtr child_attr = output_child->createChild(name, TRUE); - child_attr->setBoolValue(*value); - } -} -//static -LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node) -{ - LLLayoutStack::Params p(LLUICtrlFactory::getDefaultParams<LLLayoutStack>()); - LLXUIParser::instance().readXUI(node, p, LLUICtrlFactory::getInstance()->getCurFileName()); - - // Export must happen before setupParams() mungles rectangles and before - // this item gets added to parent (otherwise screws up last_child_rect - // logic). JC - if (output_node) - { - Params output_params(p); - setupParamsForExport(output_params, parent); - LLLayoutStack::Params default_params(LLUICtrlFactory::getDefaultParams<LLLayoutStack>()); - output_node->setName(node->getName()->mString); - LLXUIParser::instance().writeXUI( - output_node, output_params, &default_params); - } - - p.from_xui = true; - applyXUILayout(p, parent); - LLLayoutStack* layout_stackp = LLUICtrlFactory::create<LLLayoutStack>(p); - - if (parent && layout_stackp) - { - S32 tab_group = p.tab_group.isProvided() ? p.tab_group() : parent->getLastTabGroup(); - - parent->addChild(layout_stackp, tab_group); - } - - for (LLXMLNodePtr child_node = node->getFirstChild(); child_node.notNull(); child_node = child_node->getNextSibling()) - { - const S32 DEFAULT_MIN_WIDTH = 0; - const S32 DEFAULT_MIN_HEIGHT = 0; - const S32 DEFAULT_MAX_WIDTH = S32_MAX; - const S32 DEFAULT_MAX_HEIGHT = S32_MAX; - const BOOL DEFAULT_AUTO_RESIZE = TRUE; - - S32 min_width = DEFAULT_MIN_WIDTH; - S32 min_height = DEFAULT_MIN_HEIGHT; - S32 max_width = DEFAULT_MAX_WIDTH; - S32 max_height = DEFAULT_MAX_HEIGHT; - BOOL auto_resize = DEFAULT_AUTO_RESIZE; - - LLXMLNodePtr output_child; - if (output_node) +bool LLLayoutStack::addChild(LLView* child, S32 tab_group) { - output_child = output_node->createChild("", FALSE); - } - - // Layout stack allows child nodes to acquire additional attributes, - // such as "min_width" in: <button label="Foo" min_width="100"/> - // If these attributes exist and have non-default values, write them - // to the output node. - get_attribute_s32_and_write(child_node, "min_width", &min_width, - DEFAULT_MIN_WIDTH, output_child); - get_attribute_s32_and_write(child_node, "min_height", &min_height, - DEFAULT_MIN_HEIGHT, output_child); - get_attribute_s32_and_write(child_node, "max_width", &max_width, - DEFAULT_MAX_WIDTH, output_child); - get_attribute_s32_and_write(child_node, "max_height", &max_height, - DEFAULT_MAX_HEIGHT, output_child); - get_attribute_bool_and_write(child_node, "auto_resize", &auto_resize, - DEFAULT_AUTO_RESIZE, output_child); - - if (child_node->hasName("layout_panel")) - { - BOOL user_resize = TRUE; - get_attribute_bool_and_write(child_node, "user_resize", &user_resize, - TRUE, output_child); - LLPanel* panelp = (LLPanel*)LLPanel::fromXML(child_node, layout_stackp, output_child); + LLLayoutPanel* panelp = dynamic_cast<LLLayoutPanel*>(child); if (panelp) { - panelp->setFollowsNone(); - layout_stackp->addPanel(panelp, min_width, min_height, max_width, max_height, auto_resize, user_resize); + mPanels.push_back(panelp); } + return LLView::addChild(child, tab_group); } - else - { - BOOL user_resize = FALSE; - get_attribute_bool_and_write(child_node, "user_resize", &user_resize, - FALSE, output_child); - - LLPanel::Params p; - p.mouse_opaque(false); - LLPanel* panelp = LLUICtrlFactory::create<LLPanel>(p); - LLView* new_child = LLUICtrlFactory::getInstance()->createFromXML(child_node, panelp, LLStringUtil::null, LLPanel::child_registry_t::instance(), output_child); - if (new_child) - { - // put child in new embedded panel - layout_stackp->addPanel(panelp, min_width, min_height, max_width, max_height, auto_resize, user_resize); - // resize panel to contain widget and move widget to be contained in panel - panelp->setRect(new_child->getRect()); - new_child->setOrigin(0, 0); - } - else - { - panelp->die(); - } - } - - if (output_child && !output_child->mChildren && output_child->mAttributes.empty() && output_child->getValue().empty()) - { - output_node->deleteChild(output_child); - } - } - - if (!layout_stackp->postBuild()) - { - delete layout_stackp; - return NULL; - } - return layout_stackp; -} S32 LLLayoutStack::getDefaultHeight(S32 cur_height) { @@ -370,8 +208,8 @@ S32 LLLayoutStack::getDefaultWidth(S32 cur_width) void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel, bool move_to_front) { - LayoutPanel* embedded_panel_to_move = findEmbeddedPanel(panel_to_move); - LayoutPanel* embedded_target_panel = move_to_front ? *mPanels.begin() : findEmbeddedPanel(target_panel); + LLLayoutPanel* embedded_panel_to_move = findEmbeddedPanel(panel_to_move); + LLLayoutPanel* embedded_target_panel = move_to_front ? *mPanels.begin() : findEmbeddedPanel(target_panel); if (!embedded_panel_to_move || !embedded_target_panel || embedded_panel_to_move == embedded_target_panel) { @@ -384,34 +222,14 @@ void LLLayoutStack::movePanel(LLPanel* panel_to_move, LLPanel* target_panel, boo mPanels.insert(it, embedded_panel_to_move); } -void LLLayoutStack::addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate, S32 index) +void LLLayoutStack::addPanel(LLLayoutPanel* panel, EAnimate animate) { - // panel starts off invisible (collapsed) - if (animate == ANIMATE) - { - panel->setVisible(FALSE); - } - LayoutPanel* embedded_panel = new LayoutPanel(panel, mOrientation, min_width, min_height, max_width, max_height, auto_resize, user_resize); - - mPanels.insert(mPanels.begin() + llclamp(index, 0, (S32)mPanels.size()), embedded_panel); - - if (panel->getParent() != this) - { - addChild(panel); - } - addChild(embedded_panel->mResizeBar); + addChild(panel); - // bring all resize bars to the front so that they are clickable even over the panels - // with a bit of overlap - for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) - { - LLResizeBar* resize_barp = (*panel_it)->mResizeBar; - sendChildToFront(resize_barp); - } - - // start expanding panel animation + // panel starts off invisible (collapsed) if (animate == ANIMATE) { + panel->mVisibleAmt = 0.f; panel->setVisible(TRUE); } } @@ -423,7 +241,7 @@ void LLLayoutStack::removePanel(LLPanel* panel) void LLLayoutStack::collapsePanel(LLPanel* panel, BOOL collapsed) { - LayoutPanel* panel_container = findEmbeddedPanel(panel); + LLLayoutPanel* panel_container = findEmbeddedPanel(panel); if (!panel_container) return; panel_container->mCollapsed = collapsed; @@ -431,7 +249,7 @@ void LLLayoutStack::collapsePanel(LLPanel* panel, BOOL collapsed) void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL auto_resize) { - LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name); if (panel) { @@ -441,7 +259,7 @@ void LLLayoutStack::updatePanelAutoResize(const std::string& panel_name, BOOL au void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_resize) { - LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name); if (panel) { @@ -449,27 +267,25 @@ void LLLayoutStack::setPanelUserResize(const std::string& panel_name, BOOL user_ } } -bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp) +bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_dimp) { - LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name); if (panel) { - if (min_widthp) *min_widthp = panel->mMinWidth; - if (min_heightp) *min_heightp = panel->mMinHeight; + if (min_dimp) *min_dimp = panel->mMinDim; } return NULL != panel; } -bool LLLayoutStack::getPanelMaxSize(const std::string& panel_name, S32* max_widthp, S32* max_heightp) +bool LLLayoutStack::getPanelMaxSize(const std::string& panel_name, S32* max_dimp) { - LayoutPanel* panel = findEmbeddedPanelByName(panel_name); + LLLayoutPanel* panel = findEmbeddedPanelByName(panel_name); if (panel) { - if (max_widthp) *max_widthp = panel->mMaxWidth; - if (max_heightp) *max_heightp = panel->mMaxHeight; + if (max_dimp) *max_dimp = panel->mMaxDim; } return NULL != panel; @@ -481,6 +297,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) LLFastTimer ft(FTM_UPDATE_LAYOUT); static LLUICachedControl<S32> resize_bar_overlap ("UIResizeBarOverlap", 0); calcMinExtents(); + createResizeBars(); // calculate current extents S32 total_width = 0; @@ -492,7 +309,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) e_panel_list_t::iterator panel_it; for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { - LLPanel* panelp = (*panel_it)->mPanel; + LLPanel* panelp = (*panel_it); if (panelp->getVisible()) { if (mAnimate) @@ -542,11 +359,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize) if (mOrientation == HORIZONTAL) { // enforce minimize size constraint by default - if (panelp->getRect().getWidth() < (*panel_it)->mMinWidth) + if (panelp->getRect().getWidth() < (*panel_it)->mMinDim) { - panelp->reshape((*panel_it)->mMinWidth, panelp->getRect().getHeight()); + panelp->reshape((*panel_it)->mMinDim, panelp->getRect().getHeight()); } - total_width += llround(panelp->getRect().getWidth() * (*panel_it)->getCollapseFactor()); + total_width += llround(panelp->getRect().getWidth() * (*panel_it)->getCollapseFactor(mOrientation)); // want n-1 panel gaps for n panels if (panel_it != mPanels.begin()) { @@ -556,11 +373,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize) else //VERTICAL { // enforce minimize size constraint by default - if (panelp->getRect().getHeight() < (*panel_it)->mMinHeight) + if (panelp->getRect().getHeight() < (*panel_it)->mMinDim) { - panelp->reshape(panelp->getRect().getWidth(), (*panel_it)->mMinHeight); + panelp->reshape(panelp->getRect().getWidth(), (*panel_it)->mMinDim); } - total_height += llround(panelp->getRect().getHeight() * (*panel_it)->getCollapseFactor()); + total_height += llround(panelp->getRect().getHeight() * (*panel_it)->getCollapseFactor(mOrientation)); if (panel_it != mPanels.begin()) { total_height += mPanelSpacing; @@ -574,7 +391,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { // panels that are not fully visible do not count towards shrink headroom - if ((*panel_it)->getCollapseFactor() < 1.f) + if ((*panel_it)->getCollapseFactor(mOrientation) < 1.f) { continue; } @@ -587,11 +404,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (mOrientation == HORIZONTAL) { - shrink_headroom_total += (*panel_it)->mPanel->getRect().getWidth() - (*panel_it)->mMinWidth; + shrink_headroom_total += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim; } else //VERTICAL { - shrink_headroom_total += (*panel_it)->mPanel->getRect().getHeight() - (*panel_it)->mMinHeight; + shrink_headroom_total += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim; } } else @@ -599,13 +416,13 @@ void LLLayoutStack::updateLayout(BOOL force_resize) num_resizable_panels++; if (mOrientation == HORIZONTAL) { - shrink_headroom_available += (*panel_it)->mPanel->getRect().getWidth() - (*panel_it)->mMinWidth; - shrink_headroom_total += (*panel_it)->mPanel->getRect().getWidth() - (*panel_it)->mMinWidth; + shrink_headroom_available += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim; + shrink_headroom_total += (*panel_it)->getRect().getWidth() - (*panel_it)->mMinDim; } else //VERTICAL { - shrink_headroom_available += (*panel_it)->mPanel->getRect().getHeight() - (*panel_it)->mMinHeight; - shrink_headroom_total += (*panel_it)->mPanel->getRect().getHeight() - (*panel_it)->mMinHeight; + shrink_headroom_available += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim; + shrink_headroom_total += (*panel_it)->getRect().getHeight() - (*panel_it)->mMinDim; } } } @@ -628,17 +445,25 @@ void LLLayoutStack::updateLayout(BOOL force_resize) for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { - LLPanel* panelp = (*panel_it)->mPanel; + LLPanel* panelp = (*panel_it); S32 cur_width = panelp->getRect().getWidth(); S32 cur_height = panelp->getRect().getHeight(); - S32 new_width = llmax((*panel_it)->mMinWidth, cur_width); - S32 new_height = llmax((*panel_it)->mMinHeight, cur_height); + S32 new_width = cur_width; + S32 new_height = cur_height; + if (mOrientation == HORIZONTAL) + { + new_width = llmax((*panel_it)->mMinDim, new_width); + } + else + { + new_height = llmax((*panel_it)->mMinDim, new_height); + } S32 delta_size = 0; // if panel can automatically resize (not animating, and resize flag set)... - if ((*panel_it)->getCollapseFactor() == 1.f + if ((*panel_it)->getCollapseFactor(mOrientation) == 1.f && (force_resize || (*panel_it)->mAutoResize) && !(*panel_it)->mResizeBar->hasMouseCapture()) { @@ -649,8 +474,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { // shrink proportionally to amount over minimum // so we can do this in one pass - delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_width - (*panel_it)->mMinWidth) / (F32)shrink_headroom_available)) : 0; - shrink_headroom_available -= (cur_width - (*panel_it)->mMinWidth); + delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_width - (*panel_it)->mMinDim) / (F32)shrink_headroom_available)) : 0; + shrink_headroom_available -= (cur_width - (*panel_it)->mMinDim); } else { @@ -659,7 +484,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) num_resizable_panels--; } pixels_to_distribute -= delta_size; - new_width = llmax((*panel_it)->mMinWidth, cur_width + delta_size); + new_width = llmax((*panel_it)->mMinDim, cur_width + delta_size); } else { @@ -672,8 +497,8 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { // shrink proportionally to amount over minimum // so we can do this in one pass - delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_height - (*panel_it)->mMinHeight) / (F32)shrink_headroom_available)) : 0; - shrink_headroom_available -= (cur_height - (*panel_it)->mMinHeight); + delta_size = (shrink_headroom_available > 0) ? llround((F32)pixels_to_distribute * ((F32)(cur_height - (*panel_it)->mMinDim) / (F32)shrink_headroom_available)) : 0; + shrink_headroom_available -= (cur_height - (*panel_it)->mMinDim); } else { @@ -681,7 +506,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) num_resizable_panels--; } pixels_to_distribute -= delta_size; - new_height = llmax((*panel_it)->mMinHeight, cur_height + delta_size); + new_height = llmax((*panel_it)->mMinDim, cur_height + delta_size); } else { @@ -722,11 +547,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize) if (mOrientation == HORIZONTAL) { - cur_x += llround(new_width * (*panel_it)->getCollapseFactor()) + mPanelSpacing; + cur_x += llround(new_width * (*panel_it)->getCollapseFactor(mOrientation)) + mPanelSpacing; } else //VERTICAL { - cur_y -= llround(new_height * (*panel_it)->getCollapseFactor()) + mPanelSpacing; + cur_y -= llround(new_height * (*panel_it)->getCollapseFactor(mOrientation)) + mPanelSpacing; } } @@ -734,19 +559,19 @@ void LLLayoutStack::updateLayout(BOOL force_resize) LLResizeBar* last_resize_bar = NULL; for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { - LLPanel* panelp = (*panel_it)->mPanel; + LLPanel* panelp = (*panel_it); if (mOrientation == HORIZONTAL) { (*panel_it)->mResizeBar->setResizeLimits( - (*panel_it)->mMinWidth, - (*panel_it)->mMinWidth + shrink_headroom_total); + (*panel_it)->mMinDim, + (*panel_it)->mMinDim + shrink_headroom_total); } else //VERTICAL { (*panel_it)->mResizeBar->setResizeLimits( - (*panel_it)->mMinHeight, - (*panel_it)->mMinHeight + shrink_headroom_total); + (*panel_it)->mMinDim, + (*panel_it)->mMinDim + shrink_headroom_total); } // toggle resize bars based on panel visibility, resizability, etc @@ -782,14 +607,14 @@ void LLLayoutStack::updateLayout(BOOL force_resize) } // end LLLayoutStack::updateLayout -LLLayoutStack::LayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const +LLLayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) const { if (!panelp) return NULL; e_panel_list_t::const_iterator panel_it; for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { - if ((*panel_it)->mPanel == panelp) + if ((*panel_it) == panelp) { return *panel_it; } @@ -797,15 +622,15 @@ LLLayoutStack::LayoutPanel* LLLayoutStack::findEmbeddedPanel(LLPanel* panelp) co return NULL; } -LLLayoutStack::LayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const +LLLayoutPanel* LLLayoutStack::findEmbeddedPanelByName(const std::string& name) const { - LayoutPanel* result = NULL; + LLLayoutPanel* result = NULL; for (e_panel_list_t::const_iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { - LayoutPanel* p = *panel_it; + LLLayoutPanel* p = *panel_it; - if (p->mPanel->getName() == name) + if (p->getName() == name) { result = p; break; @@ -826,9 +651,7 @@ void LLLayoutStack::calcMinExtents() { if (mOrientation == HORIZONTAL) { - mMinHeight = llmax( mMinHeight, - (*panel_it)->mMinHeight); - mMinWidth += (*panel_it)->mMinWidth; + mMinWidth += (*panel_it)->mMinDim; if (panel_it != mPanels.begin()) { mMinWidth += mPanelSpacing; @@ -836,9 +659,7 @@ void LLLayoutStack::calcMinExtents() } else //VERTICAL { - mMinWidth = llmax( mMinWidth, - (*panel_it)->mMinWidth); - mMinHeight += (*panel_it)->mMinHeight; + mMinHeight += (*panel_it)->mMinDim; if (panel_it != mPanels.begin()) { mMinHeight += mPanelSpacing; @@ -847,6 +668,37 @@ void LLLayoutStack::calcMinExtents() } } +void LLLayoutStack::createResizeBars() +{ + for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) + { + LLLayoutPanel* lp = (*panel_it); + if (lp->mResizeBar == NULL) + { + LLResizeBar::Side side = (mOrientation == HORIZONTAL) ? LLResizeBar::RIGHT : LLResizeBar::BOTTOM; + LLRect resize_bar_rect = getRect(); + + LLResizeBar::Params resize_params; + resize_params.name("resize"); + resize_params.resizing_view(lp); + resize_params.min_size(lp->mMinDim); + resize_params.side(side); + resize_params.snapping_enabled(false); + LLResizeBar* resize_bar = LLUICtrlFactory::create<LLResizeBar>(resize_params); + lp->mResizeBar = resize_bar; + LLView::addChild(resize_bar, 0); + + // bring all resize bars to the front so that they are clickable even over the panels + // with a bit of overlap + for (e_panel_list_t::iterator panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) + { + LLResizeBar* resize_barp = (*panel_it)->mResizeBar; + sendChildToFront(resize_barp); + } + } + } +} + // update layout stack animations, etc. once per frame // NOTE: we use this to size world view based on animating UI, *before* we draw the UI // we might still need to call updateLayout during UI draw phase, in case UI elements diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 6fcc8e2ac3..e19ef403ef 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -28,16 +28,21 @@ #ifndef LL_LLLAYOUTSTACK_H #define LL_LLLAYOUTSTACK_H -#include "llview.h" +#include "llpanel.h" class LLPanel; +class LLLayoutPanel; + class LLLayoutStack : public LLView, public LLInstanceTracker<LLLayoutStack> { public: + struct LayoutStackRegistry : public LLChildRegistry<LayoutStackRegistry> + {}; + struct Params : public LLInitParam::Block<Params, LLView::Params> { - Optional<std::string> orientation; + Mandatory<std::string> orientation; Optional<S32> border_size; Optional<bool> animate, clip; @@ -45,6 +50,8 @@ public: Params(); }; + typedef LayoutStackRegistry child_registry_t; + typedef enum e_layout_orientation { HORIZONTAL, @@ -56,6 +63,7 @@ public: /*virtual*/ void draw(); /*virtual*/ void removeChild(LLView*); /*virtual*/ BOOL postBuild(); + /*virtual*/ bool addChild(LLView* child, S32 tab_group = 0); static LLView* fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL); @@ -68,7 +76,7 @@ public: ANIMATE } EAnimate; - void addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate = NO_ANIMATE, S32 index = S32_MAX); + void addPanel(LLLayoutPanel* panel, EAnimate animate = NO_ANIMATE); void removePanel(LLPanel* panel); void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE); S32 getNumPanels() { return mPanels.size(); } @@ -82,20 +90,18 @@ public: void setPanelUserResize(const std::string& panel_name, BOOL user_resize); /** - * Gets minimal width and/or height of the specified by name panel. + * Gets minimal dimension along layout_stack axis of the specified by name panel. * - * If it is necessary to get only the one dimension pass NULL for another one. * @returns true if specified by panel_name internal panel exists, false otherwise. */ - bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp); + bool getPanelMinSize(const std::string& panel_name, S32* min_dimp); /** - * Gets maximal width and/or height of the specified by name panel. + * Gets maximal dimension along layout_stack axis of the specified by name panel. * - * If it is necessary to get only the one dimension pass NULL for another one. * @returns true if specified by panel_name internal panel exists, false otherwise. */ - bool getPanelMaxSize(const std::string& panel_name, S32* max_width, S32* max_height); + bool getPanelMaxSize(const std::string& panel_name, S32* max_dim); void updateLayout(BOOL force_resize = FALSE); @@ -110,19 +116,18 @@ protected: friend class LLUICtrlFactory; private: - struct LayoutPanel; - + void createResizeBars(); void calcMinExtents(); S32 getDefaultHeight(S32 cur_height); S32 getDefaultWidth(S32 cur_width); const ELayoutOrientation mOrientation; - typedef std::vector<LayoutPanel*> e_panel_list_t; + typedef std::vector<LLLayoutPanel*> e_panel_list_t; e_panel_list_t mPanels; - LayoutPanel* findEmbeddedPanel(LLPanel* panelp) const; - LayoutPanel* findEmbeddedPanelByName(const std::string& name) const; + LLLayoutPanel* findEmbeddedPanel(LLPanel* panelp) const; + LLLayoutPanel* findEmbeddedPanelByName(const std::string& name) const; S32 mMinWidth; // calculated by calcMinExtents S32 mMinHeight; // calculated by calcMinExtents @@ -134,4 +139,49 @@ private: bool mClip; }; // end class LLLayoutStack +class LLLayoutPanel : public LLPanel +{ +friend class LLLayoutStack; +friend class LLUICtrlFactory; +public: + struct Params : public LLInitParam::Block<Params, LLPanel::Params> + { + Optional<S32> min_dim, + max_dim; + Optional<bool> user_resize, + auto_resize; + + Params() + : min_dim("min_dim", 0), + max_dim("max_dim", 0), + user_resize("user_resize", true), + auto_resize("auto_resize", true) + { + addSynonym(min_dim, "min_width"); + addSynonym(min_dim, "min_height"); + addSynonym(max_dim, "max_width"); + addSynonym(max_dim, "max_height"); + } + }; + + ~LLLayoutPanel(); + + void initFromParams(const Params& p); +protected: + LLLayoutPanel(const Params& p) ; + + + F32 getCollapseFactor(LLLayoutStack::ELayoutOrientation orientation); + + S32 mMinDim; + S32 mMaxDim; + BOOL mAutoResize; + BOOL mUserResize; + BOOL mCollapsed; + class LLResizeBar* mResizeBar; + F32 mVisibleAmt; + F32 mCollapseAmt; +}; + + #endif diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 2759167d04..3eb58e1aec 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -78,7 +78,7 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>( // LLLineEditor::Params::Params() -: max_length_bytes("max_length", 254), +: max_length(""), keystroke_callback("keystroke_callback"), prevalidate_callback("prevalidate_callback"), background_image("background_image"), @@ -108,7 +108,8 @@ LLLineEditor::Params::Params() LLLineEditor::LLLineEditor(const LLLineEditor::Params& p) : LLUICtrl(p), - mMaxLengthBytes(p.max_length_bytes), + mMaxLengthBytes(p.max_length.bytes), + mMaxLengthChars(p.max_length.chars), mCursorPos( 0 ), mScrollHPos( 0 ), mTextPadLeft(p.text_pad_left), @@ -313,6 +314,12 @@ void LLLineEditor::setMaxTextLength(S32 max_text_length) mMaxLengthBytes = max_len; } +void LLLineEditor::setMaxTextChars(S32 max_text_chars) +{ + S32 max_chars = llmax(0, max_text_chars); + mMaxLengthChars = max_chars; +} + void LLLineEditor::getTextPadding(S32 *left, S32 *right) { *left = mTextPadLeft; @@ -358,6 +365,16 @@ void LLLineEditor::setText(const LLStringExplicit &new_text) } mText.assign(truncated_utf8); + if (mMaxLengthChars) + { + LLWString truncated_wstring = utf8str_to_wstring(truncated_utf8); + if (truncated_wstring.size() > (U32)mMaxLengthChars) + { + truncated_wstring = truncated_wstring.substr(0, mMaxLengthChars); + } + mText.assign(wstring_to_utf8str(truncated_wstring)); + } + if (all_selected) { // ...keep whole thing selected @@ -798,6 +815,7 @@ void LLLineEditor::addChar(const llwchar uni_char) } S32 cur_bytes = mText.getString().size(); + S32 new_bytes = wchar_utf8_length(new_c); BOOL allow_char = TRUE; @@ -807,6 +825,14 @@ void LLLineEditor::addChar(const llwchar uni_char) { allow_char = FALSE; } + else if (mMaxLengthChars) + { + S32 wide_chars = mText.getWString().size(); + if ((wide_chars + 1) > mMaxLengthChars) + { + allow_char = FALSE; + } + } if (allow_char) { @@ -1107,7 +1133,19 @@ void LLLineEditor::pasteHelper(bool is_primary) clean_string = clean_string.substr(0, wchars_that_fit); LLUI::reportBadKeystroke(); } - + + if (mMaxLengthChars) + { + U32 available_chars = mMaxLengthChars - mText.getWString().size(); + + if (available_chars < clean_string.size()) + { + clean_string = clean_string.substr(0, available_chars); + } + + LLUI::reportBadKeystroke(); + } + mText.insert(getCursor(), clean_string); setCursor( getCursor() + (S32)clean_string.length() ); deselect(); @@ -1266,12 +1304,12 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) // handle ctrl-uparrow if we have a history enabled line editor. case KEY_UP: - if( mHaveHistory && ( MASK_CONTROL == mask ) ) + if( mHaveHistory && ((mIgnoreArrowKeys == false) || ( MASK_CONTROL == mask )) ) { if( mCurrentHistoryLine > mLineHistory.begin() ) { mText.assign( *(--mCurrentHistoryLine) ); - setCursor(llmin((S32)mText.length(), getCursor())); + setCursorToEnd(); } else { @@ -1281,14 +1319,14 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask) } break; - // handle ctrl-downarrow if we have a history enabled line editor + // handle [ctrl]-downarrow if we have a history enabled line editor case KEY_DOWN: - if( mHaveHistory && ( MASK_CONTROL == mask ) ) + if( mHaveHistory && ((mIgnoreArrowKeys == false) || ( MASK_CONTROL == mask )) ) { if( !mLineHistory.empty() && mCurrentHistoryLine < mLineHistory.end() - 1 ) { mText.assign( *(++mCurrentHistoryLine) ); - setCursor(llmin((S32)mText.length(), getCursor())); + setCursorToEnd(); } else { diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index 76d0187712..a1aa6b71c6 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -59,11 +59,19 @@ public: typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t; + struct MaxLength : public LLInitParam::Choice<MaxLength> + { + Alternative<S32> bytes, chars; + + MaxLength() : bytes("max_length_bytes", 254), + chars("max_length_chars", 0) + {} + }; + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { Optional<std::string> default_text; - Optional<S32> max_length_bytes; - + Optional<MaxLength> max_length; Optional<keystroke_callback_t> keystroke_callback; Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback; @@ -214,6 +222,7 @@ public: void setKeystrokeCallback(callback_t callback, void* user_data); void setMaxTextLength(S32 max_text_length); + void setMaxTextChars(S32 max_text_chars); // Manipulate left and right padding for text void getTextPadding(S32 *left, S32 *right); void setTextPadding(S32 left, S32 right); @@ -277,6 +286,7 @@ protected: LLViewBorder* mBorder; const LLFontGL* mGLFont; S32 mMaxLengthBytes; // Max length of the UTF8 string in bytes + S32 mMaxLengthChars; // Maximum number of characters in the string S32 mCursorPos; // I-beam is just after the mCursorPos-th character. S32 mScrollHPos; // Horizontal offset from the start of mText. Used for scrolling. LLFrameTimer mScrollTimer; diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index 3df05f4d3f..ac568a83e4 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -29,7 +29,7 @@ #include "llmenubutton.h" // Linden library includes -#include "llmenugl.h" +#include "lltoggleablemenu.h" #include "llstring.h" #include "v4color.h" @@ -44,58 +44,77 @@ LLMenuButton::Params::Params() LLMenuButton::LLMenuButton(const LLMenuButton::Params& p) : LLButton(p), - mMenu(NULL), - mMenuVisibleLastFrame(false) + mIsMenuShown(false), + mMenuPosition(MP_BOTTOM_LEFT) { std::string menu_filename = p.menu_filename; if (!menu_filename.empty()) { - mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(menu_filename, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance()); - if (!mMenu) + LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>(menu_filename, LLMenuGL::sMenuContainer, LLMenuHolderGL::child_registry_t::instance()); + if (!menu) { llwarns << "Error loading menu_button menu" << llendl; + return; } + + menu->setVisibilityChangeCallback(boost::bind(&LLMenuButton::onMenuVisibilityChange, this, _2)); + + mMenuHandle = menu->getHandle(); + + updateMenuOrigin(); } } -void LLMenuButton::toggleMenu() +boost::signals2::connection LLMenuButton::setMouseDownCallback( const mouse_signal_t::slot_type& cb ) { - if(!mMenu) - return; + return LLUICtrl::setMouseDownCallback(cb); +} - if (mMenu->getVisible() || mMenuVisibleLastFrame) - { - mMenu->setVisible(FALSE); - } - else +void LLMenuButton::hideMenu() +{ + if(mMenuHandle.isDead()) return; + + LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get()); + if (menu) { - LLRect rect = getRect(); - //mMenu->needsArrange(); //so it recalculates the visible elements - LLMenuGL::showPopup(getParent(), mMenu, rect.mLeft, rect.mBottom); + menu->setVisible(FALSE); } } - -void LLMenuButton::hideMenu() -{ - if(!mMenu) - return; - mMenu->setVisible(FALSE); +LLToggleableMenu* LLMenuButton::getMenu() +{ + return dynamic_cast<LLToggleableMenu*>(mMenuHandle.get()); } +void LLMenuButton::setMenu(LLToggleableMenu* menu, EMenuPosition position /*MP_TOP_LEFT*/) +{ + if (!menu) return; + + mMenuHandle = menu->getHandle(); + mMenuPosition = position; + + menu->setVisibilityChangeCallback(boost::bind(&LLMenuButton::onMenuVisibilityChange, this, _2)); +} BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask ) { + if (mMenuHandle.isDead()) return FALSE; + if( KEY_RETURN == key && mask == MASK_NONE && !gKeyboard->getKeyRepeated(key)) { + // *HACK: We emit the mouse down signal to fire the callback bound to the + // menu emerging event before actually displaying the menu. See STORM-263. + LLUICtrl::handleMouseDown(-1, -1, MASK_NONE); + toggleMenu(); return TRUE; } - if (mMenu && mMenu->getVisible() && key == KEY_ESCAPE && mask == MASK_NONE) + LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get()); + if (menu && menu->getVisible() && key == KEY_ESCAPE && mask == MASK_NONE) { - mMenu->setVisible(FALSE); + menu->setVisible(FALSE); return TRUE; } @@ -104,34 +123,77 @@ BOOL LLMenuButton::handleKeyHere(KEY key, MASK mask ) BOOL LLMenuButton::handleMouseDown(S32 x, S32 y, MASK mask) { - if (hasTabStop() && !getIsChrome()) - { - setFocus(TRUE); - } + LLButton::handleMouseDown(x, y, mask); toggleMenu(); - if (getSoundFlags() & MOUSE_DOWN) - { - make_ui_sound("UISndClick"); - } - return TRUE; } -void LLMenuButton::draw() +void LLMenuButton::toggleMenu() { - //we save this off so next frame when we try to close it by - //button click, and it hides menus before we get to it, we know - mMenuVisibleLastFrame = mMenu && mMenu->getVisible(); - - if (mMenuVisibleLastFrame) + if(mMenuHandle.isDead()) return; + + LLToggleableMenu* menu = dynamic_cast<LLToggleableMenu*>(mMenuHandle.get()); + if (!menu) return; + + // Store the button rectangle to toggle menu visibility if a mouse event + // occurred inside or outside the button rect. + menu->setButtonRect(this); + + if (!menu->toggleVisibility() && mIsMenuShown) + { + setForcePressedState(false); + mIsMenuShown = false; + } + else { + menu->buildDrawLabels(); + menu->arrangeAndClear(); + menu->updateParent(LLMenuGL::sMenuContainer); + + updateMenuOrigin(); + + LLMenuGL::showPopup(getParent(), menu, mX, mY); + setForcePressedState(true); + mIsMenuShown = true; } +} + +void LLMenuButton::updateMenuOrigin() +{ + if (mMenuHandle.isDead()) return; - LLButton::draw(); + LLRect rect = getRect(); - setForcePressedState(false); + switch (mMenuPosition) + { + case MP_TOP_LEFT: + { + mX = rect.mLeft; + mY = rect.mTop + mMenuHandle.get()->getRect().getHeight(); + break; + } + case MP_BOTTOM_LEFT: + { + mX = rect.mLeft; + mY = rect.mBottom; + break; + } + } } +void LLMenuButton::onMenuVisibilityChange(const LLSD& param) +{ + bool new_visibility = param["visibility"].asBoolean(); + bool is_closed_by_button_click = param["closed_by_button_click"].asBoolean(); + + // Reset the button "pressed" state only if the menu is shown by this particular + // menu button (not any other control) and is not being closed by a click on the button. + if (!new_visibility && !is_closed_by_button_click && mIsMenuShown) + { + setForcePressedState(false); + mIsMenuShown = false; + } +} diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index 81ca0e047c..9e91b9e99d 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -29,7 +29,7 @@ #include "llbutton.h" -class LLMenuGL; +class LLToggleableMenu; class LLMenuButton : public LLButton @@ -42,22 +42,41 @@ public: Optional<std::string> menu_filename; Params(); - }; + }; + + typedef enum e_menu_position + { + MP_TOP_LEFT, + MP_BOTTOM_LEFT + } EMenuPosition; - void toggleMenu(); - /*virtual*/ void draw(); + boost::signals2::connection setMouseDownCallback( const mouse_signal_t::slot_type& cb ); + /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleKeyHere(KEY key, MASK mask ); + void hideMenu(); - LLMenuGL* getMenu() { return mMenu; } + + LLToggleableMenu* getMenu(); + void setMenu(LLToggleableMenu* menu, EMenuPosition position = MP_TOP_LEFT); + + void setMenuPosition(EMenuPosition position) { mMenuPosition = position; } protected: friend class LLUICtrlFactory; LLMenuButton(const Params&); + void toggleMenu(); + void updateMenuOrigin(); + + void onMenuVisibilityChange(const LLSD& param); + private: - LLMenuGL* mMenu; - bool mMenuVisibleLastFrame; + LLHandle<LLView> mMenuHandle; + bool mIsMenuShown; + EMenuPosition mMenuPosition; + S32 mX; + S32 mY; }; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 6d590cf54e..a6cf86d9b8 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1848,89 +1848,104 @@ BOOL LLMenuGL::isOpen() } } -void LLMenuGL::scrollItemsUp() + + +bool LLMenuGL::scrollItems(EScrollingDirection direction) { - // Slowing down the items scrolling when arrow button is held + // Slowing down items scrolling when arrow button is held if (mScrollItemsTimer.hasExpired() && NULL != mFirstVisibleItem) { mScrollItemsTimer.setTimerExpirySec(.033f); } else { - return; + return false; } - item_list_t::iterator cur_item_iter; - item_list_t::iterator prev_item_iter; - for (cur_item_iter = mItems.begin(), prev_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++) + switch (direction) { - if( (*cur_item_iter) == mFirstVisibleItem) + case SD_UP: + { + item_list_t::iterator cur_item_iter; + item_list_t::iterator prev_item_iter; + for (cur_item_iter = mItems.begin(), prev_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++) { - break; + if( (*cur_item_iter) == mFirstVisibleItem) + { + break; + } + if ((*cur_item_iter)->getVisible()) + { + prev_item_iter = cur_item_iter; + } } - if ((*cur_item_iter)->getVisible()) + + if ((*prev_item_iter)->getVisible()) { - prev_item_iter = cur_item_iter; + mFirstVisibleItem = *prev_item_iter; } + break; } - - if ((*prev_item_iter)->getVisible()) - { - mFirstVisibleItem = *prev_item_iter; - } - - mNeedsArrange = TRUE; - arrangeAndClear(); -} - -void LLMenuGL::scrollItemsDown() -{ - // Slowing down the items scrolling when arrow button is held - if (mScrollItemsTimer.hasExpired()) - { - mScrollItemsTimer.setTimerExpirySec(.033f); - } - else - { - return; - } - - if (NULL == mFirstVisibleItem) - { - mFirstVisibleItem = *mItems.begin(); - } - - item_list_t::iterator cur_item_iter; - - for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++) + case SD_DOWN: { - if( (*cur_item_iter) == mFirstVisibleItem) + if (NULL == mFirstVisibleItem) { - break; + mFirstVisibleItem = *mItems.begin(); } - } - item_list_t::iterator next_item_iter; + item_list_t::iterator cur_item_iter; - if (cur_item_iter != mItems.end()) - { - for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++) + for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); cur_item_iter++) { - if( (*next_item_iter)->getVisible()) + if( (*cur_item_iter) == mFirstVisibleItem) { break; } } - - if (next_item_iter != mItems.end() && - (*next_item_iter)->getVisible()) + + item_list_t::iterator next_item_iter; + + if (cur_item_iter != mItems.end()) { - mFirstVisibleItem = *next_item_iter; + for (next_item_iter = ++cur_item_iter; next_item_iter != mItems.end(); next_item_iter++) + { + if( (*next_item_iter)->getVisible()) + { + break; + } + } + + if (next_item_iter != mItems.end() && + (*next_item_iter)->getVisible()) + { + mFirstVisibleItem = *next_item_iter; + } } + break; } - + case SD_BEGIN: + { + mFirstVisibleItem = *mItems.begin(); + break; + } + case SD_END: + { + item_list_t::reverse_iterator first_visible_item_iter = mItems.rend(); + + // Advance by mMaxScrollableItems back from the end of the list + // to make the last item visible. + std::advance(first_visible_item_iter, mMaxScrollableItems); + mFirstVisibleItem = *first_visible_item_iter; + break; + } + default: + llwarns << "Unknown scrolling direction: " << direction << llendl; + } + mNeedsArrange = TRUE; arrangeAndClear(); + + return true; } // rearrange the child rects so they fit the shape of the menu. @@ -2162,7 +2177,7 @@ void LLMenuGL::arrange( void ) LLMenuScrollItem::Params item_params; item_params.name(ARROW_UP); item_params.arrow_type(LLMenuScrollItem::ARROW_UP); - item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItemsUp, this)); + item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItems, this, SD_UP)); mArrowUpItem = LLUICtrlFactory::create<LLMenuScrollItem>(item_params); LLUICtrl::addChild(mArrowUpItem); @@ -2173,7 +2188,7 @@ void LLMenuGL::arrange( void ) LLMenuScrollItem::Params item_params; item_params.name(ARROW_DOWN); item_params.arrow_type(LLMenuScrollItem::ARROW_DOWN); - item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItemsDown, this)); + item_params.scroll_callback.function(boost::bind(&LLMenuGL::scrollItems, this, SD_DOWN)); mArrowDownItem = LLUICtrlFactory::create<LLMenuScrollItem>(item_params); LLUICtrl::addChild(mArrowDownItem); @@ -2603,14 +2618,8 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa ((LLFloater*)getParent())->setFocus(TRUE); } - item_list_t::iterator cur_item_iter; - for (cur_item_iter = mItems.begin(); cur_item_iter != mItems.end(); ++cur_item_iter) - { - if( (*cur_item_iter) == cur_item) - { - break; - } - } + // Current item position in the items list + item_list_t::iterator cur_item_iter = std::find(mItems.begin(), mItems.end(), cur_item); item_list_t::iterator next_item_iter; if (cur_item_iter == mItems.end()) @@ -2621,9 +2630,37 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa { next_item_iter = cur_item_iter; next_item_iter++; + + // First visible item position in the items list + item_list_t::iterator first_visible_item_iter = std::find(mItems.begin(), mItems.end(), mFirstVisibleItem); + if (next_item_iter == mItems.end()) { next_item_iter = mItems.begin(); + + // If current item is the last in the list, the menu is scrolled to the beginning + // and the first item is highlighted. + if (mScrollable && !scrollItems(SD_BEGIN)) + { + return NULL; + } + } + // If current item is the last visible, the menu is scrolled one item down + // and the next item is highlighted. + else if (mScrollable && + (U32)std::abs(std::distance(first_visible_item_iter, next_item_iter)) >= mMaxScrollableItems) + { + // Call highlightNextItem() recursively only if the menu was successfully scrolled down. + // If scroll timer hasn't expired yet the menu won't be scrolled and calling + // highlightNextItem() will result in an endless recursion. + if (scrollItems(SD_DOWN)) + { + return highlightNextItem(cur_item, skip_disabled); + } + else + { + return NULL; + } } } @@ -2681,14 +2718,8 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa ((LLFloater*)getParent())->setFocus(TRUE); } - item_list_t::reverse_iterator cur_item_iter; - for (cur_item_iter = mItems.rbegin(); cur_item_iter != mItems.rend(); ++cur_item_iter) - { - if( (*cur_item_iter) == cur_item) - { - break; - } - } + // Current item reverse position from the end of the list + item_list_t::reverse_iterator cur_item_iter = std::find(mItems.rbegin(), mItems.rend(), cur_item); item_list_t::reverse_iterator prev_item_iter; if (cur_item_iter == mItems.rend()) @@ -2699,9 +2730,37 @@ LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disa { prev_item_iter = cur_item_iter; prev_item_iter++; + + // First visible item reverse position in the items list + item_list_t::reverse_iterator first_visible_item_iter = std::find(mItems.rbegin(), mItems.rend(), mFirstVisibleItem); + if (prev_item_iter == mItems.rend()) { prev_item_iter = mItems.rbegin(); + + // If current item is the first in the list, the menu is scrolled to the end + // and the last item is highlighted. + if (mScrollable && !scrollItems(SD_END)) + { + return NULL; + } + } + // If current item is the first visible, the menu is scrolled one item up + // and the previous item is highlighted. + else if (mScrollable && + std::distance(first_visible_item_iter, cur_item_iter) <= 0) + { + // Call highlightNextItem() only if the menu was successfully scrolled up. + // If scroll timer hasn't expired yet the menu won't be scrolled and calling + // highlightNextItem() will result in an endless recursion. + if (scrollItems(SD_UP)) + { + return highlightPrevItem(cur_item, skip_disabled); + } + else + { + return NULL; + } } } @@ -2872,12 +2931,12 @@ BOOL LLMenuGL::handleScrollWheel( S32 x, S32 y, S32 clicks ) if( clicks > 0 ) { while( clicks-- ) - scrollItemsDown(); + scrollItems(SD_DOWN); } else { while( clicks++ ) - scrollItemsUp(); + scrollItems(SD_UP); } return TRUE; diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 19b738312e..35544402f4 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -397,6 +397,15 @@ public: static const std::string ARROW_UP; static const std::string ARROW_DOWN; + // for scrollable menus + typedef enum e_scrolling_direction + { + SD_UP = 0, + SD_DOWN = 1, + SD_BEGIN = 2, + SD_END = 3 + } EScrollingDirection; + protected: LLMenuGL(const LLMenuGL::Params& p); friend class LLUICtrlFactory; @@ -503,8 +512,7 @@ public: S32 getShortcutPad() { return mShortcutPad; } - void scrollItemsUp(); - void scrollItemsDown(); + bool scrollItems(EScrollingDirection direction); BOOL isScrollable() const { return mScrollable; } static class LLMenuHolderGL* sMenuContainer; diff --git a/indra/llui/llmultislider.cpp b/indra/llui/llmultislider.cpp index 1f6fa12969..d4e6091ee0 100644 --- a/indra/llui/llmultislider.cpp +++ b/indra/llui/llmultislider.cpp @@ -101,8 +101,8 @@ LLMultiSlider::LLMultiSlider(const LLMultiSlider::Params& p) setMouseUpCallback(initCommitCallback(p.mouse_up_callback)); } - for (LLInitParam::ParamIterator<SliderParams>::const_iterator it = p.sliders().begin(); - it != p.sliders().end(); + for (LLInitParam::ParamIterator<SliderParams>::const_iterator it = p.sliders.begin(); + it != p.sliders.end(); ++it) { if (it->name.isProvided()) diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp index bd65625f53..91e5b6b9de 100644 --- a/indra/llui/llmultisliderctrl.cpp +++ b/indra/llui/llmultisliderctrl.cpp @@ -130,7 +130,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p) params.name("MultiSliderCtrl Editor"); params.rect(text_rect); params.font(p.font); - params.max_length_bytes(MAX_STRING_LENGTH); + params.max_length.bytes(MAX_STRING_LENGTH); params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit); params.prevalidate_callback(&LLTextValidate::validateFloat); params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM); diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index 99d540a9de..a3df6a3ced 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -27,8 +27,11 @@ #include "linden_common.h" #include "llnotifications.h" +#include "llnotificationtemplate.h" +#include "llavatarnamecache.h" #include "llinstantmessage.h" +#include "llcachename.h" #include "llxmlnode.h" #include "lluictrl.h" #include "lluictrlfactory.h" @@ -37,6 +40,8 @@ #include "lltrans.h" #include "llnotificationslistener.h" #include "llstring.h" +#include "llsdparam.h" +#include "llsdutil.h" #include <algorithm> #include <boost/regex.hpp> @@ -44,6 +49,58 @@ const std::string NOTIFICATION_PERSIST_VERSION = "0.93"; +void NotificationPriorityValues::declareValues() +{ + declare("low", NOTIFICATION_PRIORITY_LOW); + declare("normal", NOTIFICATION_PRIORITY_NORMAL); + declare("high", NOTIFICATION_PRIORITY_HIGH); + declare("critical", NOTIFICATION_PRIORITY_CRITICAL); +} + +LLNotificationForm::FormElementBase::FormElementBase() +: name("name") +{} + +LLNotificationForm::FormIgnore::FormIgnore() +: text("text"), + control("control"), + invert_control("invert_control", false), + save_option("save_option", false) +{} + +LLNotificationForm::FormButton::FormButton() +: index("index"), + text("text"), + ignore("ignore"), + is_default("default"), + type("type") +{ + // set type here so it gets serialized + type = "button"; +} + +LLNotificationForm::FormInput::FormInput() +: type("type"), + max_length_chars("max_length_chars"), + width("width", 0), + value("value") +{} + +LLNotificationForm::FormElement::FormElement() +: button("button"), + input("input") +{} + +LLNotificationForm::FormElements::FormElements() +: elements("") +{} + +LLNotificationForm::Params::Params() +: name("name"), + ignore("ignore"), + form_elements("") +{} + // Local channel for persistent notifications // Stores only persistent notifications. // Class users can use connectChanged() to process persistent notifications @@ -88,12 +145,7 @@ bool filterIgnoredNotifications(LLNotificationPtr notification) LLNotificationFormPtr form = notification->getForm(); // Check to see if the user wants to ignore this alert - if (form->getIgnoreType() != LLNotificationForm::IGNORE_NO) - { - return LLUI::sSettingGroups["ignores"]->getBOOL(notification->getName()); - } - - return true; + return !notification->getForm()->getIgnored(); } bool handleIgnoredNotification(const LLSD& payload) @@ -135,63 +187,68 @@ namespace LLNotificationFilters }; LLNotificationForm::LLNotificationForm() -: mFormData(LLSD::emptyArray()), - mIgnore(IGNORE_NO) +: mIgnore(IGNORE_NO) { } -LLNotificationForm::LLNotificationForm(const std::string& name, const LLXMLNodePtr xml_node) -: mFormData(LLSD::emptyArray()), - mIgnore(IGNORE_NO) +LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotificationForm::Params& p) +: mIgnore(IGNORE_NO), + mInvertSetting(false) // ignore settings by default mean true=show, false=ignore { - if (!xml_node->hasName("form")) - { - llwarns << "Bad xml node for form: " << xml_node->getName() << llendl; - } - LLXMLNodePtr child = xml_node->getFirstChild(); - while(child) + if (p.ignore.isProvided()) { - child = LLNotifications::instance().checkForXMLTemplate(child); + mIgnoreMsg = p.ignore.text; - LLSD item_entry; - std::string element_name = child->getName()->mString; + if (!p.ignore.save_option) + { + mIgnore = IGNORE_WITH_DEFAULT_RESPONSE; + } + else + { + // remember last option chosen by user and automatically respond with that in the future + mIgnore = IGNORE_WITH_LAST_RESPONSE; + LLUI::sSettingGroups["ignores"]->declareLLSD(std::string("Default") + name, "", std::string("Default response for notification " + name)); + } - if (element_name == "ignore" ) + BOOL show_notification = TRUE; + if (p.ignore.control.isProvided()) { - bool save_option = false; - child->getAttribute_bool("save_option", save_option); - if (!save_option) - { - mIgnore = IGNORE_WITH_DEFAULT_RESPONSE; - } - else - { - // remember last option chosen by user and automatically respond with that in the future - mIgnore = IGNORE_WITH_LAST_RESPONSE; - LLUI::sSettingGroups["ignores"]->declareLLSD(std::string("Default") + name, "", std::string("Default response for notification " + name)); - } - child->getAttributeString("text", mIgnoreMsg); - BOOL show_notification = TRUE; - LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Ignore notification with this name", TRUE); + mIgnoreSetting = LLUI::sSettingGroups["config"]->getControl(p.ignore.control); + mInvertSetting = p.ignore.invert_control; } else { - // flatten xml form entry into single LLSD map with type==name - item_entry["type"] = element_name; - const LLXMLAttribList::iterator attrib_end = child->mAttributes.end(); - for(LLXMLAttribList::iterator attrib_it = child->mAttributes.begin(); - attrib_it != attrib_end; - ++attrib_it) - { - item_entry[std::string(attrib_it->second->getName()->mString)] = attrib_it->second->getValue(); - } - item_entry["value"] = child->getTextContents(); - mFormData.append(item_entry); + LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Show notification with this name", TRUE); + mIgnoreSetting = LLUI::sSettingGroups["ignores"]->getControl(name); } + } + + LLParamSDParser parser; + parser.writeSD(mFormData, p.form_elements); + + mFormData = mFormData[""]; + if (!mFormData.isArray()) + { + // change existing contents to a one element array + LLSD new_llsd_array = LLSD::emptyArray(); + new_llsd_array.append(mFormData); + mFormData = new_llsd_array; + } - child = child->getNextSibling(); + for (LLSD::array_iterator it = mFormData.beginArray(), end_it = mFormData.endArray(); + it != end_it; + ++it) + { + // lift contents of form element up a level, since element type is already encoded in "type" param + if (it->isMap() && it->beginMap() != it->endMap()) + { + *it = it->beginMap()->second; + } } + + LL_DEBUGS("Notifications") << name << LL_ENDL; + LL_DEBUGS("Notifications") << ll_pretty_print_sd(mFormData) << LL_ENDL; } LLNotificationForm::LLNotificationForm(const LLSD& sd) @@ -293,16 +350,64 @@ std::string LLNotificationForm::getDefaultOption() return ""; } -LLNotificationTemplate::LLNotificationTemplate() : - mExpireSeconds(0), - mExpireOption(-1), - mURLOption(-1), - mURLOpenExternally(-1), - mPersist(false), - mUnique(false), - mPriority(NOTIFICATION_PRIORITY_NORMAL) +LLControlVariablePtr LLNotificationForm::getIgnoreSetting() +{ + return mIgnoreSetting; +} + +bool LLNotificationForm::getIgnored() { - mForm = LLNotificationFormPtr(new LLNotificationForm()); + bool show = true; + if (mIgnore != LLNotificationForm::IGNORE_NO + && mIgnoreSetting) + { + show = mIgnoreSetting->getValue().asBoolean(); + if (mInvertSetting) show = !show; + } + + return !show; +} + +void LLNotificationForm::setIgnored(bool ignored) +{ + if (mIgnoreSetting) + { + if (mInvertSetting) ignored = !ignored; + mIgnoreSetting->setValue(!ignored); + } +} + +LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Params& p) +: mName(p.name), + mType(p.type), + mMessage(p.value), + mLabel(p.label), + mIcon(p.icon), + mURL(p.url.value), + mExpireSeconds(p.duration), + mExpireOption(p.expire_option), + mURLOption(p.url.option), + mURLTarget(p.url.target), + mUnique(p.unique.isProvided()), + mPriority(p.priority), + mPersist(p.persist), + mDefaultFunctor(p.functor.isProvided() ? p.functor() : p.name()) +{ + if (p.sound.isProvided() + && LLUI::sSettingGroups["config"]->controlExists(p.sound)) + { + mSoundEffect = LLUUID(LLUI::sSettingGroups["config"]->getString(p.sound)); + } + + for(LLInitParam::ParamIterator<LLNotificationTemplate::UniquenessContext>::const_iterator it = p.unique.contexts.begin(), + end_it = p.unique.contexts.end(); + it != end_it; + ++it) + { + mUniqueContext.push_back(it->key); + } + + mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form)); } LLNotification::LLNotification(const LLNotification::Params& p) : @@ -499,7 +604,7 @@ void LLNotification::respond(const LLSD& response) { mResponder->handleRespond(asLLSD(), response); } - else + else if (!mResponseFunctorName.empty()) { // look up the functor LLNotificationFunctorRegistry::ResponseFunctor functor = @@ -507,6 +612,11 @@ void LLNotification::respond(const LLSD& response) // and then call it functor(asLLSD(), response); } + else + { + // no registered responder + return; + } if (mTemporaryResponder && !isReusable()) { @@ -517,8 +627,7 @@ void LLNotification::respond(const LLSD& response) if (mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) { - BOOL show_notification = mIgnored ? FALSE : TRUE; - LLUI::sSettingGroups["ignores"]->setBOOL(getName(), show_notification); + mForm->setIgnored(mIgnored); if (mIgnored && mForm->getIgnoreType() == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE) { LLUI::sSettingGroups["ignores"]->setLLSD("Default" + getName(), response); @@ -528,6 +637,49 @@ void LLNotification::respond(const LLSD& response) update(); } +void LLNotification::respondWithDefault() +{ + respond(getResponseTemplate(WITH_DEFAULT_BUTTON)); +} + + +const std::string& LLNotification::getName() const +{ + return mTemplatep->mName; +} + +const std::string& LLNotification::getIcon() const +{ + return mTemplatep->mIcon; +} + + +bool LLNotification::isPersistent() const +{ + return mTemplatep->mPersist; +} + +std::string LLNotification::getType() const +{ + return (mTemplatep ? mTemplatep->mType : ""); +} + +S32 LLNotification::getURLOption() const +{ + return (mTemplatep ? mTemplatep->mURLOption : -1); +} + +S32 LLNotification::getURLOpenExternally() const +{ + return(mTemplatep? mTemplatep->mURLTarget == "_external": -1); +} + +bool LLNotification::hasUniquenessConstraints() const +{ + return (mTemplatep ? mTemplatep->mUnique : false); +} + + void LLNotification::setIgnored(bool ignore) { mIgnored = ignore; @@ -607,6 +759,8 @@ void LLNotification::init(const std::string& template_name, const LLSD& form_ele // apply substitution to form labels mForm->formatElements(mSubstitutions); + mIgnored = mForm->getIgnored(); + LLDate rightnow = LLDate::now(); if (mTemplatep->mExpireSeconds) { @@ -910,12 +1064,12 @@ std::string LLNotificationChannel::summarize() // LLNotifications implementation // --- LLNotifications::LLNotifications() : LLNotificationChannelBase(LLNotificationFilters::includeEverything, - LLNotificationComparators::orderByUUID()), - mIgnoreAllNotifications(false) + LLNotificationComparators::orderByUUID()), + mIgnoreAllNotifications(false) { LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Notification.Show", boost::bind(&LLNotifications::addFromCallback, this, _2)); - - mListener.reset(new LLNotificationsListener(*this)); + + mListener.reset(new LLNotificationsListener(*this)); } @@ -1095,11 +1249,6 @@ bool LLNotifications::templateExists(const std::string& name) return (mTemplates.count(name) != 0); } -void LLNotifications::clearTemplates() -{ - mTemplates.clear(); -} - void LLNotifications::forceResponse(const LLNotification::Params& params, S32 option) { LLNotificationPtr temp_notify(new LLNotification(params)); @@ -1162,190 +1311,88 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements) } } -// private to this file -// returns true if the template request was invalid and there's nothing else we -// can do with this node, false if you should keep processing (it may have -// replaced the contents of the node referred to) -LLXMLNodePtr LLNotifications::checkForXMLTemplate(LLXMLNodePtr item) +void replaceFormText(LLNotificationForm::Params& form, const std::string& pattern, const std::string& replace) { - if (item->hasName("usetemplate")) + if (form.ignore.isProvided() && form.ignore.text() == pattern) { - std::string replacementName; - if (item->getAttributeString("name", replacementName)) + form.ignore.text = replace; + } + for (LLInitParam::ParamIterator<LLNotificationForm::FormElement>::iterator it = form.form_elements.elements.begin(), + end_it = form.form_elements.elements.end(); + it != end_it; + ++it) + { + if (it->button.isChosen() && it->button.text() == pattern) { - StringMap replacements; - for (LLXMLAttribList::const_iterator it=item->mAttributes.begin(); - it != item->mAttributes.end(); ++it) - { - replacements[it->second->getName()->mString] = it->second->getValue(); - } - if (mXmlTemplates.count(replacementName)) - { - item=LLXMLNode::replaceNode(item, mXmlTemplates[replacementName]); - - // walk the nodes looking for $(substitution) here and replace - replaceSubstitutionStrings(item, replacements); - } - else - { - llwarns << "XML template lookup failure on '" << replacementName << "' " << llendl; - } + it->button.text = replace; } } - return item; } bool LLNotifications::loadTemplates() { const std::string xml_filename = "notifications.xml"; + std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename); + LLXMLNodePtr root; - BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root); if (!success || root.isNull() || !root->hasName( "notifications" )) { - llerrs << "Problem reading UI Notifications file: " << xml_filename << llendl; + llerrs << "Problem reading UI Notifications file: " << full_filename << llendl; return false; } - - clearTemplates(); - - for (LLXMLNodePtr item = root->getFirstChild(); - item.notNull(); item = item->getNextSibling()) - { - // we do this FIRST so that item can be changed if we - // encounter a usetemplate -- we just replace the - // current xml node and keep processing - item = checkForXMLTemplate(item); - - if (item->hasName("global")) - { - std::string global_name; - if (item->getAttributeString("name", global_name)) - { - mGlobalStrings[global_name] = item->getTextContents(); - } - continue; - } - - if (item->hasName("template")) - { - // store an xml template; templates must have a single node (can contain - // other nodes) - std::string name; - item->getAttributeString("name", name); - LLXMLNodePtr ptr = item->getFirstChild(); - mXmlTemplates[name] = ptr; - continue; - } - - if (!item->hasName("notification")) - { - llwarns << "Unexpected entity " << item->getName()->mString << - " found in " << xml_filename << llendl; - continue; - } - - // now we know we have a notification entry, so let's build it - LLNotificationTemplatePtr pTemplate(new LLNotificationTemplate()); - if (!item->getAttributeString("name", pTemplate->mName)) - { - llwarns << "Unable to parse notification with no name" << llendl; - continue; - } - - //llinfos << "Parsing " << pTemplate->mName << llendl; - - pTemplate->mMessage = item->getTextContents(); - pTemplate->mDefaultFunctor = pTemplate->mName; - item->getAttributeString("type", pTemplate->mType); - item->getAttributeString("icon", pTemplate->mIcon); - item->getAttributeString("label", pTemplate->mLabel); - item->getAttributeU32("duration", pTemplate->mExpireSeconds); - item->getAttributeU32("expireOption", pTemplate->mExpireOption); - - std::string priority; - item->getAttributeString("priority", priority); - pTemplate->mPriority = NOTIFICATION_PRIORITY_NORMAL; - if (!priority.empty()) - { - if (priority == "low") pTemplate->mPriority = NOTIFICATION_PRIORITY_LOW; - if (priority == "normal") pTemplate->mPriority = NOTIFICATION_PRIORITY_NORMAL; - if (priority == "high") pTemplate->mPriority = NOTIFICATION_PRIORITY_HIGH; - if (priority == "critical") pTemplate->mPriority = NOTIFICATION_PRIORITY_CRITICAL; - } - - item->getAttributeString("functor", pTemplate->mDefaultFunctor); - - BOOL persist = false; - item->getAttributeBOOL("persist", persist); - pTemplate->mPersist = persist; - - std::string sound; - item->getAttributeString("sound", sound); - if (!sound.empty()) + LLNotificationTemplate::Notifications params; + LLXUIParser parser; + parser.readXUI(root, params, full_filename); + + mTemplates.clear(); + + for(LLInitParam::ParamIterator<LLNotificationTemplate::GlobalString>::const_iterator it = params.strings.begin(), end_it = params.strings.end(); + it != end_it; + ++it) + { + mGlobalStrings[it->name] = it->value; + } + + std::map<std::string, LLNotificationForm::Params> form_templates; + + for(LLInitParam::ParamIterator<LLNotificationTemplate::Template>::const_iterator it = params.templates.begin(), end_it = params.templates.end(); + it != end_it; + ++it) + { + form_templates[it->name] = it->form; + } + + for(LLInitParam::ParamIterator<LLNotificationTemplate::Params>::iterator it = params.notifications.begin(), end_it = params.notifications.end(); + it != end_it; + ++it) + { + if (it->form_ref.form_template.isChosen()) { - // test for bad sound effect name / missing effect - if (LLUI::sSettingGroups["config"]->controlExists(sound)) + // replace form contents from template + it->form_ref.form = form_templates[it->form_ref.form_template.name]; + if(it->form_ref.form_template.yes_text.isProvided()) { - pTemplate->mSoundEffect = - LLUUID(LLUI::sSettingGroups["config"]->getString(sound)); + replaceFormText(it->form_ref.form, "$yestext", it->form_ref.form_template.yes_text); } - else + if(it->form_ref.form_template.no_text.isProvided()) { - llwarns << "Unknown sound effect control name " << sound - << llendl; + replaceFormText(it->form_ref.form, "$notext", it->form_ref.form_template.no_text); } - } - - for (LLXMLNodePtr child = item->getFirstChild(); - !child.isNull(); child = child->getNextSibling()) - { - child = checkForXMLTemplate(child); - - // <url> - if (child->hasName("url")) + if(it->form_ref.form_template.cancel_text.isProvided()) { - pTemplate->mURL = child->getTextContents(); - child->getAttributeU32("option", pTemplate->mURLOption); - child->getAttributeU32("openexternally", pTemplate->mURLOpenExternally); + replaceFormText(it->form_ref.form, "$canceltext", it->form_ref.form_template.cancel_text); } - - if (child->hasName("unique")) - { - pTemplate->mUnique = true; - for (LLXMLNodePtr formitem = child->getFirstChild(); - !formitem.isNull(); formitem = formitem->getNextSibling()) - { - if (formitem->hasName("context")) - { - std::string key; - formitem->getAttributeString("key", key); - pTemplate->mUniqueContext.push_back(key); - //llwarns << "adding " << key << " to unique context" << llendl; - } - else - { - llwarns << "'unique' has unrecognized subelement " - << formitem->getName()->mString << llendl; - } - } - } - - // <form> - if (child->hasName("form")) + if(it->form_ref.form_template.ignore_text.isProvided()) { - pTemplate->mForm = LLNotificationFormPtr(new LLNotificationForm(pTemplate->mName, child)); + replaceFormText(it->form_ref.form, "$ignoretext", it->form_ref.form_template.ignore_text); } } - addTemplate(pTemplate->mName, pTemplate); + addTemplate(it->name, LLNotificationTemplatePtr(new LLNotificationTemplate(*it))); } - - //std::ostringstream ostream; - //root->writeToOstream(ostream, "\n "); - //llwarns << ostream.str() << llendl; - + return true; } @@ -1396,6 +1443,8 @@ LLNotificationPtr LLNotifications::add(const LLNotification::Params& p) void LLNotifications::add(const LLNotificationPtr pNotif) { + if (pNotif == NULL) return; + // first see if we already have it -- if so, that's a problem LLNotificationSet::iterator it=mItems.find(pNotif); if (it != mItems.end()) @@ -1408,6 +1457,8 @@ void LLNotifications::add(const LLNotificationPtr pNotif) void LLNotifications::cancel(LLNotificationPtr pNotif) { + if (pNotif == NULL) return; + LLNotificationSet::iterator it=mItems.find(pNotif); if (it == mItems.end()) { @@ -1417,6 +1468,30 @@ void LLNotifications::cancel(LLNotificationPtr pNotif) updateItem(LLSD().with("sigtype", "delete").with("id", pNotif->id()), pNotif); } +void LLNotifications::cancelByName(const std::string& name) +{ + std::vector<LLNotificationPtr> notifs_to_cancel; + for (LLNotificationSet::iterator it=mItems.begin(), end_it = mItems.end(); + it != end_it; + ++it) + { + LLNotificationPtr pNotif = *it; + if (pNotif->getName() == name) + { + notifs_to_cancel.push_back(pNotif); + } + } + + for (std::vector<LLNotificationPtr>::iterator it = notifs_to_cancel.begin(), end_it = notifs_to_cancel.end(); + it != end_it; + ++it) + { + LLNotificationPtr pNotif = *it; + pNotif->cancel(); + updateItem(LLSD().with("sigtype", "delete").with("id", pNotif->id()), pNotif); + } +} + void LLNotifications::update(const LLNotificationPtr pNotif) { LLNotificationSet::iterator it=mItems.find(pNotif); @@ -1481,17 +1556,50 @@ std::ostream& operator<<(std::ostream& s, const LLNotification& notification) return s; } -void LLPostponedNotification::onCachedNameReceived(const LLUUID& id, const std::string& first, - const std::string& last, bool is_group) +//static +void LLPostponedNotification::lookupName(LLPostponedNotification* thiz, + const LLUUID& id, + bool is_group) +{ + if (is_group) + { + gCacheName->getGroup(id, + boost::bind(&LLPostponedNotification::onGroupNameCache, + thiz, _1, _2, _3)); + } + else + { + LLAvatarNameCache::get(id, + boost::bind(&LLPostponedNotification::onAvatarNameCache, + thiz, _1, _2)); + } +} + +void LLPostponedNotification::onGroupNameCache(const LLUUID& id, + const std::string& full_name, + bool is_group) { - mName = first + " " + last; + finalizeName(full_name); +} - LLStringUtil::trim(mName); - if (mName.empty()) +void LLPostponedNotification::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) +{ + std::string name = av_name.getCompleteName(); + + // from PE merge - we should figure out if this is the right thing to do + if (name.empty()) { - llwarns << "Empty name received for Id: " << id << llendl; - mName = SYSTEM_FROM; + llwarns << "Empty name received for Id: " << agent_id << llendl; + name = SYSTEM_FROM; } + + finalizeName(name); +} + +void LLPostponedNotification::finalizeName(const std::string& name) +{ + mName = name; modifyNotificationParams(); LLNotifications::instance().add(mParams); cleanup(); diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 2cc8803f10..524cff70e8 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -98,9 +98,8 @@ #include "llinitparam.h" #include "llnotificationslistener.h" #include "llnotificationptr.h" -#include "llcachename.h" - +class LLAvatarName; typedef enum e_notification_priority { NOTIFICATION_PRIORITY_UNSPECIFIED, @@ -110,6 +109,11 @@ typedef enum e_notification_priority NOTIFICATION_PRIORITY_CRITICAL } ENotificationPriority; +struct NotificationPriorityValues : public LLInitParam::TypeValuesHelper<ENotificationPriority, NotificationPriorityValues> +{ + static void declareValues(); +}; + class LLNotificationResponderInterface { public: @@ -157,6 +161,68 @@ class LLNotificationForm LOG_CLASS(LLNotificationForm); public: + struct FormElementBase : public LLInitParam::Block<FormElementBase> + { + Optional<std::string> name; + + FormElementBase(); + }; + + struct FormIgnore : public LLInitParam::Block<FormIgnore, FormElementBase> + { + Optional<std::string> text; + Optional<bool> save_option; + Optional<std::string> control; + Optional<bool> invert_control; + + FormIgnore(); + }; + + struct FormButton : public LLInitParam::Block<FormButton, FormElementBase> + { + Mandatory<S32> index; + Mandatory<std::string> text; + Optional<std::string> ignore; + Optional<bool> is_default; + + Mandatory<std::string> type; + + FormButton(); + }; + + struct FormInput : public LLInitParam::Block<FormInput, FormElementBase> + { + Mandatory<std::string> type; + Optional<S32> width; + Optional<S32> max_length_chars; + + Optional<std::string> value; + FormInput(); + }; + + struct FormElement : public LLInitParam::Choice<FormElement> + { + Alternative<FormButton> button; + Alternative<FormInput> input; + + FormElement(); + }; + + struct FormElements : public LLInitParam::Block<FormElements> + { + Multiple<FormElement> elements; + FormElements(); + }; + + struct Params : public LLInitParam::Block<Params> + { + Optional<std::string> name; + Optional<FormIgnore> ignore; + Optional<FormElements> form_elements; + + Params(); + }; + typedef enum e_ignore_type { IGNORE_NO, @@ -167,8 +233,7 @@ public: LLNotificationForm(); LLNotificationForm(const LLSD& sd); - LLNotificationForm(const std::string& name, - const LLPointer<class LLXMLNode> xml_node); + LLNotificationForm(const std::string& name, const Params& p); LLSD asLLSD() const; @@ -181,92 +246,25 @@ public: // appends form elements from another form serialized as LLSD void append(const LLSD& sub_form); std::string getDefaultOption(); + LLPointer<class LLControlVariable> getIgnoreSetting(); + bool getIgnored(); + void setIgnored(bool ignored); EIgnoreType getIgnoreType() { return mIgnore; } std::string getIgnoreMessage() { return mIgnoreMsg; } private: - LLSD mFormData; - EIgnoreType mIgnore; - std::string mIgnoreMsg; + LLSD mFormData; + EIgnoreType mIgnore; + std::string mIgnoreMsg; + LLPointer<class LLControlVariable> mIgnoreSetting; + bool mInvertSetting; }; typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr; -// This is the class of object read from the XML file (notifications.xml, -// from the appropriate local language directory). -struct LLNotificationTemplate -{ - LLNotificationTemplate(); - // the name of the notification -- the key used to identify it - // Ideally, the key should follow variable naming rules - // (no spaces or punctuation). - std::string mName; - // The type of the notification - // used to control which queue it's stored in - std::string mType; - // The text used to display the notification. Replaceable parameters - // are enclosed in square brackets like this []. - std::string mMessage; - // The label for the notification; used for - // certain classes of notification (those with a window and a window title). - // Also used when a notification pops up underneath the current one. - // Replaceable parameters can be used in the label. - std::string mLabel; - // The name of the icon image. This should include an extension. - std::string mIcon; - // This is the Highlander bit -- "There Can Be Only One" - // An outstanding notification with this bit set - // is updated by an incoming notification with the same name, - // rather than creating a new entry in the queue. - // (used for things like progress indications, or repeating warnings - // like "the grid is going down in N minutes") - bool mUnique; - // if we want to be unique only if a certain part of the payload is constant - // specify the field names for the payload. The notification will only be - // combined if all of the fields named in the context are identical in the - // new and the old notification; otherwise, the notification will be - // duplicated. This is to support suppressing duplicate offers from the same - // sender but still differentiating different offers. Example: Invitation to - // conference chat. - std::vector<std::string> mUniqueContext; - // If this notification expires automatically, this value will be - // nonzero, and indicates the number of seconds for which the notification - // will be valid (a teleport offer, for example, might be valid for - // 300 seconds). - U32 mExpireSeconds; - // if the offer expires, one of the options is chosen automatically - // based on its "value" parameter. This controls which one. - // If expireSeconds is specified, expireOption should also be specified. - U32 mExpireOption; - // if the notification contains a url, it's stored here (and replaced - // into the message where [_URL] is found) - std::string mURL; - // if there's a URL in the message, this controls which option visits - // that URL. Obsolete this and eliminate the buttons for affected - // messages when we allow clickable URLs in the UI - U32 mURLOption; - - U32 mURLOpenExternally; - //This is a flag that tells if the url needs to open externally dispite - //what the user setting is. - - // does this notification persist across sessions? if so, it will be - // serialized to disk on first receipt and read on startup - bool mPersist; - // This is the name of the default functor, if present, to be - // used for the notification's callback. It is optional, and used only if - // the notification is constructed without an identified functor. - std::string mDefaultFunctor; - // The form data associated with a given notification (buttons, text boxes, etc) - LLNotificationFormPtr mForm; - // default priority for notifications of this type - ENotificationPriority mPriority; - // UUID of the audio file to be played when this notification arrives - // this is loaded as a name, but looked up to get the UUID upon template load. - // If null, it wasn't specified. - LLUUID mSoundEffect; -}; + +struct LLNotificationTemplate; // we want to keep a map of these by name, and it's best to manage them // with smart pointers @@ -302,7 +300,7 @@ public: // optional Optional<LLSD> substitutions; Optional<LLSD> payload; - Optional<ENotificationPriority> priority; + Optional<ENotificationPriority, NotificationPriorityValues> priority; Optional<LLSD> form_elements; Optional<LLDate> time_stamp; Optional<LLNotificationContext*> context; @@ -445,6 +443,7 @@ public: LLSD asLLSD(); void respond(const LLSD& sd); + void respondWithDefault(); void* getResponder() { return mResponderObj; } @@ -462,6 +461,13 @@ public: return mRespondedTo; } + bool isActive() const + { + return !isRespondedTo() + && !isCancelled() + && !isExpired(); + } + const LLSD& getResponse() { return mResponse; } bool isIgnored() const @@ -469,15 +475,11 @@ public: return mIgnored; } - const std::string& getName() const - { - return mTemplatep->mName; - } + const std::string& getName() const; - bool isPersistent() const - { - return mTemplatep->mPersist; - } + const std::string& getIcon() const; + + bool isPersistent() const; const LLUUID& id() const { @@ -499,28 +501,12 @@ public: return mTimestamp; } - std::string getType() const - { - return (mTemplatep ? mTemplatep->mType : ""); - } - + std::string getType() const; std::string getMessage() const; std::string getLabel() const; - std::string getURL() const; -// { -// return (mTemplatep ? mTemplatep->mURL : ""); -// } - - S32 getURLOption() const - { - return (mTemplatep ? mTemplatep->mURLOption : -1); - } - - S32 getURLOpenExternally() const - { - return(mTemplatep? mTemplatep->mURLOpenExternally : -1); - } + S32 getURLOption() const; + S32 getURLOpenExternally() const; const LLNotificationFormPtr getForm(); @@ -590,7 +576,7 @@ public: std::string summarize() const; - bool hasUniquenessConstraints() const { return (mTemplatep ? mTemplatep->mUnique : false);} + bool hasUniquenessConstraints() const; virtual ~LLNotification() {} }; @@ -872,7 +858,6 @@ public: // load notification descriptions from file; // OK to call more than once because it will reload bool loadTemplates(); - LLPointer<class LLXMLNode> checkForXMLTemplate(LLPointer<class LLXMLNode> item); // Add a simple notification (from XUI) void addFromCallback(const LLSD& name); @@ -894,6 +879,7 @@ public: void add(const LLNotificationPtr pNotif); void cancel(LLNotificationPtr pNotif); + void cancelByName(const std::string& name); void update(const LLNotificationPtr pNotif); LLNotificationPtr find(LLUUID uuid); @@ -917,8 +903,6 @@ public: // test for existence bool templateExists(const std::string& name); - // useful if you're reloading the file - void clearTemplates(); // erase all templates void forceResponse(const LLNotification::Params& params, S32 option); @@ -956,9 +940,6 @@ private: std::string mFileName; - typedef std::map<std::string, LLPointer<class LLXMLNode> > XMLTemplateMap; - XMLTemplateMap mXmlTemplates; - LLNotificationMap mUniqueNotifications; typedef std::map<std::string, std::string> GlobalStringMap; @@ -994,17 +975,20 @@ public: { // upcast T to the base type to restrict T derivation from LLPostponedNotification LLPostponedNotification* thiz = new T(); - thiz->mParams = params; - gCacheName->get(id, is_group, boost::bind( - &LLPostponedNotification::onCachedNameReceived, thiz, _1, _2, - _3, _4)); + // Avoid header file dependency on llcachename.h + lookupName(thiz, id, is_group); } private: - void onCachedNameReceived(const LLUUID& id, const std::string& first, - const std::string& last, bool is_group); + static void lookupName(LLPostponedNotification* thiz, const LLUUID& id, bool is_group); + // only used for groups + void onGroupNameCache(const LLUUID& id, const std::string& full_name, bool is_group); + // only used for avatars + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); + // used for both group and avatar names + void finalizeName(const std::string& name); void cleanup() { diff --git a/indra/llui/llnotificationslistener.cpp b/indra/llui/llnotificationslistener.cpp index 44a90398fd..3bbeb3a778 100644 --- a/indra/llui/llnotificationslistener.cpp +++ b/indra/llui/llnotificationslistener.cpp @@ -29,6 +29,7 @@ #include "linden_common.h" #include "llnotificationslistener.h" #include "llnotifications.h" +#include "llnotificationtemplate.h" #include "llsd.h" #include "llui.h" @@ -182,7 +183,11 @@ void LLNotificationsListener::ignore(const LLSD& params) const if (params["name"].isDefined()) { // ["name"] was passed: ignore just that notification - LLUI::sSettingGroups["ignores"]->setBOOL(params["name"], ignore); + LLNotificationTemplatePtr templatep = mNotifications.getTemplate(params["name"]); + if (templatep) + { + templatep->mForm->setIgnored(ignore); + } } else { diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h new file mode 100644 index 0000000000..6bc0d2aaff --- /dev/null +++ b/indra/llui/llnotificationtemplate.h @@ -0,0 +1,282 @@ +/** +* @file llnotificationtemplate.h +* @brief Description of notification contents +* @author Q (with assistance from Richard and Coco) +* +* $LicenseInfo:firstyear=2008&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_LLNOTIFICATION_TEMPLATE_H +#define LL_LLNOTIFICATION_TEMPLATE_H + +//#include <string> +//#include <list> +//#include <vector> +//#include <map> +//#include <set> +//#include <iomanip> +//#include <sstream> +// +//#include <boost/utility.hpp> +//#include <boost/shared_ptr.hpp> +//#include <boost/enable_shared_from_this.hpp> +//#include <boost/type_traits.hpp> +// +//// we want to minimize external dependencies, but this one is important +//#include "llsd.h" +// +//// and we need this to manage the notification callbacks +//#include "llevents.h" +//#include "llfunctorregistry.h" +//#include "llpointer.h" +#include "llinitparam.h" +//#include "llnotificationslistener.h" +//#include "llnotificationptr.h" +//#include "llcachename.h" +#include "llnotifications.h" + + +typedef boost::shared_ptr<LLNotificationForm> LLNotificationFormPtr; + +// This is the class of object read from the XML file (notifications.xml, +// from the appropriate local language directory). +struct LLNotificationTemplate +{ + struct GlobalString : public LLInitParam::Block<GlobalString> + { + Mandatory<std::string> name, + value; + + GlobalString() + : name("name"), + value("value") + {} + }; + + struct UniquenessContext : public LLInitParam::Block<UniquenessContext> + { + Mandatory<std::string> key; + + UniquenessContext() + : key("key") + {} + + }; + + struct UniquenessConstraint : public LLInitParam::Block<UniquenessConstraint> + { + private: + // this idiom allows + // <notification unique="true"> + // as well as + // <notification> <unique> <context key=""/> </unique>... + Optional<bool> dummy_val; + public: + Multiple<UniquenessContext> contexts; + + UniquenessConstraint() + : contexts("context"), + dummy_val("") + {} + }; + + // Templates are used to define common form types, such as OK/Cancel dialogs, etc. + + struct Template : public LLInitParam::Block<Template> + { + Mandatory<std::string> name; + Mandatory<LLNotificationForm::Params> form; + + Template() + : name("name"), + form("form") + {} + }; + + // Reference a template to use its form elements + struct TemplateRef : public LLInitParam::Block<TemplateRef> + { + Mandatory<std::string> name; + Optional<std::string> yes_text, + no_text, + cancel_text, + ignore_text; + + TemplateRef() + : name("name"), + yes_text("yestext"), + no_text("notext"), + cancel_text("canceltext"), + ignore_text("ignoretext") + {} + }; + + struct URL : public LLInitParam::Block<URL> + { + Mandatory<S32> option; + Mandatory<std::string> value; + Optional<std::string> target; + Ignored name; + + URL() + : option("option", -1), + value("value"), + target("target", "_blank"), + name("name") + {} + }; + + struct FormRef : public LLInitParam::Choice<FormRef> + { + Alternative<LLNotificationForm::Params> form; + Alternative<TemplateRef> form_template; + + FormRef() + : form("form"), + form_template("usetemplate") + {} + }; + + struct Params : public LLInitParam::Block<Params> + { + Mandatory<std::string> name; + Optional<bool> persist; + Optional<std::string> functor, + icon, + label, + sound, + type, + value; + Optional<U32> duration; + Optional<S32> expire_option; + Optional<URL> url; + Optional<UniquenessConstraint> unique; + Optional<FormRef> form_ref; + Optional<ENotificationPriority, + NotificationPriorityValues> priority; + + + Params() + : name("name"), + persist("persist", false), + functor("functor"), + icon("icon"), + label("label"), + priority("priority"), + sound("sound"), + type("type"), + value("value"), + duration("duration"), + expire_option("expireOption", -1), + url("url"), + unique("unique"), + form_ref("") + {} + + }; + + struct Notifications : public LLInitParam::Block<Notifications> + { + Multiple<GlobalString> strings; + Multiple<Template> templates; + Multiple<Params> notifications; + + Notifications() + : strings("global"), + notifications("notification"), + templates("template") + {} + }; + + LLNotificationTemplate(const Params& p); + // the name of the notification -- the key used to identify it + // Ideally, the key should follow variable naming rules + // (no spaces or punctuation). + std::string mName; + // The type of the notification + // used to control which queue it's stored in + std::string mType; + // The text used to display the notification. Replaceable parameters + // are enclosed in square brackets like this []. + std::string mMessage; + // The label for the notification; used for + // certain classes of notification (those with a window and a window title). + // Also used when a notification pops up underneath the current one. + // Replaceable parameters can be used in the label. + std::string mLabel; + // The name of the icon image. This should include an extension. + std::string mIcon; + // This is the Highlander bit -- "There Can Be Only One" + // An outstanding notification with this bit set + // is updated by an incoming notification with the same name, + // rather than creating a new entry in the queue. + // (used for things like progress indications, or repeating warnings + // like "the grid is going down in N minutes") + bool mUnique; + // if we want to be unique only if a certain part of the payload is constant + // specify the field names for the payload. The notification will only be + // combined if all of the fields named in the context are identical in the + // new and the old notification; otherwise, the notification will be + // duplicated. This is to support suppressing duplicate offers from the same + // sender but still differentiating different offers. Example: Invitation to + // conference chat. + std::vector<std::string> mUniqueContext; + // If this notification expires automatically, this value will be + // nonzero, and indicates the number of seconds for which the notification + // will be valid (a teleport offer, for example, might be valid for + // 300 seconds). + U32 mExpireSeconds; + // if the offer expires, one of the options is chosen automatically + // based on its "value" parameter. This controls which one. + // If expireSeconds is specified, expireOption should also be specified. + U32 mExpireOption; + // if the notification contains a url, it's stored here (and replaced + // into the message where [_URL] is found) + std::string mURL; + // if there's a URL in the message, this controls which option visits + // that URL. Obsolete this and eliminate the buttons for affected + // messages when we allow clickable URLs in the UI + U32 mURLOption; + + std::string mURLTarget; + //This is a flag that tells if the url needs to open externally dispite + //what the user setting is. + + // does this notification persist across sessions? if so, it will be + // serialized to disk on first receipt and read on startup + bool mPersist; + // This is the name of the default functor, if present, to be + // used for the notification's callback. It is optional, and used only if + // the notification is constructed without an identified functor. + std::string mDefaultFunctor; + // The form data associated with a given notification (buttons, text boxes, etc) + LLNotificationFormPtr mForm; + // default priority for notifications of this type + ENotificationPriority mPriority; + // UUID of the audio file to be played when this notification arrives + // this is loaded as a name, but looked up to get the UUID upon template load. + // If null, it wasn't specified. + LLUUID mSoundEffect; +}; + +#endif //LL_LLNOTIFICATION_TEMPLATE_H + diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index b2e08c48c5..900e2c789e 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -35,6 +35,7 @@ #include "llfontgl.h" #include "llrect.h" #include "llerror.h" +#include "lldir.h" #include "lltimer.h" #include "llaccordionctrltab.h" @@ -52,6 +53,8 @@ #include "lltabcontainer.h" static LLDefaultChildRegistry::Register<LLPanel> r1("panel", &LLPanel::fromXML); +LLPanel::factory_stack_t LLPanel::sFactoryStack; + // Compiler optimization, generate extern template template class LLPanel* LLView::getChild<class LLPanel>( @@ -380,8 +383,7 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_ LLPanel* panelp = NULL; - { - LLFastTimer timer(FTM_PANEL_CONSTRUCTION); + { LLFastTimer _(FTM_PANEL_CONSTRUCTION); if(!class_attr.empty()) { @@ -394,7 +396,7 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_ if (!panelp) { - panelp = LLUICtrlFactory::getInstance()->createFactoryPanel(name); + panelp = createFactoryPanel(name); llassert(panelp); if (!panelp) @@ -407,20 +409,20 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_ // factory panels may have registered their own factory maps if (!panelp->getFactoryMap().empty()) { - LLUICtrlFactory::instance().pushFactoryFunctions(&panelp->getFactoryMap()); + sFactoryStack.push_back(&panelp->getFactoryMap()); } // for local registry callbacks; define in constructor, referenced in XUI or postBuild panelp->mCommitCallbackRegistrar.pushScope(); panelp->mEnableCallbackRegistrar.pushScope(); - panelp->initPanelXML(node, parent, output_node); + panelp->initPanelXML(node, parent, output_node, LLUICtrlFactory::getDefaultParams<LLPanel>()); panelp->mCommitCallbackRegistrar.popScope(); panelp->mEnableCallbackRegistrar.popScope(); if (!panelp->getFactoryMap().empty()) { - LLUICtrlFactory::instance().popFactoryFunctions(); + sFactoryStack.pop_back(); } return panelp; @@ -444,8 +446,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p) setVisibleCallback(initCommitCallback(p.visible_callback)); } - for (LLInitParam::ParamIterator<LocalizedString>::const_iterator it = p.strings().begin(); - it != p.strings().end(); + for (LLInitParam::ParamIterator<LocalizedString>::const_iterator it = p.strings.begin(); + it != p.strings.end(); ++it) { mUIStrings[it->name] = it->value; @@ -487,11 +489,9 @@ static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup"); static LLFastTimer::DeclareTimer FTM_EXTERNAL_PANEL_LOAD("Load Extern Panel Reference"); static LLFastTimer::DeclareTimer FTM_PANEL_POSTBUILD("Panel PostBuild"); -BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node) +BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node, const LLPanel::Params& default_params) { - const LLPanel::Params& default_params(LLUICtrlFactory::getDefaultParams<LLPanel>()); Params params(default_params); - { LLFastTimer timer(FTM_PANEL_SETUP); @@ -505,6 +505,8 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu setXMLFilename(xml_filename); } + LLXUIParser parser; + if (!xml_filename.empty()) { LLUICtrlFactory::instance().pushFileName(xml_filename); @@ -514,12 +516,11 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu { //if we are exporting, we want to export the current xml //not the referenced xml - LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); + parser.readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); Params output_params(params); setupParamsForExport(output_params, parent); output_node->setName(node->getName()->mString); - LLXUIParser::instance().writeXUI( - output_node, output_params, &default_params); + parser.writeXUI(output_node, output_params, &default_params); return TRUE; } @@ -530,7 +531,7 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu return FALSE; } - LLXUIParser::instance().readXUI(referenced_xml, params, LLUICtrlFactory::getInstance()->getCurFileName()); + parser.readXUI(referenced_xml, params, LLUICtrlFactory::getInstance()->getCurFileName()); // add children using dimensions from referenced xml for consistent layout setShape(params.rect); @@ -540,15 +541,14 @@ BOOL LLPanel::initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr outpu } // ask LLUICtrlFactory for filename, since xml_filename might be empty - LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); + parser.readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); if (output_node) { Params output_params(params); setupParamsForExport(output_params, parent); output_node->setName(node->getName()->mString); - LLXUIParser::instance().writeXUI( - output_node, output_params, &default_params); + parser.writeXUI(output_node, output_params, &default_params); } params.from_xui = true; @@ -904,7 +904,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp() child = *it; // do we have a panel with a help topic? LLPanel *panel = dynamic_cast<LLPanel *>(child); - if (panel && panel->getVisible() && !panel->getHelpTopic().empty()) + if (panel && panel->isInVisibleChain() && !panel->getHelpTopic().empty()) { return panel; } @@ -959,3 +959,89 @@ boost::signals2::connection LLPanel::setVisibleCallback( const commit_signal_t:: return mVisibleSignal->connect(cb); } + +static LLFastTimer::DeclareTimer FTM_BUILD_PANELS("Build Panels"); + +//----------------------------------------------------------------------------- +// buildPanel() +//----------------------------------------------------------------------------- +BOOL LLPanel::buildFromFile(const std::string& filename, LLXMLNodePtr output_node, const LLPanel::Params& default_params) +{ + LLFastTimer timer(FTM_BUILD_PANELS); + BOOL didPost = FALSE; + LLXMLNodePtr root; + + //if exporting, only load the language being exported, + //instead of layering localized version on top of english + if (output_node) + { + if (!LLUICtrlFactory::getLocalizedXMLNode(filename, root)) + { + llwarns << "Couldn't parse panel from: " << LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; + return didPost; + } + } + else if (!LLUICtrlFactory::getLayeredXMLNode(filename, root)) + { + llwarns << "Couldn't parse panel from: " << LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; + return didPost; + } + + // root must be called panel + if( !root->hasName("panel" ) ) + { + llwarns << "Root node should be named panel in : " << filename << llendl; + return didPost; + } + + lldebugs << "Building panel " << filename << llendl; + + LLUICtrlFactory::instance().pushFileName(filename); + { + if (!getFactoryMap().empty()) + { + sFactoryStack.push_back(&getFactoryMap()); + } + + // for local registry callbacks; define in constructor, referenced in XUI or postBuild + getCommitCallbackRegistrar().pushScope(); + getEnableCallbackRegistrar().pushScope(); + + didPost = initPanelXML(root, NULL, output_node, default_params); + + getCommitCallbackRegistrar().popScope(); + getEnableCallbackRegistrar().popScope(); + + setXMLFilename(filename); + + if (!getFactoryMap().empty()) + { + sFactoryStack.pop_back(); + } + } + LLUICtrlFactory::instance().popFileName(); + return didPost; +} + +//----------------------------------------------------------------------------- +// createFactoryPanel() +//----------------------------------------------------------------------------- +LLPanel* LLPanel::createFactoryPanel(const std::string& name) +{ + std::deque<const LLCallbackMap::map_t*>::iterator itor; + for (itor = sFactoryStack.begin(); itor != sFactoryStack.end(); ++itor) + { + const LLCallbackMap::map_t* factory_map = *itor; + + // Look up this panel's name in the map. + LLCallbackMap::map_const_iter_t iter = factory_map->find( name ); + if (iter != factory_map->end()) + { + // Use the factory to create the panel, instead of using a default LLPanel. + LLPanel *ret = (LLPanel*) iter->second.mCallback( iter->second.mData ); + return ret; + } + } + LLPanel::Params panel_p; + return LLUICtrlFactory::create<LLPanel>(panel_p); +} diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h index a7224648c1..c1a1a06f39 100644 --- a/indra/llui/llpanel.h +++ b/indra/llui/llpanel.h @@ -104,7 +104,10 @@ protected: LLPanel(const LLPanel::Params& params = getDefaultParams()); public: -// LLPanel(const std::string& name, const LLRect& rect = LLRect(), BOOL bordered = TRUE); + BOOL buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL, const LLPanel::Params&default_params = getDefaultParams()); + + static LLPanel* createFactoryPanel(const std::string& name); + /*virtual*/ ~LLPanel(); // LLView interface @@ -157,7 +160,7 @@ public: EnableCallbackRegistry::ScopedRegistrar& getEnableCallbackRegistrar() { return mEnableCallbackRegistrar; } void initFromParams(const Params& p); - BOOL initPanelXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node = NULL); + BOOL initPanelXML( LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node, const LLPanel::Params& default_params); bool hasString(const std::string& name); std::string getString(const std::string& name, const LLStringUtil::format_map_t& args) const; @@ -256,6 +259,8 @@ protected: commit_signal_t* mVisibleSignal; // Called when visibility changes, passes new visibility as LLSD() std::string mHelpTopic; // the name of this panel's help topic to display in the Help Viewer + typedef std::deque<const LLCallbackMap::map_t*> factory_stack_t; + static factory_stack_t sFactoryStack; private: BOOL mBgVisible; // any background at all? @@ -285,4 +290,57 @@ extern template class LLPanel* LLView::getChild<class LLPanel>( const std::string& name, BOOL recurse) const; #endif +typedef boost::function<LLPanel* (void)> LLPanelClassCreatorFunc; + +// local static instance for registering a particular panel class + +class LLRegisterPanelClass +: public LLSingleton< LLRegisterPanelClass > +{ +public: + // reigister with either the provided builder, or the generic templated builder + void addPanelClass(const std::string& tag,LLPanelClassCreatorFunc func) + { + mPanelClassesNames[tag] = func; + } + + LLPanel* createPanelClass(const std::string& tag) + { + param_name_map_t::iterator iT = mPanelClassesNames.find(tag); + if(iT == mPanelClassesNames.end()) + return 0; + return iT->second(); + } + template<typename T> + static T* defaultPanelClassBuilder() + { + T* pT = new T(); + return pT; + } + +private: + typedef std::map< std::string, LLPanelClassCreatorFunc> param_name_map_t; + + param_name_map_t mPanelClassesNames; +}; + + +// local static instance for registering a particular panel class +template<typename T> +class LLRegisterPanelClassWrapper +: public LLRegisterPanelClass +{ +public: + // reigister with either the provided builder, or the generic templated builder + LLRegisterPanelClassWrapper(const std::string& tag); +}; + + +template<typename T> +LLRegisterPanelClassWrapper<T>::LLRegisterPanelClassWrapper(const std::string& tag) +{ + LLRegisterPanelClass::instance().addPanelClass(tag,&LLRegisterPanelClass::defaultPanelClassBuilder<T>); +} + + #endif diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index 83c42a5ab8..cc348fdc63 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -100,8 +100,8 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p) void LLRadioGroup::initFromParams(const Params& p) { - for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin(); - it != p.items().end(); + for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items.begin(); + it != p.items.end(); ++it) { LLRadioGroup::ItemParams item_params(*it); diff --git a/indra/llui/llrngwriter.cpp b/indra/llui/llrngwriter.cpp index 50b7bbab90..5e6840d7df 100644 --- a/indra/llui/llrngwriter.cpp +++ b/indra/llui/llrngwriter.cpp @@ -30,10 +30,15 @@ #include "lluicolor.h" #include "lluictrlfactory.h" +static LLInitParam::Parser::parser_read_func_map_t sReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs; + // // LLRNGWriter - writes Relax NG schema files based on a param block // LLRNGWriter::LLRNGWriter() +: Parser(sReadFuncs, sWriteFuncs, sInspectFuncs) { // register various callbacks for inspecting the contents of a param block registerInspectFunc<bool>(boost::bind(&LLRNGWriter::writeAttribute, this, "boolean", _1, _2, _3, _4)); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 84e438cfb7..7df7c13dc0 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -259,15 +259,15 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) } - for (LLInitParam::ParamIterator<LLScrollListColumn::Params>::const_iterator row_it = p.contents.columns().begin(); - row_it != p.contents.columns().end(); + for (LLInitParam::ParamIterator<LLScrollListColumn::Params>::const_iterator row_it = p.contents.columns.begin(); + row_it != p.contents.columns.end(); ++row_it) { addColumn(*row_it); } - for (LLInitParam::ParamIterator<LLScrollListItem::Params>::const_iterator row_it = p.contents.rows().begin(); - row_it != p.contents.rows().end(); + for (LLInitParam::ParamIterator<LLScrollListItem::Params>::const_iterator row_it = p.contents.rows.begin(); + row_it != p.contents.rows.end(); ++row_it) { addRow(*row_it); @@ -537,23 +537,7 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos, BOOL r setNeedsSort(); break; - case ADD_SORTED: - { - // sort by column 0, in ascending order - std::vector<sort_column_t> single_sort_column; - single_sort_column.push_back(std::make_pair(0, TRUE)); - - mItemList.push_back(item); - std::stable_sort( - mItemList.begin(), - mItemList.end(), - SortScrollListItem(single_sort_column,mSortCallback)); - - // ADD_SORTED just sorts by first column... - // this might not match user sort criteria, so flag list as being in unsorted state - setNeedsSort(); - break; - } + case ADD_DEFAULT: case ADD_BOTTOM: mItemList.push_back(item); setNeedsSort(); @@ -2578,7 +2562,8 @@ BOOL LLScrollListCtrl::canDeselect() const void LLScrollListCtrl::addColumn(const LLSD& column, EAddPosition pos) { LLScrollListColumn::Params p; - LLParamSDParser::instance().readSD(column, p); + LLParamSDParser parser; + parser.readSD(column, p); addColumn(p, pos); } @@ -2764,31 +2749,35 @@ LLScrollListColumn* LLScrollListCtrl::getColumn(const std::string& name) return NULL; } - +LLFastTimer::DeclareTimer FTM_ADD_SCROLLLIST_ELEMENT("Add Scroll List Item"); LLScrollListItem* LLScrollListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata) { + LLFastTimer _(FTM_ADD_SCROLLLIST_ELEMENT); LLScrollListItem::Params item_params; - LLParamSDParser::instance().readSD(element, item_params); + LLParamSDParser parser; + parser.readSD(element, item_params); item_params.userdata = userdata; return addRow(item_params, pos); } LLScrollListItem* LLScrollListCtrl::addRow(const LLScrollListItem::Params& item_p, EAddPosition pos) { + LLFastTimer _(FTM_ADD_SCROLLLIST_ELEMENT); LLScrollListItem *new_item = new LLScrollListItem(item_p); return addRow(new_item, item_p, pos); } LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLScrollListItem::Params& item_p, EAddPosition pos) { + LLFastTimer _(FTM_ADD_SCROLLLIST_ELEMENT); if (!item_p.validateBlock() || !new_item) return NULL; new_item->setNumColumns(mColumns.size()); // Add any columns we don't already have S32 col_index = 0; - for(LLInitParam::ParamIterator<LLScrollListCell::Params>::const_iterator itor = item_p.columns().begin(); - itor != item_p.columns().end(); + for(LLInitParam::ParamIterator<LLScrollListCell::Params>::const_iterator itor = item_p.columns.begin(); + itor != item_p.columns.end(); ++itor) { LLScrollListCell::Params cell_p = *itor; @@ -2839,7 +2828,7 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS col_index++; } - if (item_p.columns().empty()) + if (item_p.columns.empty()) { if (mColumns.empty()) { diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index 54c3060c4a..f97f80ab6c 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -29,49 +29,42 @@ // Project includes #include "llsdparam.h" +#include "llsdutil.h" + +static LLInitParam::Parser::parser_read_func_map_t sReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sInspectFuncs; // // LLParamSDParser // LLParamSDParser::LLParamSDParser() +: Parser(sReadFuncs, sWriteFuncs, sInspectFuncs) { using boost::bind; - registerParserFuncs<S32>(bind(&LLParamSDParser::readTypedValue<S32>, this, _1, &LLSD::asInteger), - bind(&LLParamSDParser::writeTypedValue<S32>, this, _1, _2)); - registerParserFuncs<U32>(bind(&LLParamSDParser::readTypedValue<U32>, this, _1, &LLSD::asInteger), - bind(&LLParamSDParser::writeU32Param, this, _1, _2)); - registerParserFuncs<F32>(bind(&LLParamSDParser::readTypedValue<F32>, this, _1, &LLSD::asReal), - bind(&LLParamSDParser::writeTypedValue<F32>, this, _1, _2)); - registerParserFuncs<F64>(bind(&LLParamSDParser::readTypedValue<F64>, this, _1, &LLSD::asReal), - bind(&LLParamSDParser::writeTypedValue<F64>, this, _1, _2)); - registerParserFuncs<bool>(bind(&LLParamSDParser::readTypedValue<F32>, this, _1, &LLSD::asBoolean), - bind(&LLParamSDParser::writeTypedValue<F32>, this, _1, _2)); - registerParserFuncs<std::string>(bind(&LLParamSDParser::readTypedValue<std::string>, this, _1, &LLSD::asString), - bind(&LLParamSDParser::writeTypedValue<std::string>, this, _1, _2)); - registerParserFuncs<LLUUID>(bind(&LLParamSDParser::readTypedValue<LLUUID>, this, _1, &LLSD::asUUID), - bind(&LLParamSDParser::writeTypedValue<LLUUID>, this, _1, _2)); - registerParserFuncs<LLDate>(bind(&LLParamSDParser::readTypedValue<LLDate>, this, _1, &LLSD::asDate), - bind(&LLParamSDParser::writeTypedValue<LLDate>, this, _1, _2)); - registerParserFuncs<LLURI>(bind(&LLParamSDParser::readTypedValue<LLURI>, this, _1, &LLSD::asURI), - bind(&LLParamSDParser::writeTypedValue<LLURI>, this, _1, _2)); - registerParserFuncs<LLSD>(bind(&LLParamSDParser::readSDParam, this, _1), - bind(&LLParamSDParser::writeTypedValue<LLSD>, this, _1, _2)); -} - -bool LLParamSDParser::readSDParam(void* value_ptr) -{ - if (!mCurReadSD) return false; - *((LLSD*)value_ptr) = *mCurReadSD; - return true; + if (sReadFuncs.empty()) + { + registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>); + registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param); + registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>); + registerParserFuncs<F64>(readF64, &LLParamSDParser::writeTypedValue<F64>); + registerParserFuncs<bool>(readBool, &LLParamSDParser::writeTypedValue<bool>); + registerParserFuncs<std::string>(readString, &LLParamSDParser::writeTypedValue<std::string>); + registerParserFuncs<LLUUID>(readUUID, &LLParamSDParser::writeTypedValue<LLUUID>); + registerParserFuncs<LLDate>(readDate, &LLParamSDParser::writeTypedValue<LLDate>); + registerParserFuncs<LLURI>(readURI, &LLParamSDParser::writeTypedValue<LLURI>); + registerParserFuncs<LLSD>(readSD, &LLParamSDParser::writeTypedValue<LLSD>); + } } // special case handling of U32 due to ambiguous LLSD::assign overload -bool LLParamSDParser::writeU32Param(const void* val_ptr, const parser_t::name_stack_t& name_stack) +bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack) { - if (!mWriteSD) return false; + LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser); + if (!sdparser.mWriteRootSD) return false; - LLSD* sd_to_write = getSDWriteNode(name_stack); + LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack); if (!sd_to_write) return false; sd_to_write->assign((S32)*((const U32*)val_ptr)); @@ -89,7 +82,8 @@ void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block) { - mWriteSD = &sd; + mNameStack.clear(); + mWriteRootSD = &sd; block.serializeBlock(*this); } @@ -139,6 +133,155 @@ void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block LLSD* LLParamSDParser::getSDWriteNode(const parser_t::name_stack_t& name_stack) { //TODO: implement nested LLSD writing - return mWriteSD; + LLSD* sd_to_write = mWriteRootSD; + bool new_traversal = false; + for (name_stack_t::const_iterator it = name_stack.begin(), prev_it = mNameStack.begin(); + it != name_stack.end(); + ++it) + { + bool new_array_entry = false; + if (prev_it == mNameStack.end()) + { + new_traversal = true; + } + else + { + if (!new_traversal // have not diverged yet from previous trace + && prev_it->first == it->first // names match + && prev_it->second != it->second) // versions differ + { + // name stacks match, but version numbers differ in last place. + // create a different entry at this point using an LLSD array + new_array_entry = true; + } + if (prev_it->first != it->first // names differ + || prev_it->second != it->second) // versions differ + { + // at this point we have diverged from our last trace + // so any elements referenced here are new + new_traversal = true; + } + } + + LLSD* child_sd = &(*sd_to_write)[it->first]; + + if (child_sd->isArray()) + { + if (new_traversal) + { + // write to new element at end + sd_to_write = &(*child_sd)[child_sd->size()]; + } + else + { + // write to last of existing elements, or first element if empty + sd_to_write = &(*child_sd)[llmax(0, child_sd->size() - 1)]; + } + } + else + { + if (new_array_entry && !child_sd->isArray()) + { + // copy child contents into first element of an array + LLSD new_array = LLSD::emptyArray(); + new_array.append(*child_sd); + // assign array to slot that previously held the single value + *child_sd = new_array; + // return next element in that array + sd_to_write = &((*child_sd)[1]); + } + else + { + sd_to_write = child_sd; + } + } + if (prev_it != mNameStack.end()) + { + ++prev_it; + } + } + mNameStack = name_stack; + + //llinfos << ll_pretty_print_sd(*mWriteRootSD) << llendl; + return sd_to_write; +} + +bool LLParamSDParser::readS32(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((S32*)val_ptr) = self.mCurReadSD->asInteger(); + return true; +} + +bool LLParamSDParser::readU32(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((U32*)val_ptr) = self.mCurReadSD->asInteger(); + return true; +} + +bool LLParamSDParser::readF32(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((F32*)val_ptr) = self.mCurReadSD->asReal(); + return true; +} + +bool LLParamSDParser::readF64(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((F64*)val_ptr) = self.mCurReadSD->asReal(); + return true; +} + +bool LLParamSDParser::readBool(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((bool*)val_ptr) = self.mCurReadSD->asBoolean(); + return true; +} + +bool LLParamSDParser::readString(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((std::string*)val_ptr) = self.mCurReadSD->asString(); + return true; } +bool LLParamSDParser::readUUID(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((LLUUID*)val_ptr) = self.mCurReadSD->asUUID(); + return true; +} + +bool LLParamSDParser::readDate(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((LLDate*)val_ptr) = self.mCurReadSD->asDate(); + return true; +} + +bool LLParamSDParser::readURI(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((LLURI*)val_ptr) = self.mCurReadSD->asURI(); + return true; +} + +bool LLParamSDParser::readSD(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + + *((LLSD*)val_ptr) = *self.mCurReadSD; + return true; +} diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index e028fc30c2..97e8b58e49 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -31,17 +31,14 @@ #include "llinitparam.h" class LLParamSDParser -: public LLInitParam::Parser, - public LLSingleton<LLParamSDParser> +: public LLInitParam::Parser { LOG_CLASS(LLParamSDParser); typedef LLInitParam::Parser parser_t; -protected: - LLParamSDParser(); - friend class LLSingleton<LLParamSDParser>; public: + LLParamSDParser(); void readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent = false); void writeSD(LLSD& sd, const LLInitParam::BaseBlock& block); @@ -51,20 +48,12 @@ private: void readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block); template<typename T> - bool readTypedValue(void* val_ptr, boost::function<T(const LLSD&)> parser_func) - { - if (!mCurReadSD) return false; - - *((T*)val_ptr) = parser_func(*mCurReadSD); - return true; - } - - template<typename T> - bool writeTypedValue(const void* val_ptr, const parser_t::name_stack_t& name_stack) + static bool writeTypedValue(Parser& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack) { - if (!mWriteSD) return false; + LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser); + if (!sdparser.mWriteRootSD) return false; - LLSD* sd_to_write = getSDWriteNode(name_stack); + LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack); if (!sd_to_write) return false; sd_to_write->assign(*((const T*)val_ptr)); @@ -73,12 +62,23 @@ private: LLSD* getSDWriteNode(const parser_t::name_stack_t& name_stack); - bool readSDParam(void* value_ptr); - bool writeU32Param(const void* value_ptr, const parser_t::name_stack_t& name_stack); + static bool writeU32Param(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack); + + static bool readS32(Parser& parser, void* val_ptr); + static bool readU32(Parser& parser, void* val_ptr); + static bool readF32(Parser& parser, void* val_ptr); + static bool readF64(Parser& parser, void* val_ptr); + static bool readBool(Parser& parser, void* val_ptr); + static bool readString(Parser& parser, void* val_ptr); + static bool readUUID(Parser& parser, void* val_ptr); + static bool readDate(Parser& parser, void* val_ptr); + static bool readURI(Parser& parser, void* val_ptr); + static bool readSD(Parser& parser, void* val_ptr); Parser::name_stack_t mNameStack; const LLSD* mCurReadSD; - LLSD* mWriteSD; + LLSD* mWriteRootSD; + LLSD* mCurWriteSD; }; template<typename T> @@ -88,7 +88,8 @@ class LLSDParamAdapter : public T LLSDParamAdapter() {} LLSDParamAdapter(const LLSD& sd) { - LLParamSDParser::instance().readSD(sd, *this); + LLParamSDParser parser; + parser.readSD(sd, *this); } LLSDParamAdapter(const T& val) diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp index 9decfa0b25..6b4e9cf923 100644 --- a/indra/llui/llspinctrl.cpp +++ b/indra/llui/llspinctrl.cpp @@ -119,7 +119,7 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p) { params.font(p.font); } - params.max_length_bytes(MAX_STRING_LENGTH); + params.max_length.bytes(MAX_STRING_LENGTH); params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2))); if( mPrecision>0 )//should accept float numbers diff --git a/indra/llui/llstyle.cpp b/indra/llui/llstyle.cpp index 5e09cee78b..28a064e6b6 100644 --- a/indra/llui/llstyle.cpp +++ b/indra/llui/llstyle.cpp @@ -40,7 +40,8 @@ LLStyle::Params::Params() selected_color("selected_color", LLColor4::black), font("font", LLFontGL::getFontMonospace()), image("image"), - link_href("href") + link_href("href"), + is_link("is_link") {} @@ -51,6 +52,7 @@ LLStyle::LLStyle(const LLStyle::Params& p) mSelectedColor(p.selected_color), mFont(p.font()), mLink(p.link_href), + mIsLink(p.is_link.isProvided() ? p.is_link : !p.link_href().empty()), mDropShadow(p.drop_shadow), mImagep(p.image()) {} @@ -73,7 +75,7 @@ void LLStyle::setLinkHREF(const std::string& href) BOOL LLStyle::isLink() const { - return mLink.size(); + return mIsLink; } BOOL LLStyle::isVisible() const diff --git a/indra/llui/llstyle.h b/indra/llui/llstyle.h index 66cd639936..322edc343c 100644 --- a/indra/llui/llstyle.h +++ b/indra/llui/llstyle.h @@ -46,6 +46,7 @@ public: Optional<const LLFontGL*> font; Optional<LLUIImage*> image; Optional<std::string> link_href; + Optional<bool> is_link; Params(); }; LLStyle(const Params& p = Params()); @@ -106,6 +107,7 @@ private: std::string mFontName; const LLFontGL* mFont; std::string mLink; + bool mIsLink; LLUIImagePtr mImagep; }; diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 574b24cf13..3f213ed13e 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2009-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 @@ -475,8 +475,8 @@ void LLTextBase::drawCursor() { LLColor4 text_color; const LLFontGL* fontp; - text_color = segmentp->getColor(); - fontp = segmentp->getStyle()->getFont(); + text_color = segmentp->getColor(); + fontp = segmentp->getStyle()->getFont(); fontp->render(text, mCursorPos, cursor_rect, LLColor4(1.f - text_color.mV[VRED], 1.f - text_color.mV[VGREEN], 1.f - text_color.mV[VBLUE], alpha), LLFontGL::LEFT, mVAlign, @@ -1591,7 +1591,10 @@ void LLTextBase::setText(const LLStringExplicit &utf8str, const LLStyle::Params& // appendText modifies mCursorPos... appendText(text, false, input_params); // ...so move cursor to top after appending text - startOfDoc(); + if (!mTrackEnd) + { + startOfDoc(); + } onValueChange(0, getLength()); } @@ -1602,28 +1605,39 @@ std::string LLTextBase::getText() const return getViewModel()->getValue().asString(); } +// IDEVO - icons can be UI image names or UUID sent from +// server with avatar display name +static LLUIImagePtr image_from_icon_name(const std::string& icon_name) +{ + if (LLUUID::validate(icon_name)) + { + return LLUI::getUIImageByID( LLUUID(icon_name) ); + } + else + { + return LLUI::getUIImage(icon_name); + } +} + void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params) { LLStyle::Params style_params(input_params); style_params.fillFrom(getDefaultStyleParams()); S32 part = (S32)LLTextParser::WHOLE; - if(mParseHTML) + if (mParseHTML && !style_params.is_link) // Don't search for URLs inside a link segment (STORM-358). { S32 start=0,end=0; LLUrlMatch match; std::string text = new_text; while ( LLUrlRegistry::instance().findUrl(text, match, - boost::bind(&LLTextBase::replaceUrlLabel, this, _1, _2)) ) + boost::bind(&LLTextBase::replaceUrl, this, _1, _2, _3)) ) { start = match.getStart(); end = match.getEnd()+1; - LLStyle::Params link_params = style_params; - link_params.color = match.getColor(); - link_params.readonly_color = match.getColor(); - link_params.font.style("UNDERLINE"); - link_params.link_href = match.getUrl(); + LLStyle::Params link_params(style_params); + link_params.overwriteFrom(match.getStyle()); // output the text before the Url if (start > 0) @@ -1644,26 +1658,20 @@ void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Para // inserts an avatar icon preceding the Url if appropriate LLTextUtil::processUrlMatch(&match,this); - // output the styled Url (unless we've been asked to suppress hyperlinking) - if (match.isLinkDisabled()) + // output the styled Url + appendAndHighlightTextImpl(match.getLabel(), part, link_params, match.underlineOnHoverOnly()); + + // set the tooltip for the Url label + if (! match.getTooltip().empty()) { - appendAndHighlightText(match.getLabel(), part, style_params); + segment_set_t::iterator it = getSegIterContaining(getLength()-1); + if (it != mSegments.end()) + { + LLTextSegmentPtr segment = *it; + segment->setToolTip(match.getTooltip()); + } } - else - { - appendAndHighlightText(match.getLabel(), part, link_params, match.underlineOnHoverOnly()); - // set the tooltip for the Url label - if (! match.getTooltip().empty()) - { - segment_set_t::iterator it = getSegIterContaining(getLength()-1); - if (it != mSegments.end()) - { - LLTextSegmentPtr segment = *it; - segment->setToolTip(match.getTooltip()); - } - } - } // move on to the rest of the text after the Url if (end < (S32)text.length()) { @@ -1848,8 +1856,9 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlig } -void LLTextBase::replaceUrlLabel(const std::string &url, - const std::string &label) +void LLTextBase::replaceUrl(const std::string &url, + const std::string &label, + const std::string &icon) { // get the full (wide) text for the editor so we can change it LLWString text = getWText(); @@ -1870,7 +1879,7 @@ void LLTextBase::replaceUrlLabel(const std::string &url, seg->setEnd(seg_start + seg_length); // if we find a link with our Url, then replace the label - if (style->isLink() && style->getLinkHREF() == url) + if (style->getLinkHREF() == url) { S32 start = seg->getStart(); S32 end = seg->getEnd(); @@ -1879,6 +1888,21 @@ void LLTextBase::replaceUrlLabel(const std::string &url, modified = true; } + // Icon might be updated when more avatar or group info + // becomes available + if (style->isImage() && style->getLinkHREF() == url) + { + LLUIImagePtr image = image_from_icon_name( icon ); + if (image) + { + LLStyle::Params icon_params; + icon_params.image = image; + LLStyleConstSP new_style(new LLStyle(icon_params)); + seg->setStyle(new_style); + modified = true; + } + } + // work out the character offset for the next segment seg_start = seg->getEnd(); } @@ -1976,8 +2000,8 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1) { // segment wraps to next line, so just set doc pos to the end of the line - // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) - pos = llmin(getLength(), line_iter->mDocIndexEnd); + // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd) + pos = llmin(getLength(), line_iter->mDocIndexEnd); break; } start_x += text_width; @@ -2193,19 +2217,39 @@ bool LLTextBase::scrolledToEnd() return mScroller->isAtBottom(); } - bool LLTextBase::setCursor(S32 row, S32 column) { - if (0 <= row && row < (S32)mLineInfoList.size()) + if (row < 0 || column < 0) return false; + + S32 n_lines = mLineInfoList.size(); + for (S32 line = row; line < n_lines; ++line) { - S32 doc_pos = mLineInfoList[row].mDocIndexStart; - column = llclamp(column, 0, mLineInfoList[row].mDocIndexEnd - mLineInfoList[row].mDocIndexStart - 1); - doc_pos += column; - updateCursorXPos(); + const line_info& li = mLineInfoList[line]; + + if (li.mLineNum < row) + { + continue; + } + else if (li.mLineNum > row) + { + break; // invalid column specified + } + // Found the given row. + S32 line_length = li.mDocIndexEnd - li.mDocIndexStart;; + if (column >= line_length) + { + column -= line_length; + continue; + } + + // Found the given column. + updateCursorXPos(); + S32 doc_pos = li.mDocIndexStart + column; return setCursorPos(doc_pos); } - return false; + + return false; // invalid row or column specified } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index e5dfecad54..aafcf8ceb0 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -235,6 +235,7 @@ class LLTextBase public: friend class LLTextSegment; friend class LLNormalTextSegment; + friend class LLUICtrlFactory; struct LineSpacingParams : public LLInitParam::Choice<LineSpacingParams> { @@ -492,7 +493,11 @@ protected: // misc void updateRects(); void needsScroll() { mScrollNeeded = TRUE; } - void replaceUrlLabel(const std::string &url, const std::string &label); + + struct URLLabelCallback; + // Replace a URL with a new icon and label, for example, when + // avatar names are looked up. + void replaceUrl(const std::string &url, const std::string &label, const std::string& icon); void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params()); void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params, bool underline_on_hover_only = false); diff --git a/indra/llui/lltoggleablemenu.cpp b/indra/llui/lltoggleablemenu.cpp index 0eb2dc1387..d29260750f 100644 --- a/indra/llui/lltoggleablemenu.cpp +++ b/indra/llui/lltoggleablemenu.cpp @@ -35,10 +35,22 @@ static LLDefaultChildRegistry::Register<LLToggleableMenu> r("toggleable_menu"); LLToggleableMenu::LLToggleableMenu(const LLToggleableMenu::Params& p) : LLMenuGL(p), mButtonRect(), + mVisibilityChangeSignal(NULL), mClosedByButtonClick(false) { } +LLToggleableMenu::~LLToggleableMenu() +{ + delete mVisibilityChangeSignal; +} + +boost::signals2::connection LLToggleableMenu::setVisibilityChangeCallback(const commit_signal_t::slot_type& cb) +{ + if (!mVisibilityChangeSignal) mVisibilityChangeSignal = new commit_signal_t(); + return mVisibilityChangeSignal->connect(cb); +} + // virtual void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn) { @@ -49,6 +61,12 @@ void LLToggleableMenu::handleVisibilityChange (BOOL curVisibilityIn) { mClosedByButtonClick = true; } + + if (mVisibilityChangeSignal) + { + (*mVisibilityChangeSignal)(this, + LLSD().with("visibility", curVisibilityIn).with("closed_by_button_click", mClosedByButtonClick)); + } } void LLToggleableMenu::setButtonRect(const LLRect& rect, LLView* current_view) diff --git a/indra/llui/lltoggleablemenu.h b/indra/llui/lltoggleablemenu.h index f036cdfffb..2094bd776f 100644 --- a/indra/llui/lltoggleablemenu.h +++ b/indra/llui/lltoggleablemenu.h @@ -41,6 +41,10 @@ protected: LLToggleableMenu(const Params&); friend class LLUICtrlFactory; public: + ~LLToggleableMenu(); + + boost::signals2::connection setVisibilityChangeCallback( const commit_signal_t::slot_type& cb ); + virtual void handleVisibilityChange (BOOL curVisibilityIn); const LLRect& getButtonRect() const { return mButtonRect; } @@ -57,6 +61,7 @@ public: protected: bool mClosedByButtonClick; LLRect mButtonRect; + commit_signal_t* mVisibilityChangeSignal; }; #endif // LL_LLTOGGLEABLEMENU_H diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index b02d3122fe..6390039794 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -78,9 +78,9 @@ BOOL LLToolTipView::handleHover(S32 x, S32 y, MASK mask) LLToolTipMgr& tooltip_mgr = LLToolTipMgr::instance(); - if (x != last_x && y != last_y) + if (x != last_x && y != last_y && !tooltip_mgr.getMouseNearRect().pointInRect(x, y)) { - // allow new tooltips because mouse moved + // allow new tooltips because mouse moved outside of mouse near rect tooltip_mgr.unblockToolTips(); } @@ -276,8 +276,8 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p) if (p.styled_message.isProvided()) { - for (LLInitParam::ParamIterator<LLToolTip::StyledText>::const_iterator text_it = p.styled_message().begin(); - text_it != p.styled_message().end(); + for (LLInitParam::ParamIterator<LLToolTip::StyledText>::const_iterator text_it = p.styled_message.begin(); + text_it != p.styled_message.end(); ++text_it) { mTextBox->appendText(text_it->text(), false, text_it->style); @@ -580,6 +580,7 @@ void LLToolTipMgr::updateToolTipVisibility() if (mToolTip->getVisibleTime() > tooltip_timeout) { hideToolTips(); + unblockToolTips(); } } } diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index d33d8e3178..ff9af21e54 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -1796,7 +1796,8 @@ void LLUI::setupPaths() LLXMLNodePtr root; BOOL success = LLXMLNode::parseFile(filename, root, NULL); Paths paths; - LLXUIParser::instance().readXUI(root, paths, filename); + LLXUIParser parser; + parser.readXUI(root, paths, filename); sXUIPaths.clear(); @@ -1805,14 +1806,14 @@ void LLUI::setupPaths() LLStringUtil::format_map_t path_args; path_args["[LANGUAGE]"] = LLUI::getLanguage(); - for (LLInitParam::ParamIterator<Directory>::const_iterator it = paths.directories().begin(), - end_it = paths.directories().end(); + for (LLInitParam::ParamIterator<Directory>::const_iterator it = paths.directories.begin(), + end_it = paths.directories.end(); it != end_it; ++it) { std::string path_val_ui; - for (LLInitParam::ParamIterator<SubDir>::const_iterator subdir_it = it->subdirs().begin(), - subdir_end_it = it->subdirs().end(); + for (LLInitParam::ParamIterator<SubDir>::const_iterator subdir_it = it->subdirs.begin(), + subdir_end_it = it->subdirs.end(); subdir_it != subdir_end_it;) { path_val_ui += subdir_it->value(); diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index 9891e38f7b..0641f6d175 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -56,8 +56,8 @@ void LLUIColorTable::insertFromParams(const Params& p, string_color_map_t& table typedef std::map<std::string, std::string> string_string_map_t; string_string_map_t unresolved_refs; - for(LLInitParam::ParamIterator<ColorEntryParams>::const_iterator it = p.color_entries().begin(); - it != p.color_entries().end(); + for(LLInitParam::ParamIterator<ColorEntryParams>::const_iterator it = p.color_entries.begin(); + it != p.color_entries.end(); ++it) { ColorEntryParams color_entry = *it; @@ -237,7 +237,8 @@ void LLUIColorTable::saveUserSettings() const } LLXMLNodePtr output_node = new LLXMLNode("colors", false); - LLXUIParser::instance().writeXUI(output_node, params); + LLXUIParser parser; + parser.writeXUI(output_node, params); if(!output_node->isNull()) { @@ -303,7 +304,8 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename, string_color_ } Params params; - LLXUIParser::instance().readXUI(root, params, filename); + LLXUIParser parser; + parser.readXUI(root, params, filename); if(params.validateBlock()) { diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp index 15a382660e..5de96f9d48 100644 --- a/indra/llui/lluictrlfactory.cpp +++ b/indra/llui/lluictrlfactory.cpp @@ -42,7 +42,7 @@ #include "llquaternion.h" // this library includes -#include "llfloater.h" +#include "llpanel.h" LLFastTimer::DeclareTimer FTM_WIDGET_CONSTRUCTION("Widget Construction"); LLFastTimer::DeclareTimer FTM_INIT_FROM_PARAMS("Widget InitFromParams"); @@ -93,10 +93,12 @@ void LLUICtrlFactory::loadWidgetTemplate(const std::string& widget_tag, LLInitPa std::string filename = std::string("widgets") + gDirUtilp->getDirDelimiter() + widget_tag + ".xml"; LLXMLNodePtr root_node; - if (LLUICtrlFactory::getLayeredXMLNode(filename, root_node)) + std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), filename); + if (!full_filename.empty()) { - LLUICtrlFactory::instance().pushFileName(filename); - LLXUIParser::instance().readXUI(root_node, block, filename); + LLUICtrlFactory::instance().pushFileName(full_filename); + LLSimpleXUIParser parser; + parser.readXUI(full_filename, block); LLUICtrlFactory::instance().popFileName(); } } @@ -171,70 +173,6 @@ bool LLUICtrlFactory::getLocalizedXMLNode(const std::string &xui_filename, LLXML } } -static LLFastTimer::DeclareTimer FTM_BUILD_FLOATERS("Build Floaters"); - -//----------------------------------------------------------------------------- -// buildFloater() -//----------------------------------------------------------------------------- -bool LLUICtrlFactory::buildFloater(LLFloater* floaterp, const std::string& filename, LLXMLNodePtr output_node) -{ - LLFastTimer timer(FTM_BUILD_FLOATERS); - LLXMLNodePtr root; - - //if exporting, only load the language being exported, - //instead of layering localized version on top of english - if (output_node) - { - if (!LLUICtrlFactory::getLocalizedXMLNode(filename, root)) - { - llwarns << "Couldn't parse floater from: " << LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; - return false; - } - } - else if (!LLUICtrlFactory::getLayeredXMLNode(filename, root)) - { - llwarns << "Couldn't parse floater from: " << LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; - return false; - } - - // root must be called floater - if( !(root->hasName("floater") || root->hasName("multi_floater")) ) - { - llwarns << "Root node should be named floater in: " << filename << llendl; - return false; - } - - bool res = true; - - lldebugs << "Building floater " << filename << llendl; - pushFileName(filename); - { - if (!floaterp->getFactoryMap().empty()) - { - mFactoryStack.push_front(&floaterp->getFactoryMap()); - } - - // for local registry callbacks; define in constructor, referenced in XUI or postBuild - floaterp->getCommitCallbackRegistrar().pushScope(); - floaterp->getEnableCallbackRegistrar().pushScope(); - - res = floaterp->initFloaterXML(root, floaterp->getParent(), filename, output_node); - - floaterp->setXMLFilename(filename); - - floaterp->getCommitCallbackRegistrar().popScope(); - floaterp->getEnableCallbackRegistrar().popScope(); - - if (!floaterp->getFactoryMap().empty()) - { - mFactoryStack.pop_front(); - } - } - popFileName(); - - return res; -} - //----------------------------------------------------------------------------- // saveToXML() //----------------------------------------------------------------------------- @@ -243,69 +181,6 @@ S32 LLUICtrlFactory::saveToXML(LLView* viewp, const std::string& filename) return 0; } -static LLFastTimer::DeclareTimer FTM_BUILD_PANELS("Build Panels"); - -//----------------------------------------------------------------------------- -// buildPanel() -//----------------------------------------------------------------------------- -BOOL LLUICtrlFactory::buildPanel(LLPanel* panelp, const std::string& filename, LLXMLNodePtr output_node) -{ - LLFastTimer timer(FTM_BUILD_PANELS); - BOOL didPost = FALSE; - LLXMLNodePtr root; - - //if exporting, only load the language being exported, - //instead of layering localized version on top of english - if (output_node) - { - if (!LLUICtrlFactory::getLocalizedXMLNode(filename, root)) - { - llwarns << "Couldn't parse panel from: " << LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; - return didPost; - } - } - else if (!LLUICtrlFactory::getLayeredXMLNode(filename, root)) - { - llwarns << "Couldn't parse panel from: " << LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + filename << llendl; - return didPost; - } - - // root must be called panel - if( !root->hasName("panel" ) ) - { - llwarns << "Root node should be named panel in : " << filename << llendl; - return didPost; - } - - lldebugs << "Building panel " << filename << llendl; - - pushFileName(filename); - { - if (!panelp->getFactoryMap().empty()) - { - mFactoryStack.push_front(&panelp->getFactoryMap()); - } - - // for local registry callbacks; define in constructor, referenced in XUI or postBuild - panelp->getCommitCallbackRegistrar().pushScope(); - panelp->getEnableCallbackRegistrar().pushScope(); - - didPost = panelp->initPanelXML(root, NULL, output_node); - - panelp->getCommitCallbackRegistrar().popScope(); - panelp->getEnableCallbackRegistrar().popScope(); - - panelp->setXMLFilename(filename); - - if (!panelp->getFactoryMap().empty()) - { - mFactoryStack.pop_front(); - } - } - popFileName(); - return didPost; -} - //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- @@ -337,29 +212,6 @@ LLView *LLUICtrlFactory::createFromXML(LLXMLNodePtr node, LLView* parent, const return view; } -//----------------------------------------------------------------------------- -// createFactoryPanel() -//----------------------------------------------------------------------------- -LLPanel* LLUICtrlFactory::createFactoryPanel(const std::string& name) -{ - std::deque<const LLCallbackMap::map_t*>::iterator itor; - for (itor = mFactoryStack.begin(); itor != mFactoryStack.end(); ++itor) - { - const LLCallbackMap::map_t* factory_map = *itor; - - // Look up this panel's name in the map. - LLCallbackMap::map_const_iter_t iter = factory_map->find( name ); - if (iter != factory_map->end()) - { - // Use the factory to create the panel, instead of using a default LLPanel. - LLPanel *ret = (LLPanel*) iter->second.mCallback( iter->second.mData ); - return ret; - } - } - LLPanel::Params panel_p; - return create<LLPanel>(panel_p); -} - std::string LLUICtrlFactory::getCurFileName() { return mFileNames.empty() ? "" : gDirUtilp->getWorkingDir() + gDirUtilp->getDirDelimiter() + mFileNames.back(); @@ -376,36 +228,6 @@ void LLUICtrlFactory::popFileName() mFileNames.pop_back(); } - -//----------------------------------------------------------------------------- - -//static -BOOL LLUICtrlFactory::getAttributeColor(LLXMLNodePtr node, const std::string& name, LLColor4& color) -{ - std::string colorstring; - BOOL res = node->getAttributeString(name.c_str(), colorstring); - if (res) - { - if (LLUIColorTable::instance().colorExists(colorstring)) - { - color.setVec(LLUIColorTable::instance().getColor(colorstring)); - } - else - { - res = FALSE; - } - } - if (!res) - { - res = LLColor4::parseColor(colorstring, &color); - } - if (!res) - { - res = node->getAttributeColor(name.c_str(), color); - } - return res; -} - //static void LLUICtrlFactory::setCtrlParent(LLView* view, LLView* parent, S32 tab_group) { @@ -421,28 +243,22 @@ std::string LLUICtrlFactory::findSkinnedFilename(const std::string& filename) return gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), filename); } -void LLUICtrlFactory::pushFactoryFunctions(const LLCallbackMap::map_t* map) -{ - mFactoryStack.push_back(map); -} - -void LLUICtrlFactory::popFactoryFunctions() -{ - if (!mFactoryStack.empty()) - { - mFactoryStack.pop_back(); - } -} - //static void LLUICtrlFactory::copyName(LLXMLNodePtr src, LLXMLNodePtr dest) { dest->setName(src->getName()->mString); } +template<typename T> +const LLInitParam::BaseBlock& get_empty_param_block() +{ + static typename T::Params params; + return params; +} + // adds a widget and its param block to various registries //static -void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const std::type_info* param_block_type, dummy_widget_creator_func_t creator_func, const std::string& tag) +void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const std::type_info* param_block_type, const std::string& tag) { // associate parameter block type with template .xml file std::string* existing_tag = LLWidgetNameRegistry::instance().getValue(param_block_type); @@ -462,17 +278,9 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st } } LLWidgetNameRegistry::instance().defaultRegistrar().add(param_block_type, tag); - // associate widget type with factory function - LLDefaultWidgetRegistry::instance().defaultRegistrar().add(widget_type, creator_func); //FIXME: comment this in when working on schema generation //LLWidgetTypeRegistry::instance().defaultRegistrar().add(tag, widget_type); - //LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &getEmptyParamBlock<T>); -} - -//static -dummy_widget_creator_func_t* LLUICtrlFactory::getDefaultWidgetFunc(const std::type_info* widget_type) -{ - return LLDefaultWidgetRegistry::instance().getValue(widget_type); + //LLDefaultParamBlockRegistry::instance().defaultRegistrar().add(widget_type, &get_empty_param_block<T>); } //static diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h index 58ec5d8387..499b97f52d 100644 --- a/indra/llui/lluictrlfactory.h +++ b/indra/llui/lluictrlfactory.h @@ -27,24 +27,13 @@ #ifndef LLUICTRLFACTORY_H #define LLUICTRLFACTORY_H -#include "llcallbackmap.h" +#include "llfasttimer.h" #include "llinitparam.h" #include "llregistry.h" -#include "v4color.h" -#include "llfasttimer.h" - #include "llxuiparser.h" -#include <boost/function.hpp> -#include <iosfwd> -#include <stack> -#include <set> - -class LLPanel; -class LLFloater; class LLView; - // sort functor for typeid maps struct LLCompareTypeID { @@ -85,12 +74,6 @@ class LLWidgetNameRegistry : public LLRegistrySingleton<const std::type_info*, std::string, LLWidgetNameRegistry , LLCompareTypeID> {}; -// lookup factory functions for default widget instances by widget type -typedef LLView* (*dummy_widget_creator_func_t)(const std::string&); -class LLDefaultWidgetRegistry -: public LLRegistrySingleton<const std::type_info*, dummy_widget_creator_func_t, LLDefaultWidgetRegistry, LLCompareTypeID> -{}; - // lookup function for generating empty param block by widget type // this is used for schema generation //typedef const LLInitParam::BaseBlock& (*empty_param_block_func_t)(); @@ -157,58 +140,21 @@ public: return ParamDefaults<typename T::Params, 0>::instance().get(); } - bool buildFloater(LLFloater* floaterp, const std::string &filename, LLXMLNodePtr output_node); - BOOL buildPanel(LLPanel* panelp, const std::string &filename, LLXMLNodePtr output_node = NULL); - // Does what you want for LLFloaters and LLPanels // Returns 0 on success S32 saveToXML(LLView* viewp, const std::string& filename); + // filename tracking for debugging info std::string getCurFileName(); void pushFileName(const std::string& name); void popFileName(); - static BOOL getAttributeColor(LLXMLNodePtr node, const std::string& name, LLColor4& color); - - LLPanel* createFactoryPanel(const std::string& name); - - void pushFactoryFunctions(const LLCallbackMap::map_t* map); - void popFactoryFunctions(); - - template<typename T> - static T* createWidget(const typename T::Params& params, LLView* parent = NULL) - { - T* widget = NULL; - - if (!params.validateBlock()) - { - llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl; - //return NULL; - } - - { - LLFastTimer timer(FTM_WIDGET_CONSTRUCTION); - widget = new T(params); - } - { - LLFastTimer timer(FTM_INIT_FROM_PARAMS); - widget->initFromParams(params); - } - - if (parent) - { - S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : S32_MAX; - setCtrlParent(widget, parent, tab_group); - } - return widget; - } - template<typename T> static T* create(typename T::Params& params, LLView* parent = NULL) { params.fillFrom(ParamDefaults<typename T::Params, 0>::instance().get()); - T* widget = createWidget<T>(params, parent); + T* widget = createWidgetImpl<T>(params, parent); if (widget) { widget->postBuild(); @@ -266,21 +212,54 @@ fail: template<class T> static T* getDefaultWidget(const std::string& name) { - dummy_widget_creator_func_t* dummy_func = getDefaultWidgetFunc(&typeid(T)); - return dummy_func ? dynamic_cast<T*>((*dummy_func)(name)) : NULL; + typename T::Params widget_params; + widget_params.name = name; + return create<T>(widget_params); } - template <class T> - static LLView* createDefaultWidget(const std::string& name) - { - typename T::Params params; - params.name(name); - - return create<T>(params); - } + static void createChildren(LLView* viewp, LLXMLNodePtr node, const widget_registry_t&, LLXMLNodePtr output_node = NULL); + + static bool getLayeredXMLNode(const std::string &filename, LLXMLNodePtr& root); + static bool getLocalizedXMLNode(const std::string &xui_filename, LLXMLNodePtr& root); + +private: + //NOTE: both friend declarations are necessary to keep both gcc and msvc happy + template <typename T> friend class LLChildRegistry; + template <typename T> template <typename U> friend class LLChildRegistry<T>::Register; static void copyName(LLXMLNodePtr src, LLXMLNodePtr dest); + // helper function for adding widget type info to various registries + static void registerWidget(const std::type_info* widget_type, const std::type_info* param_block_type, const std::string& tag); + + static void loadWidgetTemplate(const std::string& widget_tag, LLInitParam::BaseBlock& block); + + template<typename T> + static T* createWidgetImpl(const typename T::Params& params, LLView* parent = NULL) + { + T* widget = NULL; + + if (!params.validateBlock()) + { + llwarns << getInstance()->getCurFileName() << ": Invalid parameter block for " << typeid(T).name() << llendl; + //return NULL; + } + + { LLFastTimer _(FTM_WIDGET_CONSTRUCTION); + widget = new T(params); + } + { LLFastTimer _(FTM_INIT_FROM_PARAMS); + widget->initFromParams(params); + } + + if (parent) + { + S32 tab_group = params.tab_group.isProvided() ? params.tab_group() : S32_MAX; + setCtrlParent(widget, parent, tab_group); + } + return widget; + } + template<typename T> static T* defaultBuilder(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr output_node) { @@ -288,7 +267,8 @@ fail: typename T::Params params(getDefaultParams<T>()); - LLXUIParser::instance().readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); + LLXUIParser parser; + parser.readXUI(node, params, LLUICtrlFactory::getInstance()->getCurFileName()); if (output_node) { @@ -298,14 +278,13 @@ fail: // Export only the differences between this any default params typename T::Params default_params(getDefaultParams<T>()); copyName(node, output_node); - LLXUIParser::instance().writeXUI( - output_node, output_params, &default_params); + parser.writeXUI(output_node, output_params, &default_params); } // Apply layout transformations, usually munging rect params.from_xui = true; T::applyXUILayout(params, parent); - T* widget = createWidget<T>(params, parent); + T* widget = createWidgetImpl<T>(params, parent); typedef typename T::child_registry_t registry_t; @@ -320,20 +299,6 @@ fail: return widget; } - static void createChildren(LLView* viewp, LLXMLNodePtr node, const widget_registry_t&, LLXMLNodePtr output_node = NULL); - - static bool getLayeredXMLNode(const std::string &filename, LLXMLNodePtr& root); - - static bool getLocalizedXMLNode(const std::string &xui_filename, LLXMLNodePtr& root); - - static void loadWidgetTemplate(const std::string& widget_tag, LLInitParam::BaseBlock& block); - - // helper function for adding widget type info to various registries - static void registerWidget(const std::type_info* widget_type, const std::type_info* param_block_type, dummy_widget_creator_func_t creator_func, const std::string& tag); - -private: - // return default widget instance factory func for a given type - static dummy_widget_creator_func_t* getDefaultWidgetFunc(const std::type_info* widget_type); static const std::string* getWidgetTag(const std::type_info* widget_type); @@ -343,20 +308,10 @@ private: // Avoid directly using LLUI and LLDir in the template code static std::string findSkinnedFilename(const std::string& filename); - typedef std::deque<const LLCallbackMap::map_t*> factory_stack_t; - factory_stack_t mFactoryStack; - - LLPanel* mDummyPanel; + class LLPanel* mDummyPanel; std::vector<std::string> mFileNames; }; -template<typename T> -const LLInitParam::BaseBlock& getEmptyParamBlock() -{ - static typename T::Params params; - return params; -} - // this is here to make gcc happy with reference to LLUICtrlFactory template<typename DERIVED> template<typename T> @@ -364,7 +319,7 @@ LLChildRegistry<DERIVED>::Register<T>::Register(const char* tag, LLWidgetCreator : LLChildRegistry<DERIVED>::StaticRegistrar(tag, func.empty() ? (LLWidgetCreatorFunc)&LLUICtrlFactory::defaultBuilder<T> : func) { // add this widget to various registries - LLUICtrlFactory::instance().registerWidget(&typeid(T), &typeid(typename T::Params), &LLUICtrlFactory::createDefaultWidget<T>, tag); + LLUICtrlFactory::instance().registerWidget(&typeid(T), &typeid(typename T::Params), tag); // since registry_t depends on T, do this in line here // TODO: uncomment this for schema generation @@ -372,58 +327,4 @@ LLChildRegistry<DERIVED>::Register<T>::Register(const char* tag, LLWidgetCreator //LLChildRegistryRegistry::instance().defaultRegistrar().add(&typeid(T), registry_t::instance()); } - -typedef boost::function<LLPanel* (void)> LLPanelClassCreatorFunc; - -// local static instance for registering a particular panel class - -class LLRegisterPanelClass -: public LLSingleton< LLRegisterPanelClass > -{ -public: - // reigister with either the provided builder, or the generic templated builder - void addPanelClass(const std::string& tag,LLPanelClassCreatorFunc func) - { - mPanelClassesNames[tag] = func; - } - - LLPanel* createPanelClass(const std::string& tag) - { - param_name_map_t::iterator iT = mPanelClassesNames.find(tag); - if(iT == mPanelClassesNames.end()) - return 0; - return iT->second(); - } - template<typename T> - static T* defaultPanelClassBuilder() - { - T* pT = new T(); - return pT; - } - -private: - typedef std::map< std::string, LLPanelClassCreatorFunc> param_name_map_t; - - param_name_map_t mPanelClassesNames; -}; - - -// local static instance for registering a particular panel class -template<typename T> -class LLRegisterPanelClassWrapper -: public LLRegisterPanelClass -{ -public: - // reigister with either the provided builder, or the generic templated builder - LLRegisterPanelClassWrapper(const std::string& tag); -}; - - -template<typename T> -LLRegisterPanelClassWrapper<T>::LLRegisterPanelClassWrapper(const std::string& tag) -{ - LLRegisterPanelClass::instance().addPanelClass(tag,&LLRegisterPanelClass::defaultPanelClassBuilder<T>); -} - - #endif //LLUICTRLFACTORY_H diff --git a/indra/llui/lluistring.cpp b/indra/llui/lluistring.cpp index 3e9b956ee6..ac69d3bf85 100644 --- a/indra/llui/lluistring.cpp +++ b/indra/llui/lluistring.cpp @@ -34,7 +34,7 @@ LLFastTimer::DeclareTimer FTM_UI_STRING("UI String"); LLUIString::LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args) : mOrig(instring), - mArgs(args) + mArgs(new LLStringUtil::format_map_t(args)) { dirty(); } @@ -48,7 +48,7 @@ void LLUIString::assign(const std::string& s) void LLUIString::setArgList(const LLStringUtil::format_map_t& args) { - mArgs = args; + getArgs() = args; dirty(); } @@ -68,7 +68,7 @@ void LLUIString::setArgs(const LLSD& sd) void LLUIString::setArg(const std::string& key, const std::string& replacement) { - mArgs[key] = replacement; + getArgs()[key] = replacement; dirty(); } @@ -129,14 +129,14 @@ void LLUIString::updateResult() const mResult = mOrig; // get the defailt args + local args - if (mArgs.empty()) + if (!mArgs || mArgs->empty()) { LLStringUtil::format(mResult, LLTrans::getDefaultArgs()); } else { LLStringUtil::format_map_t combined_args = LLTrans::getDefaultArgs(); - combined_args.insert(mArgs.begin(), mArgs.end()); + combined_args.insert(mArgs->begin(), mArgs->end()); LLStringUtil::format(mResult, combined_args); } } @@ -147,3 +147,12 @@ void LLUIString::updateWResult() const mWResult = utf8str_to_wstring(getUpdatedResult()); } + +LLStringUtil::format_map_t& LLUIString::getArgs() +{ + if (!mArgs) + { + mArgs = new LLStringUtil::format_map_t; + } + return *mArgs; +} diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index fc7ac37d99..4faa0e070e 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -58,9 +58,11 @@ class LLUIString public: // These methods all perform appropriate argument substitution // and modify mOrig where appropriate - LLUIString() : mNeedsResult(false), mNeedsWResult(false) {} + LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {} LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args); - LLUIString(const std::string& instring) { assign(instring); } + LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); } + + ~LLUIString() { delete mArgs; } void assign(const std::string& instring); LLUIString& operator=(const std::string& s) { assign(s); return *this; } @@ -80,15 +82,15 @@ public: S32 length() const { return getUpdatedWResult().size(); } void clear(); - void clearArgs() { mArgs.clear(); } - + void clearArgs() { if (mArgs) mArgs->clear(); } + // These utility functions are included for text editing. // They do not affect mOrig and do not perform argument substitution void truncate(S32 maxchars); void erase(S32 charidx, S32 len); void insert(S32 charidx, const LLWString& wchars); void replace(S32 charidx, llwchar wc); - + private: // something changed, requiring reformatting of strings void dirty(); @@ -99,11 +101,12 @@ private: // do actual work of updating strings (non-inlined) void updateResult() const; void updateWResult() const; - + LLStringUtil::format_map_t& getArgs(); + std::string mOrig; mutable std::string mResult; mutable LLWString mWResult; // for displaying - LLStringUtil::format_map_t mArgs; + LLStringUtil::format_map_t* mArgs; // controls lazy evaluation mutable bool mNeedsResult; diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 5680ab8bd4..6cc72bad82 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -31,18 +31,19 @@ #include "llurlmatch.h" #include "llurlregistry.h" +#include "llavatarnamecache.h" #include "llcachename.h" #include "lltrans.h" #include "lluicolortable.h" #define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))" +// Utility functions +std::string localize_slapp_label(const std::string& url, const std::string& full_name); -LLUrlEntryBase::LLUrlEntryBase() : - mColor(LLUIColorTable::instance().getColor("HTMLLinkColor")), - mDisabledLink(false) -{ -} + +LLUrlEntryBase::LLUrlEntryBase() +{} LLUrlEntryBase::~LLUrlEntryBase() { @@ -53,6 +54,22 @@ std::string LLUrlEntryBase::getUrl(const std::string &string) const return escapeUrl(string); } +//virtual +std::string LLUrlEntryBase::getIcon(const std::string &url) +{ + return mIcon; +} + +LLStyle::Params LLUrlEntryBase::getStyle() const +{ + LLStyle::Params style_params; + style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); + style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); + style_params.font.style = "UNDERLINE"; + return style_params; +} + + std::string LLUrlEntryBase::getIDStringFromUrl(const std::string &url) const { // return the id from a SLURL in the format /app/{cmd}/{id}/about @@ -130,16 +147,20 @@ void LLUrlEntryBase::addObserver(const std::string &id, mObservers.insert(std::pair<std::string, LLUrlEntryObserver>(id, observer)); } } - -void LLUrlEntryBase::callObservers(const std::string &id, const std::string &label) + +// *NOTE: See also LLUrlEntryAgent::callObservers() +void LLUrlEntryBase::callObservers(const std::string &id, + const std::string &label, + const std::string &icon) { // notify all callbacks waiting on the given uuid - std::multimap<std::string, LLUrlEntryObserver>::iterator it; - for (it = mObservers.find(id); it != mObservers.end();) + typedef std::multimap<std::string, LLUrlEntryObserver>::iterator observer_it; + std::pair<observer_it, observer_it> matching_range = mObservers.equal_range(id); + for (observer_it it = matching_range.first; it != matching_range.second;) { // call the callback - give it the new label LLUrlEntryObserver &observer = it->second; - (*observer.signal)(it->second.url, label); + (*observer.signal)(it->second.url, label, icon); // then remove the signal - we only need to call it once delete observer.signal; mObservers.erase(it++); @@ -188,7 +209,13 @@ LLUrlEntryHTTPLabel::LLUrlEntryHTTPLabel() std::string LLUrlEntryHTTPLabel::getLabel(const std::string &url, const LLUrlLabelCallback &cb) { - return getLabelFromWikiLink(url); + std::string label = getLabelFromWikiLink(url); + return (!LLUrlRegistry::instance().hasUrl(label)) ? label : getUrl(url); +} + +std::string LLUrlEntryHTTPLabel::getTooltip(const std::string &string) const +{ + return getUrl(string); } std::string LLUrlEntryHTTPLabel::getUrl(const std::string &string) const @@ -308,16 +335,35 @@ LLUrlEntryAgent::LLUrlEntryAgent() boost::regex::perl|boost::regex::icase); mMenuName = "menu_url_agent.xml"; mIcon = "Generic_Person"; - mColor = LLUIColorTable::instance().getColor("AgentLinkColor"); } -void LLUrlEntryAgent::onAgentNameReceived(const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group) +// virtual +void LLUrlEntryAgent::callObservers(const std::string &id, + const std::string &label, + const std::string &icon) +{ + // notify all callbacks waiting on the given uuid + typedef std::multimap<std::string, LLUrlEntryObserver>::iterator observer_it; + std::pair<observer_it, observer_it> matching_range = mObservers.equal_range(id); + for (observer_it it = matching_range.first; it != matching_range.second;) + { + // call the callback - give it the new label + LLUrlEntryObserver &observer = it->second; + std::string final_label = localize_slapp_label(observer.url, label); + (*observer.signal)(observer.url, final_label, icon); + // then remove the signal - we only need to call it once + delete observer.signal; + mObservers.erase(it++); + } +} + +void LLUrlEntryAgent::onAvatarNameCache(const LLUUID& id, + const LLAvatarName& av_name) { + std::string label = av_name.getCompleteName(); + // received the agent name from the server - tell our observers - callObservers(id.asString(), first + " " + last); + callObservers(id.asString(), label, mIcon); } LLUUID LLUrlEntryAgent::getID(const std::string &string) const @@ -330,6 +376,10 @@ std::string LLUrlEntryAgent::getTooltip(const std::string &string) const // return a tooltip corresponding to the URL type instead of the generic one std::string url = getUrl(string); + if (LLStringUtil::endsWith(url, "/inspect")) + { + return LLTrans::getString("TooltipAgentInspect"); + } if (LLStringUtil::endsWith(url, "/mute")) { return LLTrans::getString("TooltipAgentMute"); @@ -379,50 +429,182 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa } LLUUID agent_id(agent_id_string); - std::string full_name; if (agent_id.isNull()) { return LLTrans::getString("AvatarNameNobody"); } - else if (gCacheName->getFullName(agent_id, full_name)) - { - // customize label string based on agent SLapp suffix - if (LLStringUtil::endsWith(url, "/mute")) - { - return LLTrans::getString("SLappAgentMute") + " " + full_name; - } - if (LLStringUtil::endsWith(url, "/unmute")) - { - return LLTrans::getString("SLappAgentUnmute") + " " + full_name; - } - if (LLStringUtil::endsWith(url, "/im")) - { - return LLTrans::getString("SLappAgentIM") + " " + full_name; - } - if (LLStringUtil::endsWith(url, "/pay")) - { - return LLTrans::getString("SLappAgentPay") + " " + full_name; - } - if (LLStringUtil::endsWith(url, "/offerteleport")) - { - return LLTrans::getString("SLappAgentOfferTeleport") + " " + full_name; - } - if (LLStringUtil::endsWith(url, "/requestfriend")) - { - return LLTrans::getString("SLappAgentRequestFriend") + " " + full_name; - } - return full_name; + + LLAvatarName av_name; + if (LLAvatarNameCache::get(agent_id, &av_name)) + { + std::string label = av_name.getCompleteName(); + + // handle suffixes like /mute or /offerteleport + label = localize_slapp_label(url, label); + return label; } else { - gCacheName->get(agent_id, FALSE, - boost::bind(&LLUrlEntryAgent::onAgentNameReceived, - this, _1, _2, _3, _4)); + LLAvatarNameCache::get(agent_id, + boost::bind(&LLUrlEntryAgent::onAvatarNameCache, + this, _1, _2)); addObserver(agent_id_string, url, cb); return LLTrans::getString("LoadingData"); } } +LLStyle::Params LLUrlEntryAgent::getStyle() const +{ + LLStyle::Params style_params = LLUrlEntryBase::getStyle(); + style_params.color = LLUIColorTable::instance().getColor("AgentLinkColor"); + style_params.readonly_color = LLUIColorTable::instance().getColor("AgentLinkColor"); + return style_params; +} + +std::string localize_slapp_label(const std::string& url, const std::string& full_name) +{ + // customize label string based on agent SLapp suffix + if (LLStringUtil::endsWith(url, "/mute")) + { + return LLTrans::getString("SLappAgentMute") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/unmute")) + { + return LLTrans::getString("SLappAgentUnmute") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/im")) + { + return LLTrans::getString("SLappAgentIM") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/pay")) + { + return LLTrans::getString("SLappAgentPay") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/offerteleport")) + { + return LLTrans::getString("SLappAgentOfferTeleport") + " " + full_name; + } + if (LLStringUtil::endsWith(url, "/requestfriend")) + { + return LLTrans::getString("SLappAgentRequestFriend") + " " + full_name; + } + return full_name; +} + + +std::string LLUrlEntryAgent::getIcon(const std::string &url) +{ + // *NOTE: Could look up a badge here by calling getIDStringFromUrl() + // and looking up the badge for the agent. + return mIcon; +} + +// +// LLUrlEntryAgentName describes a Second Life agent name Url, e.g., +// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username) +// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username) +// +LLUrlEntryAgentName::LLUrlEntryAgentName() +{} + +void LLUrlEntryAgentName::onAvatarNameCache(const LLUUID& id, + const LLAvatarName& av_name) +{ + std::string label = getName(av_name); + // received the agent name from the server - tell our observers + callObservers(id.asString(), label, mIcon); +} + +std::string LLUrlEntryAgentName::getLabel(const std::string &url, const LLUrlLabelCallback &cb) +{ + if (!gCacheName) + { + // probably at the login screen, use short string for layout + return LLTrans::getString("LoadingData"); + } + + std::string agent_id_string = getIDStringFromUrl(url); + if (agent_id_string.empty()) + { + // something went wrong, just give raw url + return unescapeUrl(url); + } + + LLUUID agent_id(agent_id_string); + if (agent_id.isNull()) + { + return LLTrans::getString("AvatarNameNobody"); + } + + LLAvatarName av_name; + if (LLAvatarNameCache::get(agent_id, &av_name)) + { + return getName(av_name); + } + else + { + LLAvatarNameCache::get(agent_id, + boost::bind(&LLUrlEntryAgentCompleteName::onAvatarNameCache, + this, _1, _2)); + addObserver(agent_id_string, url, cb); + return LLTrans::getString("LoadingData"); + } +} + +LLStyle::Params LLUrlEntryAgentName::getStyle() const +{ + // don't override default colors + return LLStyle::Params().is_link(false); +} + +// +// LLUrlEntryAgentCompleteName describes a Second Life agent complete name Url, e.g., +// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/completename +// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/completename +// +LLUrlEntryAgentCompleteName::LLUrlEntryAgentCompleteName() +{ + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/completename", + boost::regex::perl|boost::regex::icase); +} + +std::string LLUrlEntryAgentCompleteName::getName(const LLAvatarName& avatar_name) +{ + return avatar_name.getCompleteName(); +} + +// +// LLUrlEntryAgentDisplayName describes a Second Life agent display name Url, e.g., +// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/displayname +// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/displayname +// +LLUrlEntryAgentDisplayName::LLUrlEntryAgentDisplayName() +{ + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/displayname", + boost::regex::perl|boost::regex::icase); +} + +std::string LLUrlEntryAgentDisplayName::getName(const LLAvatarName& avatar_name) +{ + return avatar_name.mDisplayName; +} + +// +// LLUrlEntryAgentUserName describes a Second Life agent user name Url, e.g., +// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/username +// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/username +// +LLUrlEntryAgentUserName::LLUrlEntryAgentUserName() +{ + mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/username", + boost::regex::perl|boost::regex::icase); +} + +std::string LLUrlEntryAgentUserName::getName(const LLAvatarName& avatar_name) +{ + return avatar_name.mUsername.empty() ? avatar_name.getLegacyName() : avatar_name.mUsername; +} + // // LLUrlEntryGroup Describes a Second Life group Url, e.g., // secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about @@ -436,18 +618,16 @@ LLUrlEntryGroup::LLUrlEntryGroup() mMenuName = "menu_url_group.xml"; mIcon = "Generic_Group"; mTooltip = LLTrans::getString("TooltipGroupUrl"); - mColor = LLUIColorTable::instance().getColor("GroupLinkColor"); } void LLUrlEntryGroup::onGroupNameReceived(const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group) + const std::string& name, + bool is_group) { // received the group name from the server - tell our observers - callObservers(id.asString(), first); + callObservers(id.asString(), name, mIcon); } LLUUID LLUrlEntryGroup::getID(const std::string &string) const @@ -483,14 +663,23 @@ std::string LLUrlEntryGroup::getLabel(const std::string &url, const LLUrlLabelCa } else { - gCacheName->get(group_id, TRUE, + gCacheName->getGroup(group_id, boost::bind(&LLUrlEntryGroup::onGroupNameReceived, - this, _1, _2, _3, _4)); + this, _1, _2, _3)); addObserver(group_id_string, url, cb); return LLTrans::getString("LoadingData"); } } +LLStyle::Params LLUrlEntryGroup::getStyle() const +{ + LLStyle::Params style_params = LLUrlEntryBase::getStyle(); + style_params.color = LLUIColorTable::instance().getColor("GroupLinkColor"); + style_params.readonly_color = LLUIColorTable::instance().getColor("GroupLinkColor"); + return style_params; +} + + // // LLUrlEntryInventory Describes a Second Life inventory Url, e.g., // secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select @@ -789,9 +978,8 @@ std::string LLUrlEntryWorldMap::getLocation(const std::string &url) const // LLUrlEntryNoLink::LLUrlEntryNoLink() { - mPattern = boost::regex("<nolink>[^<]*</nolink>", + mPattern = boost::regex("<nolink>.*</nolink>", boost::regex::perl|boost::regex::icase); - mDisabledLink = true; } std::string LLUrlEntryNoLink::getUrl(const std::string &url) const @@ -805,6 +993,13 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC return getUrl(url); } +LLStyle::Params LLUrlEntryNoLink::getStyle() const +{ + // Don't render as URL (i.e. no context menu or hand cursor). + return LLStyle::Params().is_link(false); +} + + // // LLUrlEntryIcon describes an icon with <icon>...</icon> tags // @@ -812,7 +1007,6 @@ LLUrlEntryIcon::LLUrlEntryIcon() { mPattern = boost::regex("<icon\\s*>\\s*([^<]*)?\\s*</icon\\s*>", boost::regex::perl|boost::regex::icase); - mDisabledLink = true; } std::string LLUrlEntryIcon::getUrl(const std::string &url) const diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index e25eaa7555..1a16056041 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -30,13 +30,17 @@ #include "lluuid.h" #include "lluicolor.h" +#include "llstyle.h" #include <boost/signals2.hpp> #include <boost/regex.hpp> #include <string> #include <map> +class LLAvatarName; + typedef boost::signals2::signal<void (const std::string& url, - const std::string& label)> LLUrlLabelSignal; + const std::string& label, + const std::string& icon)> LLUrlLabelSignal; typedef LLUrlLabelSignal::slot_type LLUrlLabelCallback; /// @@ -71,10 +75,10 @@ public: virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; } /// Return an icon that can be displayed next to Urls of this type - virtual std::string getIcon(const std::string &url) { return mIcon; } + virtual std::string getIcon(const std::string &url); - /// Return the color to render the displayed text - LLUIColor getColor() const { return mColor; } + /// Return the style to render the displayed text + virtual LLStyle::Params getStyle() const; /// Given a matched Url, return a tooltip string for the hyperlink virtual std::string getTooltip(const std::string &string) const { return mTooltip; } @@ -85,9 +89,6 @@ public: /// Return the name of a SL location described by this Url, if any virtual std::string getLocation(const std::string &url) const { return ""; } - /// is this a match for a URL that should not be hyperlinked? - bool isLinkDisabled() const { return mDisabledLink; } - /// Should this link text be underlined only when mouse is hovered over it? virtual bool underlineOnHoverOnly(const std::string &string) const { return false; } @@ -100,7 +101,7 @@ protected: std::string getLabelFromWikiLink(const std::string &url) const; std::string getUrlFromWikiLink(const std::string &string) const; void addObserver(const std::string &id, const std::string &url, const LLUrlLabelCallback &cb); - void callObservers(const std::string &id, const std::string &label); + virtual void callObservers(const std::string &id, const std::string &label, const std::string& icon); typedef struct { std::string url; @@ -111,9 +112,7 @@ protected: std::string mIcon; std::string mMenuName; std::string mTooltip; - LLUIColor mColor; std::multimap<std::string, LLUrlEntryObserver> mObservers; - bool mDisabledLink; }; /// @@ -134,6 +133,7 @@ class LLUrlEntryHTTPLabel : public LLUrlEntryBase public: LLUrlEntryHTTPLabel(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getTooltip(const std::string &string) const; /*virtual*/ std::string getUrl(const std::string &string) const; }; @@ -162,18 +162,78 @@ public: /// /// LLUrlEntryAgent Describes a Second Life agent Url, e.g., /// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about -/// class LLUrlEntryAgent : public LLUrlEntryBase { public: LLUrlEntryAgent(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ std::string getIcon(const std::string &url); /*virtual*/ std::string getTooltip(const std::string &string) const; + /*virtual*/ LLStyle::Params getStyle() const; /*virtual*/ LLUUID getID(const std::string &string) const; /*virtual*/ bool underlineOnHoverOnly(const std::string &string) const; +protected: + /*virtual*/ void callObservers(const std::string &id, const std::string &label, const std::string& icon); +private: + void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); +}; + +/// +/// LLUrlEntryAgentName Describes a Second Life agent name Url, e.g., +/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/(completename|displayname|username) +/// that displays various forms of user name +/// This is a base class for the various implementations of name display +class LLUrlEntryAgentName : public LLUrlEntryBase, public boost::signals2::trackable +{ +public: + LLUrlEntryAgentName(); + /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ LLStyle::Params getStyle() const; +protected: + // override this to pull out relevant name fields + virtual std::string getName(const LLAvatarName& avatar_name) = 0; +private: + void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); +}; + + +/// +/// LLUrlEntryAgentCompleteName Describes a Second Life agent name Url, e.g., +/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/completename +/// that displays the full display name + user name for an avatar +/// such as "James Linden (james.linden)" +class LLUrlEntryAgentCompleteName : public LLUrlEntryAgentName +{ +public: + LLUrlEntryAgentCompleteName(); +private: + /*virtual*/ std::string getName(const LLAvatarName& avatar_name); +}; + +/// +/// LLUrlEntryAgentDisplayName Describes a Second Life agent display name Url, e.g., +/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/displayname +/// that displays the just the display name for an avatar +/// such as "James Linden" +class LLUrlEntryAgentDisplayName : public LLUrlEntryAgentName +{ +public: + LLUrlEntryAgentDisplayName(); +private: + /*virtual*/ std::string getName(const LLAvatarName& avatar_name); +}; + +/// +/// LLUrlEntryAgentUserName Describes a Second Life agent username Url, e.g., +/// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/username +/// that displays the just the display name for an avatar +/// such as "james.linden" +class LLUrlEntryAgentUserName : public LLUrlEntryAgentName +{ +public: + LLUrlEntryAgentUserName(); private: - void onAgentNameReceived(const LLUUID& id, const std::string& first, - const std::string& last, BOOL is_group); + /*virtual*/ std::string getName(const LLAvatarName& avatar_name); }; /// @@ -185,10 +245,10 @@ class LLUrlEntryGroup : public LLUrlEntryBase public: LLUrlEntryGroup(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); + /*virtual*/ LLStyle::Params getStyle() const; /*virtual*/ LLUUID getID(const std::string &string) const; private: - void onGroupNameReceived(const LLUUID& id, const std::string& first, - const std::string& last, BOOL is_group); + void onGroupNameReceived(const LLUUID& id, const std::string& name, bool is_group); }; /// @@ -297,6 +357,7 @@ public: LLUrlEntryNoLink(); /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb); /*virtual*/ std::string getUrl(const std::string &string) const; + /*virtual*/ LLStyle::Params getStyle() const; }; /// diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp index e53b0c4370..c1f1382a9f 100644 --- a/indra/llui/llurlmatch.cpp +++ b/indra/llui/llurlmatch.cpp @@ -37,16 +37,15 @@ LLUrlMatch::LLUrlMatch() : mIcon(""), mMenuName(""), mLocation(""), - mDisabledLink(false), mUnderlineOnHoverOnly(false) { } void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, const std::string &label, const std::string &tooltip, - const std::string &icon, const LLUIColor& color, + const std::string &icon, const LLStyle::Params& style, const std::string &menu, const std::string &location, - bool disabled_link, const LLUUID& id, bool underline_on_hover_only) + const LLUUID& id, bool underline_on_hover_only) { mStart = start; mEnd = end; @@ -54,10 +53,10 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url, mLabel = label; mTooltip = tooltip; mIcon = icon; - mColor = color; + mStyle = style; + mStyle.link_href = url; mMenuName = menu; mLocation = location; - mDisabledLink = disabled_link; mID = id; mUnderlineOnHoverOnly = underline_on_hover_only; } diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h index d1b2112ee7..2818f45207 100644 --- a/indra/llui/llurlmatch.h +++ b/indra/llui/llurlmatch.h @@ -28,11 +28,11 @@ #ifndef LL_LLURLMATCH_H #define LL_LLURLMATCH_H -#include "linden_common.h" +//#include "linden_common.h" #include <string> #include <vector> -#include "lluicolor.h" +#include "llstyle.h" /// /// LLUrlMatch describes a single Url that was matched within a string by @@ -69,7 +69,7 @@ public: std::string getIcon() const { return mIcon; } /// Return the color to render the displayed text - LLUIColor getColor() const { return mColor; } + LLStyle::Params getStyle() const { return mStyle; } /// Return the name of a XUI file containing the context menu items std::string getMenuName() const { return mMenuName; } @@ -77,21 +77,17 @@ public: /// return the SL location that this Url describes, or "" if none. std::string getLocation() const { return mLocation; } - /// is this a match for a URL that should not be hyperlinked? - bool isLinkDisabled() const { return mDisabledLink; } - /// Should this link text be underlined only when mouse is hovered over it? bool underlineOnHoverOnly() const { return mUnderlineOnHoverOnly; } /// Change the contents of this match object (used by LLUrlRegistry) void setValues(U32 start, U32 end, const std::string &url, const std::string &label, const std::string &tooltip, const std::string &icon, - const LLUIColor& color, const std::string &menu, - const std::string &location, bool disabled_link - , const LLUUID& id, bool underline_on_hover_only = false ); - - const LLUUID& getID() const { return mID;} + const LLStyle::Params& style, const std::string &menu, + const std::string &location, const LLUUID& id, + bool underline_on_hover_only = false ); + const LLUUID& getID() const { return mID; } private: U32 mStart; U32 mEnd; @@ -101,10 +97,8 @@ private: std::string mIcon; std::string mMenuName; std::string mLocation; - LLUUID mID; - LLUIColor mColor; - bool mDisabledLink; + LLStyle::Params mStyle; bool mUnderlineOnHoverOnly; }; diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp index 9d215cf7ef..478b412d5e 100644 --- a/indra/llui/llurlregistry.cpp +++ b/indra/llui/llurlregistry.cpp @@ -31,18 +31,25 @@ #include <boost/regex.hpp> // default dummy callback that ignores any label updates from the server -void LLUrlRegistryNullCallback(const std::string &url, const std::string &label) +void LLUrlRegistryNullCallback(const std::string &url, const std::string &label, const std::string& icon) { } LLUrlRegistry::LLUrlRegistry() { + mUrlEntry.reserve(20); + // Urls are matched in the order that they were registered registerUrl(new LLUrlEntryNoLink()); registerUrl(new LLUrlEntryIcon()); registerUrl(new LLUrlEntrySLURL()); registerUrl(new LLUrlEntryHTTP()); registerUrl(new LLUrlEntryHTTPLabel()); + registerUrl(new LLUrlEntryAgentCompleteName()); + registerUrl(new LLUrlEntryAgentDisplayName()); + registerUrl(new LLUrlEntryAgentUserName()); + // LLUrlEntryAgent*Name must appear before LLUrlEntryAgent since + // LLUrlEntryAgent is a less specific (catchall for agent urls) registerUrl(new LLUrlEntryAgent()); registerUrl(new LLUrlEntryGroup()); registerUrl(new LLUrlEntryParcel()); @@ -71,10 +78,13 @@ LLUrlRegistry::~LLUrlRegistry() } } -void LLUrlRegistry::registerUrl(LLUrlEntryBase *url) +void LLUrlRegistry::registerUrl(LLUrlEntryBase *url, bool force_front) { if (url) { + if (force_front) // IDEVO + mUrlEntry.insert(mUrlEntry.begin(), url); + else mUrlEntry.push_back(url); } } @@ -174,10 +184,9 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL match_entry->getLabel(url, cb), match_entry->getTooltip(url), match_entry->getIcon(url), - match_entry->getColor(), + match_entry->getStyle(), match_entry->getMenuName(), match_entry->getLocation(url), - match_entry->isLinkDisabled(), match_entry->getID(url), match_entry->underlineOnHoverOnly(url)); return true; @@ -210,10 +219,9 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr match.getLabel(), match.getTooltip(), match.getIcon(), - match.getColor(), + match.getStyle(), match.getMenuName(), match.getLocation(), - match.isLinkDisabled(), match.getID(), match.underlineOnHoverOnly()); return true; diff --git a/indra/llui/llurlregistry.h b/indra/llui/llurlregistry.h index 24ce516c43..da16171a97 100644 --- a/indra/llui/llurlregistry.h +++ b/indra/llui/llurlregistry.h @@ -37,7 +37,9 @@ #include <vector> /// This default callback for findUrl() simply ignores any label updates -void LLUrlRegistryNullCallback(const std::string &url, const std::string &label); +void LLUrlRegistryNullCallback(const std::string &url, + const std::string &label, + const std::string &icon); /// /// LLUrlRegistry is a singleton that contains a set of Url types that @@ -64,7 +66,9 @@ public: ~LLUrlRegistry(); /// add a new Url handler to the registry (will be freed on destruction) - void registerUrl(LLUrlEntryBase *url); + /// optionally force it to the front of the list, making it take + /// priority over other regular expression matches for URLs + void registerUrl(LLUrlEntryBase *url, bool force_front = false); /// get the next Url in an input string, starting at a given character offset /// your callback is invoked if the matched Url's label changes in the future diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index fe5ef269a9..3fa86bf0ca 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -102,11 +102,7 @@ LLView::Params::Params() left_pad("left_pad"), left_delta("left_delta", S32_MAX), from_xui("from_xui", false), - user_resize("user_resize"), - auto_resize("auto_resize"), needs_translate("translate"), - min_width("min_width"), - max_width("max_width"), xmlns("xmlns"), xmlns_xsi("xmlns:xsi"), xsi_schemaLocation("xsi:schemaLocation"), @@ -218,7 +214,7 @@ void LLView::setUseBoundingRect( BOOL use_bounding_rect ) } } -BOOL LLView::getUseBoundingRect() +BOOL LLView::getUseBoundingRect() const { return mUseBoundingRect; } @@ -1370,12 +1366,12 @@ void LLView::drawDebugRect() // drawing solids requires texturing be disabled gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - if (mUseBoundingRect) + if (getUseBoundingRect()) { LLUI::translate((F32)mBoundingRect.mLeft - (F32)mRect.mLeft, (F32)mBoundingRect.mBottom - (F32)mRect.mBottom, 0.f); } - LLRect debug_rect = mUseBoundingRect ? mBoundingRect : mRect; + LLRect debug_rect = getUseBoundingRect() ? mBoundingRect : mRect; // draw red rectangle for the border LLColor4 border_color(0.25f, 0.25f, 0.25f, 1.f); @@ -1573,7 +1569,7 @@ void LLView::updateBoundingRect() LLRect cur_rect = mBoundingRect; - if (mUseBoundingRect) + if (getUseBoundingRect()) { mBoundingRect = calcBoundingRect(); } @@ -1583,7 +1579,7 @@ void LLView::updateBoundingRect() } // give parent view a chance to resize, in case we just moved, for example - if (getParent() && getParent()->mUseBoundingRect) + if (getParent() && getParent()->getUseBoundingRect()) { getParent()->updateBoundingRect(); } @@ -1607,7 +1603,7 @@ LLRect LLView::calcScreenBoundingRect() const { LLRect screen_rect; // get bounding rect, if used - LLRect bounding_rect = mUseBoundingRect ? mBoundingRect : mRect; + LLRect bounding_rect = getUseBoundingRect() ? mBoundingRect : mRect; // convert to local coordinates, as defined by mRect bounding_rect.translate(-mRect.mLeft, -mRect.mBottom); @@ -1692,7 +1688,9 @@ LLView* LLView::getChildView(const std::string& name, BOOL recurse) const child = getDefaultWidget<LLView>(name); if (!child) { - child = LLUICtrlFactory::createDefaultWidget<LLView>(name); + LLView::Params view_params; + view_params.name = name; + child = LLUICtrlFactory::create<LLView>(view_params); } } return child; @@ -1736,14 +1734,14 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const BOOL LLView::parentPointInView(S32 x, S32 y, EHitTestType type) const { - return (mUseBoundingRect && type == HIT_TEST_USE_BOUNDING_RECT) + return (getUseBoundingRect() && type == HIT_TEST_USE_BOUNDING_RECT) ? mBoundingRect.pointInRect( x, y ) : mRect.pointInRect( x, y ); } BOOL LLView::pointInView(S32 x, S32 y, EHitTestType type) const { - return (mUseBoundingRect && type == HIT_TEST_USE_BOUNDING_RECT) + return (getUseBoundingRect() && type == HIT_TEST_USE_BOUNDING_RECT) ? mBoundingRect.pointInRect( x + mRect.mLeft, y + mRect.mBottom ) : mRect.localPointInRect( x, y ); } diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 6d79415c26..33d345beff 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -128,26 +128,22 @@ public: Optional<std::string> layout; Optional<LLRect> rect; + // Historical bottom-left layout used bottom_delta and left_delta // for relative positioning. New layout "topleft" prefers specifying // based on top edge. - Optional<S32> bottom_delta, // deprecated - top_pad, // from last bottom to my top - top_delta, // from last top to my top - left_pad, // from last right to my left - left_delta; // from last left to my left - - // these are nested attributes for LLLayoutPanel + Optional<S32> bottom_delta, // from last bottom to my bottom + top_pad, // from last bottom to my top + top_delta, // from last top to my top + left_pad, // from last right to my left + left_delta; // from last left to my left + //FIXME: get parent context involved in parsing traversal - Ignored user_resize, - auto_resize, - needs_translate, - min_width, - max_width, - xmlns, - xmlns_xsi, - xsi_schemaLocation, - xsi_type; + Ignored needs_translate, // cue for translation tools + xmlns, // xml namespace + xmlns_xsi, // xml namespace + xsi_schemaLocation, // xml schema + xsi_type; // xml schema type Params(); }; @@ -238,7 +234,7 @@ public: void setSoundFlags(U8 flags) { mSoundFlags = flags; } void setName(std::string name) { mName = name; } void setUseBoundingRect( BOOL use_bounding_rect ); - BOOL getUseBoundingRect(); + BOOL getUseBoundingRect() const; ECursorType getHoverCursor() { return mHoverCursor; } diff --git a/indra/llui/tests/llurlentry_stub.cpp b/indra/llui/tests/llurlentry_stub.cpp index ff53ae5624..f30704cb22 100644 --- a/indra/llui/tests/llurlentry_stub.cpp +++ b/indra/llui/tests/llurlentry_stub.cpp @@ -27,11 +27,28 @@ #include "llstring.h" #include "llfile.h" +#include "llavatarnamecache.h" #include "llcachename.h" #include "lluuid.h" #include <string> +// Stub for LLAvatarNameCache +bool LLAvatarNameCache::get(const LLUUID& agent_id, LLAvatarName *av_name) +{ + return false; +} + +void LLAvatarNameCache::get(const LLUUID& agent_id, callback_slot_t slot) +{ + return; +} + +bool LLAvatarNameCache::useDisplayNames() +{ + return false; +} + // // Stub implementation for LLCacheName // @@ -47,7 +64,12 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group) return TRUE; } -boost::signals2::connection LLCacheName::get(const LLUUID& id, BOOL is_group, const LLCacheNameCallback& callback) +boost::signals2::connection LLCacheName::get(const LLUUID& id, bool is_group, const LLCacheNameCallback& callback) +{ + return boost::signals2::connection(); +} + +boost::signals2::connection LLCacheName::getGroup(const LLUUID& id, const LLCacheNameCallback& callback) { return boost::signals2::connection(); } @@ -67,3 +89,105 @@ std::string LLTrans::getString(const std::string &xml_desc, const LLStringUtil:: { return std::string(); } + +// +// Stub implementation for LLStyle::Params::Params +// + +LLStyle::Params::Params() +{ +} + +// +// Stub implementations for various LLInitParam classes +// + +namespace LLInitParam +{ + BaseBlock::BaseBlock() {} + BaseBlock::~BaseBlock() {} + Param::Param(BaseBlock* enclosing_block) + : mIsProvided(false) + { + const U8* my_addr = reinterpret_cast<const U8*>(this); + const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block); + mEnclosingBlockOffset = (U16)(my_addr - block_addr); + } + void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {} + + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){} + param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;} + + void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) + { + descriptor.mCurrentBlockPtr = this; + } + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; } + bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; } + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; } + bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } + bool BaseBlock::validateBlock(bool emit_errors) const { return true; } + + TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) + : super_t(descriptor, name, value, func, min_count, max_count) + {} + + void TypedParam<LLUIColor>::setValueFromBlock() const + {} + + void TypedParam<LLUIColor>::setBlockFromValue() + {} + + void TypeValues<LLUIColor>::declareValues() + {} + + bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) + { + return false; + } + + TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) + : super_t(descriptor, _name, value, func, min_count, max_count) + {} + + void TypedParam<const LLFontGL*>::setValueFromBlock() const + {} + + void TypedParam<const LLFontGL*>::setBlockFromValue() + {} + + void TypeValues<LLFontGL::HAlign>::declareValues() + {} + + void TypeValues<LLFontGL::VAlign>::declareValues() + {} + + void TypeValues<LLFontGL::ShadowType>::declareValues() + {} + + void TypedParam<LLUIImage*>::setValueFromBlock() const + {} + + void TypedParam<LLUIImage*>::setBlockFromValue() + {} + + + bool ParamCompare<LLUIImage*, false>::equals( + LLUIImage* const &a, + LLUIImage* const &b) + { + return false; + } + + bool ParamCompare<LLUIColor, false>::equals(const LLUIColor &a, const LLUIColor &b) + { + return false; + } + +} + +//static +LLFontGL* LLFontGL::getFontDefault() +{ + return NULL; +} diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 95affe4460..5c6623da61 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -30,6 +30,7 @@ #include "llurlentry_stub.cpp" #include "lltut.h" #include "../lluicolortable.h" +#include "../lluiimage.h" #include <boost/regex.hpp> @@ -40,6 +41,26 @@ LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& defa LLUIColor::LLUIColor() : mColorPtr(NULL) {} +LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image) +{ +} + +LLUIImage::~LLUIImage() +{ +} + +//virtual +S32 LLUIImage::getWidth() const +{ + return 0; +} + +//virtual +S32 LLUIImage::getHeight() const +{ + return 0; +} + namespace tut { struct LLUrlEntryData diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp index 4e38bea1bd..fdaab00f18 100644 --- a/indra/llui/tests/llurlmatch_test.cpp +++ b/indra/llui/tests/llurlmatch_test.cpp @@ -25,14 +25,135 @@ * $/LicenseInfo$ */ +#include "linden_common.h" + #include "../llurlmatch.h" +#include "../lluiimage.h" #include "lltut.h" -// link seam +// link seams + LLUIColor::LLUIColor() : mColorPtr(NULL) {} +LLStyle::Params::Params() +{ +} + +LLUIImage::LLUIImage(const std::string& name, LLPointer<LLTexture> image) +{ +} + +LLUIImage::~LLUIImage() +{ +} + +//virtual +S32 LLUIImage::getWidth() const +{ + return 0; +} + +//virtual +S32 LLUIImage::getHeight() const +{ + return 0; +} + +namespace LLInitParam +{ + BaseBlock::BaseBlock() {} + BaseBlock::~BaseBlock() {} + + void BaseBlock::setLastChangedParam(const Param& last_param, bool user_provided) {} + + void BaseBlock::addParam(BlockDescriptor& block_data, const ParamDescriptor& in_param, const char* char_name){} + param_handle_t BaseBlock::getHandleFromParam(const Param* param) const {return 0;} + + void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) + { + descriptor.mCurrentBlockPtr = this; + } + + Param::Param(BaseBlock* enclosing_block) + : mIsProvided(false) + { + const U8* my_addr = reinterpret_cast<const U8*>(this); + const U8* block_addr = reinterpret_cast<const U8*>(enclosing_block); + mEnclosingBlockOffset = (U16)(my_addr - block_addr); + } + + bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack){ return true; } + bool BaseBlock::serializeBlock(Parser& parser, Parser::name_stack_t name_stack, const LLInitParam::BaseBlock* diff_block) const { return true; } + bool BaseBlock::inspectBlock(Parser& parser, Parser::name_stack_t name_stack) const { return true; } + bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite) { return true; } + bool BaseBlock::validateBlock(bool emit_errors) const { return true; } + + TypedParam<LLUIColor >::TypedParam(BlockDescriptor& descriptor, const char* name, const LLUIColor& value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) + : super_t(descriptor, name, value, func, min_count, max_count) + {} + + void TypedParam<LLUIColor>::setValueFromBlock() const + {} + + void TypedParam<LLUIColor>::setBlockFromValue() + {} + + void TypeValues<LLUIColor>::declareValues() + {} + + bool ParamCompare<const LLFontGL*, false>::equals(const LLFontGL* a, const LLFontGL* b) + { + return false; + } + + TypedParam<const LLFontGL*>::TypedParam(BlockDescriptor& descriptor, const char* _name, const LLFontGL*const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count) + : super_t(descriptor, _name, value, func, min_count, max_count) + {} + + void TypedParam<const LLFontGL*>::setValueFromBlock() const + {} + + void TypedParam<const LLFontGL*>::setBlockFromValue() + {} + + void TypeValues<LLFontGL::HAlign>::declareValues() + {} + + void TypeValues<LLFontGL::VAlign>::declareValues() + {} + + void TypeValues<LLFontGL::ShadowType>::declareValues() + {} + + void TypedParam<LLUIImage*>::setValueFromBlock() const + {} + + void TypedParam<LLUIImage*>::setBlockFromValue() + {} + + bool ParamCompare<LLUIImage*, false>::equals( + LLUIImage* const &a, + LLUIImage* const &b) + { + return false; + } + + bool ParamCompare<LLUIColor, false>::equals(const LLUIColor &a, const LLUIColor &b) + { + return false; + } + +} + +//static +LLFontGL* LLFontGL::getFontDefault() +{ + return NULL; +} + + namespace tut { struct LLUrlMatchData @@ -59,7 +180,7 @@ namespace tut LLUrlMatch match; ensure("empty()", match.empty()); - match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure("! empty()", ! match.empty()); } @@ -72,7 +193,7 @@ namespace tut LLUrlMatch match; ensure_equals("getStart() == 0", match.getStart(), 0); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getStart() == 10", match.getStart(), 10); } @@ -85,7 +206,7 @@ namespace tut LLUrlMatch match; ensure_equals("getEnd() == 0", match.getEnd(), 0); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getEnd() == 20", match.getEnd(), 20); } @@ -98,10 +219,10 @@ namespace tut LLUrlMatch match; ensure_equals("getUrl() == ''", match.getUrl(), ""); - match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "http://slurl.com/", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getUrl() == '' (2)", match.getUrl(), ""); } @@ -114,10 +235,10 @@ namespace tut LLUrlMatch match; ensure_equals("getLabel() == ''", match.getLabel(), ""); - match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "Label", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getLabel() == '' (2)", match.getLabel(), ""); } @@ -130,10 +251,10 @@ namespace tut LLUrlMatch match; ensure_equals("getTooltip() == ''", match.getTooltip(), ""); - match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "Info", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getTooltip() == '' (2)", match.getTooltip(), ""); } @@ -146,10 +267,10 @@ namespace tut LLUrlMatch match; ensure_equals("getIcon() == ''", match.getIcon(), ""); - match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure_equals("getIcon() == '' (2)", match.getIcon(), ""); } @@ -162,10 +283,10 @@ namespace tut LLUrlMatch match; ensure("getMenuName() empty", match.getMenuName().empty()); - match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "", LLUUID::null); ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure("getMenuName() empty (2)", match.getMenuName().empty()); } @@ -178,10 +299,10 @@ namespace tut LLUrlMatch match; ensure("getLocation() empty", match.getLocation().empty()); - match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "Icon", LLStyle::Params(), "xui_file.xml", "Paris", LLUUID::null); ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris"); - match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null); + match.setValues(10, 20, "", "", "", "", LLStyle::Params(), "", "", LLUUID::null); ensure("getLocation() empty (2)", match.getLocation().empty()); } } diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 938fb008c9..1179180da2 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -83,7 +83,7 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask) std::string filename; std::string fullpath; S32 result; - while (getNextFileInDir(dirname, mask, filename, FALSE)) + while (getNextFileInDir(dirname, mask, filename)) { fullpath = dirname; fullpath += getDirDelimiter(); diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h index 4f63c04aab..42996fd051 100644 --- a/indra/llvfs/lldir.h +++ b/indra/llvfs/lldir.h @@ -74,8 +74,32 @@ class LLDir // pure virtual functions virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask) = 0; - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) = 0; - virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) = 0; + + /// Walk the files in a directory, with file pattern matching + virtual BOOL getNextFileInDir(const std::string& dirname, ///< directory path - must end in trailing slash! + const std::string& mask, ///< file pattern string (use "*" for all) + std::string& fname ///< output: found file name + ) = 0; + /**< + * @returns true if a file was found, false if the entire directory has been scanned. + * + * @note that this function is NOT thread safe + * + * This function may not be used to scan part of a directory, then start a new search of a different + * directory, and then restart the first search where it left off; the entire search must run to + * completion or be abandoned - there is no restart. + * + * @bug: See http://jira.secondlife.com/browse/VWR-23697 + * and/or the tests in test/lldir_test.cpp + * This is known to fail with patterns that have both: + * a wildcard left of a . and more than one sequential ? right of a . + * the pattern foo.??x appears to work + * but *.??x or foo?.??x do not + * + * @todo this really should be rewritten as an iterator object, and the + * filtering should be done in a platform-independent way. + */ + virtual std::string getCurPath() = 0; virtual BOOL fileExists(const std::string &filename) const = 0; diff --git a/indra/llvfs/lldir_linux.cpp b/indra/llvfs/lldir_linux.cpp index 6ccac45569..73f2336f94 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -93,7 +93,7 @@ LLDir_Linux::LLDir_Linux() #else mAppRODataDir = tmp_str; #endif - U32 indra_pos = mExecutableDir.find("/indra"); + std::string::size_type indra_pos = mExecutableDir.find("/indra"); if (indra_pos != std::string::npos) { // ...we're in a dev checkout @@ -243,8 +243,7 @@ U32 LLDir_Linux::countFilesInDir(const std::string &dirname, const std::string & } // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { glob_t g; BOOL result = FALSE; @@ -276,11 +275,6 @@ BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string mCurrentDirIndex++; - if((mCurrentDirIndex >= (int)g.gl_pathc) && wrap) - { - mCurrentDirIndex = 0; - } - if(mCurrentDirIndex < (int)g.gl_pathc) { // llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; @@ -308,47 +302,7 @@ BOOL LLDir_Linux::getNextFileInDir(const std::string &dirname, const std::string } -// get a random file in the directory -// automatically wrap if we've hit the end -void LLDir_Linux::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - S32 num_files; - S32 which_file; - DIR *dirp; - dirent *entryp = NULL; - - fname = ""; - num_files = countFilesInDir(dirname,mask); - if (!num_files) - { - return; - } - - which_file = ll_rand(num_files); - -// llinfos << "Random select file #" << which_file << llendl; - - // which_file now indicates the (zero-based) index to which file to play - - if (!((dirp = opendir(dirname.c_str())))) - { - while (which_file--) - { - if (!((entryp = readdir(dirp)))) - { - return; - } - } - - if ((!which_file) && entryp) - { - fname = entryp->d_name; - } - - closedir(dirp); - } -} std::string LLDir_Linux::getCurPath() { diff --git a/indra/llvfs/lldir_linux.h b/indra/llvfs/lldir_linux.h index 809959e873..451e81ae93 100644 --- a/indra/llvfs/lldir_linux.h +++ b/indra/llvfs/lldir_linux.h @@ -43,8 +43,7 @@ public: public: virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); - virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); + virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp index b41b0ec5dd..445285aa43 100644 --- a/indra/llvfs/lldir_mac.cpp +++ b/indra/llvfs/lldir_mac.cpp @@ -259,8 +259,7 @@ U32 LLDir_Mac::countFilesInDir(const std::string &dirname, const std::string &ma } // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { glob_t g; BOOL result = FALSE; @@ -292,11 +291,6 @@ BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string & mCurrentDirIndex++; - if((mCurrentDirIndex >= g.gl_pathc) && wrap) - { - mCurrentDirIndex = 0; - } - if(mCurrentDirIndex < g.gl_pathc) { // llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; @@ -323,41 +317,7 @@ BOOL LLDir_Mac::getNextFileInDir(const std::string &dirname, const std::string & return(result); } -// get a random file in the directory -void LLDir_Mac::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - S32 which_file; - glob_t g; - fname = ""; - - std::string tmp_str; - tmp_str = dirname; - tmp_str += mask; - - if(glob(tmp_str.c_str(), GLOB_NOSORT, NULL, &g) == 0) - { - if(g.gl_pathc > 0) - { - - which_file = ll_rand(g.gl_pathc); - -// llinfos << "getRandomFileInDir: returning number " << which_file << ", path is " << g.gl_pathv[which_file] << llendl; - // The API wants just the filename, not the full path. - //fname = g.gl_pathv[which_file]; - char *s = strrchr(g.gl_pathv[which_file], '/'); - - if(s == NULL) - s = g.gl_pathv[which_file]; - else if(s[0] == '/') - s++; - - fname = s; - } - - globfree(&g); - } -} S32 LLDir_Mac::deleteFilesInDir(const std::string &dirname, const std::string &mask) { diff --git a/indra/llvfs/lldir_mac.h b/indra/llvfs/lldir_mac.h index 04c52dc940..4eac3c3ae6 100644 --- a/indra/llvfs/lldir_mac.h +++ b/indra/llvfs/lldir_mac.h @@ -43,8 +43,7 @@ public: virtual S32 deleteFilesInDir(const std::string &dirname, const std::string &mask); virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); - virtual void getRandomFileInDir(const std::string &dirname, const std::string &ask, std::string &fname); + virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); virtual BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); diff --git a/indra/llvfs/lldir_solaris.cpp b/indra/llvfs/lldir_solaris.cpp index 4323dfd44a..515fd66b6e 100644 --- a/indra/llvfs/lldir_solaris.cpp +++ b/indra/llvfs/lldir_solaris.cpp @@ -261,8 +261,7 @@ U32 LLDir_Solaris::countFilesInDir(const std::string &dirname, const std::string } // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { glob_t g; BOOL result = FALSE; @@ -294,11 +293,6 @@ BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::stri mCurrentDirIndex++; - if((mCurrentDirIndex >= (int)g.gl_pathc) && wrap) - { - mCurrentDirIndex = 0; - } - if(mCurrentDirIndex < (int)g.gl_pathc) { // llinfos << "getNextFileInDir: returning number " << mCurrentDirIndex << ", path is " << g.gl_pathv[mCurrentDirIndex] << llendl; @@ -326,47 +320,7 @@ BOOL LLDir_Solaris::getNextFileInDir(const std::string &dirname, const std::stri } -// get a random file in the directory -// automatically wrap if we've hit the end -void LLDir_Solaris::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - S32 num_files; - S32 which_file; - DIR *dirp; - dirent *entryp = NULL; - - fname = ""; - - num_files = countFilesInDir(dirname,mask); - if (!num_files) - { - return; - } - - which_file = ll_rand(num_files); - -// llinfos << "Random select file #" << which_file << llendl; - // which_file now indicates the (zero-based) index to which file to play - - if (!((dirp = opendir(dirname.c_str())))) - { - while (which_file--) - { - if (!((entryp = readdir(dirp)))) - { - return; - } - } - - if ((!which_file) && entryp) - { - fname = entryp->d_name; - } - - closedir(dirp); - } -} std::string LLDir_Solaris::getCurPath() { diff --git a/indra/llvfs/lldir_solaris.h b/indra/llvfs/lldir_solaris.h index 6e0c5cfc69..4a1794f539 100644 --- a/indra/llvfs/lldir_solaris.h +++ b/indra/llvfs/lldir_solaris.h @@ -43,8 +43,7 @@ public: public: virtual std::string getCurPath(); virtual U32 countFilesInDir(const std::string &dirname, const std::string &mask); - virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); - virtual void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); + virtual BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; private: diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index 8b1a2ddd3c..4a8526cc96 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -116,10 +116,6 @@ LLDir_Win32::LLDir_Win32() mExecutableDir = utf16str_to_utf8str(llutf16string(w_str)); #endif - mAppRODataDir = "."; - - mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; - if (mExecutableDir.find("indra") == std::string::npos) { // Running from installed directory. Make sure current @@ -129,8 +125,12 @@ LLDir_Win32::LLDir_Win32() GetCurrentDirectory(MAX_PATH, w_str); mWorkingDir = utf16str_to_utf8str(llutf16string(w_str)); } + mAppRODataDir = mWorkingDir; + llinfos << "mAppRODataDir = " << mAppRODataDir << llendl; + mSkinBaseDir = mAppRODataDir + mDirDelimiter + "skins"; + // Build the default cache directory mDefaultCacheDir = buildSLOSCacheDir(); @@ -246,21 +246,13 @@ U32 LLDir_Win32::countFilesInDir(const std::string &dirname, const std::string & // get the next file in the directory -// automatically wrap if we've hit the end -BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap) +BOOL LLDir_Win32::getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) { - llutf16string dirnamew = utf8str_to_utf16str(dirname); - return getNextFileInDir(dirnamew, mask, fname, wrap); - -} + BOOL fileFound = FALSE; + fname = ""; -BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap) -{ WIN32_FIND_DATAW FileData; - - fname = ""; - llutf16string pathname = dirname; - pathname += utf8str_to_utf16str(mask); + llutf16string pathname = utf8str_to_utf16str(dirname) + utf8str_to_utf16str(mask); if (pathname != mCurrentDir) { @@ -273,91 +265,44 @@ BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::stri // and open new one // Check error opening Directory structure - if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) == INVALID_HANDLE_VALUE) - { -// llinfos << "Unable to locate first file" << llendl; - return(FALSE); - } - } - else // get next file in list - { - // Find next entry - if (!FindNextFile(mDirSearch_h, &FileData)) + if ((mDirSearch_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) { - if (GetLastError() == ERROR_NO_MORE_FILES) - { - // No more files, so reset to beginning of directory - FindClose(mDirSearch_h); - mCurrentDir[0] = NULL; - - if (wrap) - { - return(getNextFileInDir(pathname,"",fname,TRUE)); - } - else - { - fname[0] = 0; - return(FALSE); - } - } - else - { - // Error -// llinfos << "Unable to locate next file" << llendl; - return(FALSE); - } + fileFound = TRUE; } } - // convert from TCHAR to char - fname = utf16str_to_utf8str(FileData.cFileName); - - // fname now first name in list - return(TRUE); -} - - -// get a random file in the directory -// automatically wrap if we've hit the end -void LLDir_Win32::getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname) -{ - S32 num_files; - S32 which_file; - HANDLE random_search_h; - - fname = ""; - - llutf16string pathname = utf8str_to_utf16str(dirname); - pathname += utf8str_to_utf16str(mask); - - WIN32_FIND_DATA FileData; - fname[0] = NULL; - - num_files = countFilesInDir(dirname,mask); - if (!num_files) - { - return; - } - - which_file = ll_rand(num_files); - -// llinfos << "Random select mp3 #" << which_file << llendl; - - // which_file now indicates the (zero-based) index to which file to play + // Loop to skip over the current (.) and parent (..) directory entries + // (apparently returned in Win7 but not XP) + do + { + if ( fileFound + && ( (lstrcmp(FileData.cFileName, (LPCTSTR)TEXT(".")) == 0) + ||(lstrcmp(FileData.cFileName, (LPCTSTR)TEXT("..")) == 0) + ) + ) + { + fileFound = FALSE; + } + } while ( mDirSearch_h != INVALID_HANDLE_VALUE + && !fileFound + && (fileFound = FindNextFile(mDirSearch_h, &FileData) + ) + ); + + if (!fileFound && GetLastError() == ERROR_NO_MORE_FILES) + { + // No more files, so reset to beginning of directory + FindClose(mDirSearch_h); + mCurrentDir[0] = '\000'; + } - if ((random_search_h = FindFirstFile(pathname.c_str(), &FileData)) != INVALID_HANDLE_VALUE) - { - while (which_file--) - { - if (!FindNextFile(random_search_h, &FileData)) - { - return; - } - } - FindClose(random_search_h); - - fname = utf16str_to_utf8str(llutf16string(FileData.cFileName)); + if (fileFound) + { + // convert from TCHAR to char + fname = utf16str_to_utf8str(FileData.cFileName); } + + return fileFound; } std::string LLDir_Win32::getCurPath() diff --git a/indra/llvfs/lldir_win32.h b/indra/llvfs/lldir_win32.h index d3e45dc1f3..4c932c932c 100644 --- a/indra/llvfs/lldir_win32.h +++ b/indra/llvfs/lldir_win32.h @@ -40,15 +40,14 @@ public: /*virtual*/ std::string getCurPath(); /*virtual*/ U32 countFilesInDir(const std::string &dirname, const std::string &mask); - /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname, BOOL wrap); - /*virtual*/ void getRandomFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); + /*virtual*/ BOOL getNextFileInDir(const std::string &dirname, const std::string &mask, std::string &fname); /*virtual*/ BOOL fileExists(const std::string &filename) const; /*virtual*/ std::string getLLPluginLauncher(); /*virtual*/ std::string getLLPluginFilename(std::string base_name); private: - BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname, BOOL wrap); + BOOL LLDir_Win32::getNextFileInDir(const llutf16string &dirname, const std::string &mask, std::string &fname); void* mDirSearch_h; llutf16string mCurrentDir; diff --git a/indra/llvfs/tests/lldir_test.cpp b/indra/llvfs/tests/lldir_test.cpp index bcffa449c8..83ccb277b3 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -256,5 +256,158 @@ namespace tut gDirUtilp->getExtension(dottedPathExt), "ext"); } + + std::string makeTestFile( const std::string& dir, const std::string& file ) + { + std::string delim = gDirUtilp->getDirDelimiter(); + std::string path = dir + delim + file; + LLFILE* handle = LLFile::fopen( path, "w" ); + ensure("failed to open test file '"+path+"'", handle != NULL ); + ensure("failed to write to test file '"+path+"'", !fputs("test file", handle) ); + fclose(handle); + return path; + } + + std::string makeTestDir( const std::string& dirbase ) + { + int counter; + std::string uniqueDir; + bool foundUnused; + std::string delim = gDirUtilp->getDirDelimiter(); + + for (counter=0, foundUnused=false; !foundUnused; counter++ ) + { + char counterStr[3]; + sprintf(counterStr, "%02d", counter); + uniqueDir = dirbase + counterStr; + foundUnused = ! ( LLFile::isdir(uniqueDir) || LLFile::isfile(uniqueDir) ); + } + ensure("test directory '" + uniqueDir + "' creation failed", !LLFile::mkdir(uniqueDir)); + + return uniqueDir + delim; // HACK - apparently, the trailing delimiter is needed... + } + + static const char* DirScanFilename[5] = { "file1.abc", "file2.abc", "file1.xyz", "file2.xyz", "file1.mno" }; + + void scanTest(const std::string& directory, const std::string& pattern, bool correctResult[5]) + { + + // Scan directory and see if any file1.* files are found + std::string scanResult; + int found = 0; + bool filesFound[5] = { false, false, false, false, false }; + //std::cerr << "searching '"+directory+"' for '"+pattern+"'\n"; + + while ( found <= 5 && gDirUtilp->getNextFileInDir(directory, pattern, scanResult) ) + { + found++; + //std::cerr << " found '"+scanResult+"'\n"; + int check; + for (check=0; check < 5 && ! ( scanResult == DirScanFilename[check] ); check++) + { + } + // check is now either 5 (not found) or the index of the matching name + if (check < 5) + { + ensure( "found file '"+(std::string)DirScanFilename[check]+"' twice", ! filesFound[check] ); + filesFound[check] = true; + } + else // check is 5 - should not happen + { + fail( "found unknown file '"+scanResult+"'"); + } + } + for (int i=0; i<5; i++) + { + if (correctResult[i]) + { + ensure("scan of '"+directory+"' using '"+pattern+"' did not return '"+DirScanFilename[i]+"'", filesFound[i]); + } + else + { + ensure("scan of '"+directory+"' using '"+pattern+"' incorrectly returned '"+DirScanFilename[i]+"'", !filesFound[i]); + } + } + } + + template<> template<> + void LLDirTest_object_t::test<5>() + // getNextFileInDir + { + std::string delim = gDirUtilp->getDirDelimiter(); + std::string dirTemp = LLFile::tmpdir(); + + // Create the same 5 file names of the two directories + + std::string dir1 = makeTestDir(dirTemp + "getNextFileInDir"); + std::string dir2 = makeTestDir(dirTemp + "getNextFileInDir"); + std::string dir1files[5]; + std::string dir2files[5]; + for (int i=0; i<5; i++) + { + dir1files[i] = makeTestFile(dir1, DirScanFilename[i]); + dir2files[i] = makeTestFile(dir2, DirScanFilename[i]); + } + + // Scan dir1 and see if each of the 5 files is found exactly once + bool expected1[5] = { true, true, true, true, true }; + scanTest(dir1, "*", expected1); + + // Scan dir2 and see if only the 2 *.xyz files are found + bool expected2[5] = { false, false, true, true, false }; + scanTest(dir1, "*.xyz", expected2); + + // Scan dir2 and see if only the 1 *.mno file is found + bool expected3[5] = { false, false, false, false, true }; + scanTest(dir2, "*.mno", expected3); + + // Scan dir1 and see if any *.foo files are found + bool expected4[5] = { false, false, false, false, false }; + scanTest(dir1, "*.foo", expected4); + + // Scan dir1 and see if any file1.* files are found + bool expected5[5] = { true, false, true, false, true }; + scanTest(dir1, "file1.*", expected5); + + // Scan dir1 and see if any file1.* files are found + bool expected6[5] = { true, true, false, false, false }; + scanTest(dir1, "file?.abc", expected6); + + // Scan dir2 and see if any file?.x?z files are found + bool expected7[5] = { false, false, true, true, false }; + scanTest(dir2, "file?.x?z", expected7); + + // Scan dir2 and see if any file?.??c files are found + // THESE FAIL ON Mac and Windows, SO ARE COMMENTED OUT FOR NOW + // bool expected8[5] = { true, true, false, false, false }; + // scanTest(dir2, "file?.??c", expected8); + // scanTest(dir2, "*.??c", expected8); + + // Scan dir1 and see if any *.?n? files are found + bool expected9[5] = { false, false, false, false, true }; + scanTest(dir1, "*.?n?", expected9); + + // Scan dir1 and see if any *.???? files are found + // THIS ONE FAILS ON WINDOWS (returns three charater suffixes) SO IS COMMENTED OUT FOR NOW + // bool expected10[5] = { false, false, false, false, false }; + // scanTest(dir1, "*.????", expected10); + + // Scan dir1 and see if any ?????.* files are found + bool expected11[5] = { true, true, true, true, true }; + scanTest(dir1, "?????.*", expected11); + + // Scan dir1 and see if any ??l??.xyz files are found + bool expected12[5] = { false, false, true, true, false }; + scanTest(dir1, "??l??.xyz", expected12); + + // clean up all test files and directories + for (int i=0; i<5; i++) + { + LLFile::remove(dir1files[i]); + LLFile::remove(dir2files[i]); + } + LLFile::rmdir(dir1); + LLFile::rmdir(dir2); + } } diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 0b324a10c9..2c92539387 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -68,7 +68,6 @@ namespace LLInitParam void BlockDescriptor::aggregateBlockData(BlockDescriptor& src_block_data) { mNamedParams.insert(src_block_data.mNamedParams.begin(), src_block_data.mNamedParams.end()); - mSynonyms.insert(src_block_data.mSynonyms.begin(), src_block_data.mSynonyms.end()); std::copy(src_block_data.mUnnamedParams.begin(), src_block_data.mUnnamedParams.end(), std::back_inserter(mUnnamedParams)); std::copy(src_block_data.mValidationList.begin(), src_block_data.mValidationList.end(), std::back_inserter(mValidationList)); std::copy(src_block_data.mAllParams.begin(), src_block_data.mAllParams.end(), std::back_inserter(mAllParams)); @@ -78,8 +77,7 @@ namespace LLInitParam // BaseBlock // BaseBlock::BaseBlock() - : mChangeVersion(0), - mBlockDescriptor(NULL) + : mChangeVersion(0) {} BaseBlock::~BaseBlock() @@ -88,8 +86,6 @@ namespace LLInitParam // called by each derived class in least to most derived order void BaseBlock::init(BlockDescriptor& descriptor, BlockDescriptor& base_descriptor, size_t block_size) { - mBlockDescriptor = &descriptor; - descriptor.mCurrentBlockPtr = this; descriptor.mMaxParamOffset = block_size; @@ -182,7 +178,7 @@ namespace LLInitParam param_handle_t param_handle = it->second->mParamHandle; const Param* param = getParamFromHandle(param_handle); ParamDescriptor::serialize_func_t serialize_func = it->second->mSerializeFunc; - if (serialize_func) + if (serialize_func && param->anyProvided()) { // Ensure this param has not already been serialized // Prevents <rect> from being serialized as its own tag. @@ -274,22 +270,6 @@ namespace LLInitParam } } - for(BlockDescriptor::param_map_t::const_iterator it = block_data.mSynonyms.begin(); - it != block_data.mSynonyms.end(); - ++it) - { - param_handle_t param_handle = it->second->mParamHandle; - const Param* param = getParamFromHandle(param_handle); - ParamDescriptor::inspect_func_t inspect_func = it->second->mInspectFunc; - if (inspect_func) - { - // use existing serial number for param - name_stack.push_back(std::make_pair(it->first, it->second->mGeneration)); - inspect_func(*param, parser, name_stack, it->second->mMinCount, it->second->mMaxCount); - name_stack.pop_back(); - } - } - return true; } @@ -311,22 +291,9 @@ namespace LLInitParam // find pointer to member parameter from offset table paramp = getParamFromHandle(found_it->second->mParamHandle); deserialize_func = found_it->second->mDeserializeFunc; - } - else - { - BlockDescriptor::param_map_t::iterator found_it = block_data.mSynonyms.find(top_name); - if (found_it != block_data.mSynonyms.end()) - { - // find pointer to member parameter from offset table - paramp = getParamFromHandle(found_it->second->mParamHandle); - deserialize_func = found_it->second->mDeserializeFunc; - } - } - Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second); - ++new_name_stack.first; - if (deserialize_func) - { + Parser::name_stack_range_t new_name_stack(name_stack.first, name_stack.second); + ++new_name_stack.first; return deserialize_func(*paramp, p, new_name_stack, name_stack.first == name_stack.second ? -1 : name_stack.first->second); } } @@ -401,7 +368,7 @@ namespace LLInitParam } else { - block_data.mSynonyms[synonym] = param_descriptor; + block_data.mNamedParams[synonym] = param_descriptor; } } } @@ -426,14 +393,6 @@ namespace LLInitParam } } - for (BlockDescriptor::param_map_t::const_iterator it = block_data.mSynonyms.begin(); it != block_data.mSynonyms.end(); ++it) - { - if (it->second->mParamHandle == handle) - { - return it->first; - } - } - return LLStringUtil::null; } diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 869b0c2cd6..8cb5bd80fc 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -34,6 +34,7 @@ f * @file llinitparam.h #include <boost/function.hpp> #include <boost/bind.hpp> #include <boost/type_traits/is_convertible.hpp> +#include <boost/unordered_map.hpp> #include "llregistry.h" #include "llmemory.h" @@ -196,36 +197,39 @@ namespace LLInitParam typedef std::pair<name_stack_t::const_iterator, name_stack_t::const_iterator> name_stack_range_t; typedef std::vector<std::string> possible_values_t; - typedef boost::function<bool (void*)> parser_read_func_t; - typedef boost::function<bool (const void*, const name_stack_t&)> parser_write_func_t; + typedef bool (*parser_read_func_t)(Parser& parser, void* output); + typedef bool (*parser_write_func_t)(Parser& parser, const void*, const name_stack_t&); typedef boost::function<void (const name_stack_t&, S32, S32, const possible_values_t*)> parser_inspect_func_t; typedef std::map<const std::type_info*, parser_read_func_t, CompareTypeID> parser_read_func_map_t; typedef std::map<const std::type_info*, parser_write_func_t, CompareTypeID> parser_write_func_map_t; typedef std::map<const std::type_info*, parser_inspect_func_t, CompareTypeID> parser_inspect_func_map_t; - Parser() + Parser(parser_read_func_map_t& read_map, parser_write_func_map_t& write_map, parser_inspect_func_map_t& inspect_map) : mParseSilently(false), - mParseGeneration(0) + mParseGeneration(0), + mParserReadFuncs(&read_map), + mParserWriteFuncs(&write_map), + mParserInspectFuncs(&inspect_map) {} virtual ~Parser(); template <typename T> bool readValue(T& param) { - parser_read_func_map_t::iterator found_it = mParserReadFuncs.find(&typeid(T)); - if (found_it != mParserReadFuncs.end()) + parser_read_func_map_t::iterator found_it = mParserReadFuncs->find(&typeid(T)); + if (found_it != mParserReadFuncs->end()) { - return found_it->second((void*)¶m); + return found_it->second(*this, (void*)¶m); } return false; } template <typename T> bool writeValue(const T& param, const name_stack_t& name_stack) { - parser_write_func_map_t::iterator found_it = mParserWriteFuncs.find(&typeid(T)); - if (found_it != mParserWriteFuncs.end()) + parser_write_func_map_t::iterator found_it = mParserWriteFuncs->find(&typeid(T)); + if (found_it != mParserWriteFuncs->end()) { - return found_it->second((const void*)¶m, name_stack); + return found_it->second(*this, (const void*)¶m, name_stack); } return false; } @@ -233,8 +237,8 @@ namespace LLInitParam // dispatch inspection to registered inspection functions, for each parameter in a param block template <typename T> bool inspectValue(const name_stack_t& name_stack, S32 min_count, S32 max_count, const possible_values_t* possible_values) { - parser_inspect_func_map_t::iterator found_it = mParserInspectFuncs.find(&typeid(T)); - if (found_it != mParserInspectFuncs.end()) + parser_inspect_func_map_t::iterator found_it = mParserInspectFuncs->find(&typeid(T)); + if (found_it != mParserInspectFuncs->end()) { found_it->second(name_stack, min_count, max_count, possible_values); return true; @@ -246,7 +250,6 @@ namespace LLInitParam virtual void parserWarning(const std::string& message); virtual void parserError(const std::string& message); void setParseSilently(bool silent) { mParseSilently = silent; } - bool getParseSilently() { return mParseSilently; } S32 getParseGeneration() { return mParseGeneration; } S32 newParseGeneration() { return ++mParseGeneration; } @@ -254,24 +257,24 @@ namespace LLInitParam protected: template <typename T> - void registerParserFuncs(parser_read_func_t read_func, parser_write_func_t write_func) + void registerParserFuncs(parser_read_func_t read_func, parser_write_func_t write_func = NULL) { - mParserReadFuncs.insert(std::make_pair(&typeid(T), read_func)); - mParserWriteFuncs.insert(std::make_pair(&typeid(T), write_func)); + mParserReadFuncs->insert(std::make_pair(&typeid(T), read_func)); + mParserWriteFuncs->insert(std::make_pair(&typeid(T), write_func)); } template <typename T> void registerInspectFunc(parser_inspect_func_t inspect_func) { - mParserInspectFuncs.insert(std::make_pair(&typeid(T), inspect_func)); + mParserInspectFuncs->insert(std::make_pair(&typeid(T), inspect_func)); } bool mParseSilently; private: - parser_read_func_map_t mParserReadFuncs; - parser_write_func_map_t mParserWriteFuncs; - parser_inspect_func_map_t mParserInspectFuncs; + parser_read_func_map_t* mParserReadFuncs; + parser_write_func_map_t* mParserWriteFuncs; + parser_inspect_func_map_t* mParserInspectFuncs; S32 mParseGeneration; }; @@ -284,7 +287,7 @@ namespace LLInitParam void setProvided(bool is_provided) { mIsProvided = is_provided; } protected: - bool getProvided() const { return mIsProvided; } + bool anyProvided() const { return mIsProvided; } Param(class BaseBlock* enclosing_block); @@ -380,14 +383,13 @@ namespace LLInitParam void aggregateBlockData(BlockDescriptor& src_block_data); public: - typedef std::map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams + typedef boost::unordered_map<const std::string, ParamDescriptor*> param_map_t; // references param descriptors stored in mAllParams typedef std::vector<ParamDescriptor*> param_list_t; typedef std::list<ParamDescriptor> all_params_list_t;// references param descriptors stored in mAllParams typedef std::vector<std::pair<param_handle_t, ParamDescriptor::validation_func_t> > param_validation_list_t; param_map_t mNamedParams; // parameters with associated names - param_map_t mSynonyms; // parameters with alternate names param_list_t mUnnamedParams; // parameters with_out_ associated names param_validation_list_t mValidationList; // parameters that must be validated all_params_list_t mAllParams; // all parameters, owns descriptors @@ -473,8 +475,8 @@ namespace LLInitParam bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const; bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const; - const BlockDescriptor& mostDerivedBlockDescriptor() const { return *mBlockDescriptor; } - BlockDescriptor& mostDerivedBlockDescriptor() { return *mBlockDescriptor; } + virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } + virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); } // take all provided params from other and apply to self bool overwriteFrom(const BaseBlock& other) @@ -499,8 +501,6 @@ namespace LLInitParam // can be updated in getters mutable S32 mChangeVersion; - BlockDescriptor* mBlockDescriptor; // most derived block descriptor - static BlockDescriptor& selfBlockDescriptor() { static BlockDescriptor sBlockDescriptor; @@ -568,7 +568,7 @@ namespace LLInitParam mData.mValue = value; } - bool isProvided() const { return Param::getProvided(); } + bool isProvided() const { return Param::anyProvided(); } static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { @@ -576,7 +576,7 @@ namespace LLInitParam // no further names in stack, attempt to parse value now if (name_stack.first == name_stack.second) { - if (parser.readValue<T>(typed_param.mData.mValue)) + if (parser.readValue(typed_param.mData.mValue)) { typed_param.mData.clearKey(); typed_param.setProvided(true); @@ -589,7 +589,7 @@ namespace LLInitParam { // try to parse a known named value std::string name; - if (parser.readValue<std::string>(name)) + if (parser.readValue(name)) { // try to parse a per type named value if (NAME_VALUE_LOOKUP::get(name, typed_param.mData.mValue)) @@ -624,7 +624,7 @@ namespace LLInitParam { if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key)) { - if (!parser.writeValue<std::string>(key, name_stack)) + if (!parser.writeValue(key, name_stack)) { return; } @@ -632,7 +632,7 @@ namespace LLInitParam } // then try to serialize value directly else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), static_cast<const self_t*>(diff_param)->get())) { - if (!parser.writeValue<T>(typed_param.mData.mValue, name_stack)) + if (!parser.writeValue(typed_param.mData.mValue, name_stack)) { return; } @@ -745,7 +745,7 @@ namespace LLInitParam { // try to parse a known named value std::string name; - if (parser.readValue<std::string>(name)) + if (parser.readValue(name)) { // try to parse a per type named value if (NAME_VALUE_LOOKUP::get(name, typed_param)) @@ -772,7 +772,7 @@ namespace LLInitParam std::string key = typed_param.mData.getKey(); if (!key.empty() && typed_param.mData.mKeyVersion == typed_param.getLastChangeVersion()) { - if (!parser.writeValue<std::string>(key, name_stack)) + if (!parser.writeValue(key, name_stack)) { return; } @@ -795,13 +795,13 @@ namespace LLInitParam bool isProvided() const { // only validate block when it hasn't already passed validation and user has supplied *some* value - if (Param::getProvided() && mData.mValidatedVersion < T::getLastChangeVersion()) + if (Param::anyProvided() && mData.mValidatedVersion < T::getLastChangeVersion()) { // a sub-block is "provided" when it has been filled in enough to be valid mData.mValidated = T::validateBlock(false); mData.mValidatedVersion = T::getLastChangeVersion(); } - return Param::getProvided() && mData.mValidated; + return Param::anyProvided() && mData.mValidated; } // assign block contents to this param-that-is-a-block @@ -852,7 +852,7 @@ namespace LLInitParam { const self_t& src_typed_param = static_cast<const self_t&>(src); self_t& dst_typed_param = static_cast<self_t&>(dst); - if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite || !dst_typed_param.isProvided())) + if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite)) { dst_typed_param.mData.clearKey(); return true; @@ -909,7 +909,7 @@ namespace LLInitParam } } - bool isProvided() const { return Param::getProvided(); } + bool isProvided() const { return Param::anyProvided(); } static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { @@ -919,7 +919,7 @@ namespace LLInitParam if (name_stack.first == name_stack.second) { // attempt to read value directly - if (parser.readValue<value_t>(value)) + if (parser.readValue(value)) { typed_param.mValues.push_back(value); // save an empty name/value key as a placeholder @@ -934,7 +934,7 @@ namespace LLInitParam { // try to parse a known named value std::string name; - if (parser.readValue<std::string>(name)) + if (parser.readValue(name)) { // try to parse a per type named value if (NAME_VALUE_LOOKUP::get(name, typed_param.mValues)) @@ -958,7 +958,7 @@ namespace LLInitParam const self_t& typed_param = static_cast<const self_t&>(param); if (!typed_param.isProvided() || name_stack.empty()) return; - typename container_t::const_iterator it = typed_param.mValues.begin(); + const_iterator it = typed_param.mValues.begin(); for (typename std::vector<key_cache_t>::const_iterator key_it = typed_param.mCachedKeys.begin(); it != typed_param.mValues.end(); ++key_it, ++it) @@ -968,13 +968,13 @@ namespace LLInitParam if(!key.empty()) { - if(!parser.writeValue<std::string>(key, name_stack)) + if(!parser.writeValue(key, name_stack)) { return; } } // not parse via name values, write out value directly - else if (!parser.writeValue<VALUE_TYPE>(*it, name_stack)) + else if (!parser.writeValue(*it, name_stack)) { return; } @@ -1025,8 +1025,15 @@ namespace LLInitParam // implicit conversion operator value_assignment_t() const { return self_t::get(); } - // explicit conversion - value_assignment_t operator()() const { return get(); } + + typedef typename container_t::iterator iterator; + typedef typename container_t::const_iterator const_iterator; + iterator begin() { return mValues.begin(); } + iterator end() { return mValues.end(); } + const_iterator begin() const { return mValues.begin(); } + const_iterator end() const { return mValues.end(); } + bool empty() const { return mValues.empty(); } + size_t size() const { return mValues.size(); } U32 numValidElements() const { @@ -1092,7 +1099,7 @@ namespace LLInitParam } } - bool isProvided() const { return Param::getProvided(); } + bool isProvided() const { return Param::anyProvided(); } value_ref_t operator[](S32 index) { return mValues[index]; } value_const_ref_t operator[](S32 index) const { return mValues[index]; } @@ -1100,32 +1107,41 @@ namespace LLInitParam static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { self_t& typed_param = static_cast<self_t&>(param); + bool new_value = false; if (generation != typed_param.mLastParamGeneration || typed_param.mValues.empty()) { + new_value = true; typed_param.mValues.push_back(value_t()); typed_param.mCachedKeys.push_back(Data()); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.mLastParamGeneration = generation; } - value_t& value = typed_param.mValues.back(); + value_ref_t value = typed_param.mValues.back(); // attempt to parse block... if(value.deserializeBlock(parser, name_stack)) { + if (new_value) + { // successfully parsed new value, let's keep it + typed_param.mLastParamGeneration = generation; + } + typed_param.enclosingBlock().setLastChangedParam(param, true); typed_param.setProvided(true); return true; } - - if(!NAME_VALUE_LOOKUP::empty()) + else if(!NAME_VALUE_LOOKUP::empty()) { // try to parse a known named value std::string name; - if (parser.readValue<std::string>(name)) + if (parser.readValue(name)) { // try to parse a per type named value if (NAME_VALUE_LOOKUP::get(name, value)) { + if (new_value) + { // successfully parsed new value, let's keep it + typed_param.mLastParamGeneration = generation; + } + typed_param.mCachedKeys.back().setKey(name); typed_param.mCachedKeys.back().mKeyVersion = value.getLastChangeVersion(); typed_param.enclosingBlock().setLastChangedParam(param, true); @@ -1136,6 +1152,12 @@ namespace LLInitParam } } + if (new_value) + { // failed to parse new value, pop it off + typed_param.mValues.pop_back(); + typed_param.mCachedKeys.pop_back(); + } + return false; } @@ -1144,7 +1166,7 @@ namespace LLInitParam const self_t& typed_param = static_cast<const self_t&>(param); if (!typed_param.isProvided() || name_stack.empty()) return; - typename container_t::const_iterator it = typed_param.mValues.begin(); + const_iterator it = typed_param.mValues.begin(); for (typename std::vector<Data>::const_iterator key_it = typed_param.mCachedKeys.begin(); it != typed_param.mValues.end(); ++key_it, ++it) @@ -1154,7 +1176,7 @@ namespace LLInitParam std::string key = key_it->getKey(); if (!key.empty() && key_it->mKeyVersion == it->getLastChangeVersion()) { - if(!parser.writeValue<std::string>(key, name_stack)) + if(!parser.writeValue(key, name_stack)) { return; } @@ -1208,13 +1230,20 @@ namespace LLInitParam // implicit conversion operator value_assignment_t() const { return self_t::get(); } - // explicit conversion - value_assignment_t operator()() const { return get(); } + + typedef typename container_t::iterator iterator; + typedef typename container_t::const_iterator const_iterator; + iterator begin() { return mValues.begin(); } + iterator end() { return mValues.end(); } + const_iterator begin() const { return mValues.begin(); } + const_iterator end() const { return mValues.end(); } + bool empty() const { return mValues.empty(); } + size_t size() const { return mValues.size(); } U32 numValidElements() const { U32 count = 0; - for (typename container_t::const_iterator it = mValues.begin(); + for (const_iterator it = mValues.begin(); it != mValues.end(); ++it) { @@ -1306,6 +1335,9 @@ namespace LLInitParam BaseBlock::setLastChangedParam(last_param, user_provided); } + virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } + virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); } + protected: Choice() : mCurChoice(0) @@ -1415,6 +1447,10 @@ namespace LLInitParam { return BaseBlock::merge(selfBlockDescriptor(), other, false); } + + virtual const BlockDescriptor& mostDerivedBlockDescriptor() const { return selfBlockDescriptor(); } + virtual BlockDescriptor& mostDerivedBlockDescriptor() { return selfBlockDescriptor(); } + protected: Block() { @@ -1494,15 +1530,13 @@ namespace LLInitParam typedef Multiple<T, RANGE, NAME_VALUE_LOOKUP> self_t; typedef typename super_t::container_t container_t; typedef typename super_t::value_assignment_t value_assignment_t; - typedef typename container_t::iterator iterator; - typedef typename container_t::const_iterator const_iterator; + typedef typename super_t::iterator iterator; + typedef typename super_t::const_iterator const_iterator; explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get()) : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount()) {} - using super_t::operator(); - Multiple& operator=(value_assignment_t val) { set(val); @@ -1612,7 +1646,7 @@ namespace LLInitParam // type to apply parse direct value T if (name_stack.first == name_stack.second) { - if(parser.readValue<T>(typed_param.mData.mValue)) + if(parser.readValue(typed_param.mData.mValue)) { typed_param.enclosingBlock().setLastChangedParam(param, true); typed_param.setProvided(true); @@ -1627,7 +1661,7 @@ namespace LLInitParam { // try to parse a known named value std::string name; - if (parser.readValue<std::string>(name)) + if (parser.readValue(name)) { // try to parse a per type named value if (TypeValues<T>::get(name, typed_param.mData.mValue)) @@ -1669,7 +1703,7 @@ namespace LLInitParam { if (!diff_param || !ParamCompare<std::string>::equals(static_cast<const self_t*>(diff_param)->mData.getKey(), key)) { - if (!parser.writeValue<std::string>(key, name_stack)) + if (!parser.writeValue(key, name_stack)) { return; } @@ -1679,7 +1713,7 @@ namespace LLInitParam else if (!diff_param || !ParamCompare<T>::equals(typed_param.get(), (static_cast<const self_t*>(diff_param))->get())) { - if (parser.writeValue<T>(typed_param.mData.mValue, name_stack)) + if (parser.writeValue(typed_param.mData.mValue, name_stack)) { return; } @@ -1712,7 +1746,7 @@ namespace LLInitParam bool isProvided() const { - if (!Param::getProvided()) return false; + if (!Param::anyProvided()) return false; // block has an updated parameter // if cached value is stale, regenerate from params @@ -1779,7 +1813,7 @@ namespace LLInitParam value_assignment_t get() const { // if some parameters were provided, issue warnings on invalid blocks - if (Param::getProvided() && (mData.mValueAge == OLDER_THAN_BLOCK)) + if (Param::anyProvided() && (mData.mValueAge == OLDER_THAN_BLOCK)) { // go ahead and issue warnings at this point if any param is invalid if(block_t::validateBlock(true)) diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h index ee119b9ebc..eee9933739 100644 --- a/indra/llxuixml/llregistry.h +++ b/indra/llxuixml/llregistry.h @@ -70,6 +70,11 @@ public: mMap.erase(key); } + void replace(ref_const_key_t key, ref_const_value_t value) + { + mMap[key] = value; + } + typename registry_map_t::const_iterator beginItems() const { return mMap.begin(); diff --git a/indra/llxuixml/lltrans.cpp b/indra/llxuixml/lltrans.cpp index 01e13864b6..11127a53f5 100644 --- a/indra/llxuixml/lltrans.cpp +++ b/indra/llxuixml/lltrans.cpp @@ -66,7 +66,8 @@ bool LLTrans::parseStrings(LLXMLNodePtr &root, const std::set<std::string>& defa } StringTable string_table; - LLXUIParser::instance().readXUI(root, string_table, xml_filename); + LLXUIParser parser; + parser.readXUI(root, string_table, xml_filename); if (!string_table.validateBlock()) { @@ -77,8 +78,8 @@ bool LLTrans::parseStrings(LLXMLNodePtr &root, const std::set<std::string>& defa sStringTemplates.clear(); sDefaultArgs.clear(); - for(LLInitParam::ParamIterator<StringDef>::const_iterator it = string_table.strings().begin(); - it != string_table.strings().end(); + for(LLInitParam::ParamIterator<StringDef>::const_iterator it = string_table.strings.begin(); + it != string_table.strings.end(); ++it) { LLTransTemplate xml_template(it->name, it->value); @@ -109,7 +110,8 @@ bool LLTrans::parseLanguageStrings(LLXMLNodePtr &root) } StringTable string_table; - LLXUIParser::instance().readXUI(root, string_table, xml_filename); + LLXUIParser parser; + parser.readXUI(root, string_table, xml_filename); if (!string_table.validateBlock()) { @@ -117,8 +119,8 @@ bool LLTrans::parseLanguageStrings(LLXMLNodePtr &root) return false; } - for(LLInitParam::ParamIterator<StringDef>::const_iterator it = string_table.strings().begin(); - it != string_table.strings().end(); + for(LLInitParam::ParamIterator<StringDef>::const_iterator it = string_table.strings.begin(); + it != string_table.strings.end(); ++it) { // share the same map with parseStrings() so we can search the strings using the same getString() function.- angela diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index 8469debd3e..9942af6b37 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -29,17 +29,34 @@ #include "llxuiparser.h" #include "llxmlnode.h" + +#ifdef LL_STANDALONE +#include <expat.h> +#else +#include "expat/expat.h" +#endif + #include <fstream> #include <boost/tokenizer.hpp> +//#include <boost/spirit/include/qi.hpp> +#include <boost/spirit/include/classic_core.hpp> #include "lluicolor.h" +using namespace BOOST_SPIRIT_CLASSIC_NS; + const S32 MAX_STRING_ATTRIBUTE_SIZE = 40; +static LLInitParam::Parser::parser_read_func_map_t sXSDReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sXSDWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sXSDInspectFuncs; + + // // LLXSDWriter // LLXSDWriter::LLXSDWriter() +: Parser(sXSDReadFuncs, sXSDWriteFuncs, sXSDInspectFuncs) { registerInspectFunc<bool>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:boolean", _1, _2, _3, _4)); registerInspectFunc<std::string>(boost::bind(&LLXSDWriter::writeAttribute, this, "xs:string", _1, _2, _3, _4)); @@ -357,41 +374,35 @@ void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& p fclose(xsd_file); } +static LLInitParam::Parser::parser_read_func_map_t sXUIReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sXUIWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sXUIInspectFuncs; + // // LLXUIParser // LLXUIParser::LLXUIParser() -: mLastWriteGeneration(-1), +: Parser(sXUIReadFuncs, sXUIWriteFuncs, sXUIInspectFuncs), + mLastWriteGeneration(-1), mCurReadDepth(0) { - registerParserFuncs<bool>(boost::bind(&LLXUIParser::readBoolValue, this, _1), - boost::bind(&LLXUIParser::writeBoolValue, this, _1, _2)); - registerParserFuncs<std::string>(boost::bind(&LLXUIParser::readStringValue, this, _1), - boost::bind(&LLXUIParser::writeStringValue, this, _1, _2)); - registerParserFuncs<U8>(boost::bind(&LLXUIParser::readU8Value, this, _1), - boost::bind(&LLXUIParser::writeU8Value, this, _1, _2)); - registerParserFuncs<S8>(boost::bind(&LLXUIParser::readS8Value, this, _1), - boost::bind(&LLXUIParser::writeS8Value, this, _1, _2)); - registerParserFuncs<U16>(boost::bind(&LLXUIParser::readU16Value, this, _1), - boost::bind(&LLXUIParser::writeU16Value, this, _1, _2)); - registerParserFuncs<S16>(boost::bind(&LLXUIParser::readS16Value, this, _1), - boost::bind(&LLXUIParser::writeS16Value, this, _1, _2)); - registerParserFuncs<U32>(boost::bind(&LLXUIParser::readU32Value, this, _1), - boost::bind(&LLXUIParser::writeU32Value, this, _1, _2)); - registerParserFuncs<S32>(boost::bind(&LLXUIParser::readS32Value, this, _1), - boost::bind(&LLXUIParser::writeS32Value, this, _1, _2)); - registerParserFuncs<F32>(boost::bind(&LLXUIParser::readF32Value, this, _1), - boost::bind(&LLXUIParser::writeF32Value, this, _1, _2)); - registerParserFuncs<F64>(boost::bind(&LLXUIParser::readF64Value, this, _1), - boost::bind(&LLXUIParser::writeF64Value, this, _1, _2)); - registerParserFuncs<LLColor4>(boost::bind(&LLXUIParser::readColor4Value, this, _1), - boost::bind(&LLXUIParser::writeColor4Value, this, _1, _2)); - registerParserFuncs<LLUIColor>(boost::bind(&LLXUIParser::readUIColorValue, this, _1), - boost::bind(&LLXUIParser::writeUIColorValue, this, _1, _2)); - registerParserFuncs<LLUUID>(boost::bind(&LLXUIParser::readUUIDValue, this, _1), - boost::bind(&LLXUIParser::writeUUIDValue, this, _1, _2)); - registerParserFuncs<LLSD>(boost::bind(&LLXUIParser::readSDValue, this, _1), - boost::bind(&LLXUIParser::writeSDValue, this, _1, _2)); + if (sXUIReadFuncs.empty()) + { + registerParserFuncs<bool>(readBoolValue, writeBoolValue); + registerParserFuncs<std::string>(readStringValue, writeStringValue); + registerParserFuncs<U8>(readU8Value, writeU8Value); + registerParserFuncs<S8>(readS8Value, writeS8Value); + registerParserFuncs<U16>(readU16Value, writeU16Value); + registerParserFuncs<S16>(readS16Value, writeS16Value); + registerParserFuncs<U32>(readU32Value, writeU32Value); + registerParserFuncs<S32>(readS32Value, writeS32Value); + registerParserFuncs<F32>(readF32Value, writeF32Value); + registerParserFuncs<F64>(readF64Value, writeF64Value); + registerParserFuncs<LLColor4>(readColor4Value, writeColor4Value); + registerParserFuncs<LLUIColor>(readUIColorValue, writeUIColorValue); + registerParserFuncs<LLUUID>(readUUIDValue, writeUUIDValue); + registerParserFuncs<LLSD>(readSDValue, writeSDValue); + } } static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing"); @@ -400,6 +411,7 @@ void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, cons { LLFastTimer timer(FTM_PARSE_XUI); mNameStack.clear(); + mRootNodeName = node->getName()->mString; mCurFileName = filename; mCurReadDepth = 0; setParseSilently(silent); @@ -410,11 +422,11 @@ void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, cons } else { - readXUIImpl(node, std::string(node->getName()->mString), block); + readXUIImpl(node, block); } } -bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, const std::string& scope, LLInitParam::BaseBlock& block) +bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) { typedef boost::tokenizer<boost::char_separator<char> > tokenizer; boost::char_separator<char> sep("."); @@ -481,7 +493,15 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, const std::string& scope, LLIn } // check for proper nesting - if(!scope.empty() && *name_token_it != scope) + if (mNameStack.empty()) + { + if (*name_token_it != mRootNodeName) + { + childp = childp->getNextSibling(); + continue; + } + } + else if(mNameStack.back().first != *name_token_it) { childp = childp->getNextSibling(); continue; @@ -499,7 +519,7 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, const std::string& scope, LLIn } // recurse and visit children XML nodes - if(readXUIImpl(childp, mNameStack.empty() ? scope : mNameStack.back().first, block)) + if(readXUIImpl(childp, block)) { // child node successfully parsed, remove from DOM @@ -615,17 +635,19 @@ LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack) } -bool LLXUIParser::readBoolValue(void* val_ptr) +bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr) { S32 value; - bool success = mCurReadNode->getBoolValue(1, &value); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + bool success = self.mCurReadNode->getBoolValue(1, &value); *((bool*)val_ptr) = (value != FALSE); return success; } -bool LLXUIParser::writeBoolValue(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setBoolValue(*((bool*)val_ptr)); @@ -634,15 +656,17 @@ bool LLXUIParser::writeBoolValue(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readStringValue(void* val_ptr) +bool LLXUIParser::readStringValue(Parser& parser, void* val_ptr) { - *((std::string*)val_ptr) = mCurReadNode->getSanitizedValue(); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + *((std::string*)val_ptr) = self.mCurReadNode->getSanitizedValue(); return true; } -bool LLXUIParser::writeStringValue(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { const std::string* string_val = reinterpret_cast<const std::string*>(val_ptr); @@ -671,14 +695,16 @@ bool LLXUIParser::writeStringValue(const void* val_ptr, const name_stack_t& stac return false; } -bool LLXUIParser::readU8Value(void* val_ptr) +bool LLXUIParser::readU8Value(Parser& parser, void* val_ptr) { - return mCurReadNode->getByteValue(1, (U8*)val_ptr); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode->getByteValue(1, (U8*)val_ptr); } -bool LLXUIParser::writeU8Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setUnsignedValue(*((U8*)val_ptr)); @@ -687,10 +713,11 @@ bool LLXUIParser::writeU8Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readS8Value(void* val_ptr) +bool LLXUIParser::readS8Value(Parser& parser, void* val_ptr) { + LLXUIParser& self = static_cast<LLXUIParser&>(parser); S32 value; - if(mCurReadNode->getIntValue(1, &value)) + if(self.mCurReadNode->getIntValue(1, &value)) { *((S8*)val_ptr) = value; return true; @@ -698,9 +725,10 @@ bool LLXUIParser::readS8Value(void* val_ptr) return false; } -bool LLXUIParser::writeS8Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeS8Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setIntValue(*((S8*)val_ptr)); @@ -709,10 +737,11 @@ bool LLXUIParser::writeS8Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readU16Value(void* val_ptr) +bool LLXUIParser::readU16Value(Parser& parser, void* val_ptr) { + LLXUIParser& self = static_cast<LLXUIParser&>(parser); U32 value; - if(mCurReadNode->getUnsignedValue(1, &value)) + if(self.mCurReadNode->getUnsignedValue(1, &value)) { *((U16*)val_ptr) = value; return true; @@ -720,9 +749,10 @@ bool LLXUIParser::readU16Value(void* val_ptr) return false; } -bool LLXUIParser::writeU16Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeU16Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setUnsignedValue(*((U16*)val_ptr)); @@ -731,10 +761,11 @@ bool LLXUIParser::writeU16Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readS16Value(void* val_ptr) +bool LLXUIParser::readS16Value(Parser& parser, void* val_ptr) { + LLXUIParser& self = static_cast<LLXUIParser&>(parser); S32 value; - if(mCurReadNode->getIntValue(1, &value)) + if(self.mCurReadNode->getIntValue(1, &value)) { *((S16*)val_ptr) = value; return true; @@ -742,9 +773,10 @@ bool LLXUIParser::readS16Value(void* val_ptr) return false; } -bool LLXUIParser::writeS16Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeS16Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setIntValue(*((S16*)val_ptr)); @@ -753,14 +785,16 @@ bool LLXUIParser::writeS16Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readU32Value(void* val_ptr) +bool LLXUIParser::readU32Value(Parser& parser, void* val_ptr) { - return mCurReadNode->getUnsignedValue(1, (U32*)val_ptr); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode->getUnsignedValue(1, (U32*)val_ptr); } -bool LLXUIParser::writeU32Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeU32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setUnsignedValue(*((U32*)val_ptr)); @@ -769,14 +803,16 @@ bool LLXUIParser::writeU32Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readS32Value(void* val_ptr) +bool LLXUIParser::readS32Value(Parser& parser, void* val_ptr) { - return mCurReadNode->getIntValue(1, (S32*)val_ptr); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode->getIntValue(1, (S32*)val_ptr); } -bool LLXUIParser::writeS32Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeS32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setIntValue(*((S32*)val_ptr)); @@ -785,14 +821,16 @@ bool LLXUIParser::writeS32Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readF32Value(void* val_ptr) +bool LLXUIParser::readF32Value(Parser& parser, void* val_ptr) { - return mCurReadNode->getFloatValue(1, (F32*)val_ptr); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode->getFloatValue(1, (F32*)val_ptr); } -bool LLXUIParser::writeF32Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeF32Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setFloatValue(*((F32*)val_ptr)); @@ -801,14 +839,16 @@ bool LLXUIParser::writeF32Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readF64Value(void* val_ptr) +bool LLXUIParser::readF64Value(Parser& parser, void* val_ptr) { - return mCurReadNode->getDoubleValue(1, (F64*)val_ptr); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode->getDoubleValue(1, (F64*)val_ptr); } -bool LLXUIParser::writeF64Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeF64Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setDoubleValue(*((F64*)val_ptr)); @@ -817,10 +857,11 @@ bool LLXUIParser::writeF64Value(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readColor4Value(void* val_ptr) +bool LLXUIParser::readColor4Value(Parser& parser, void* val_ptr) { + LLXUIParser& self = static_cast<LLXUIParser&>(parser); LLColor4* colorp = (LLColor4*)val_ptr; - if(mCurReadNode->getFloatValue(4, colorp->mV) >= 3) + if(self.mCurReadNode->getFloatValue(4, colorp->mV) >= 3) { return true; } @@ -828,9 +869,10 @@ bool LLXUIParser::readColor4Value(void* val_ptr) return false; } -bool LLXUIParser::writeColor4Value(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeColor4Value(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { LLColor4 color = *((LLColor4*)val_ptr); @@ -840,11 +882,12 @@ bool LLXUIParser::writeColor4Value(const void* val_ptr, const name_stack_t& stac return false; } -bool LLXUIParser::readUIColorValue(void* val_ptr) +bool LLXUIParser::readUIColorValue(Parser& parser, void* val_ptr) { + LLXUIParser& self = static_cast<LLXUIParser&>(parser); LLUIColor* param = (LLUIColor*)val_ptr; LLColor4 color; - bool success = mCurReadNode->getFloatValue(4, color.mV) >= 3; + bool success = self.mCurReadNode->getFloatValue(4, color.mV) >= 3; if (success) { param->set(color); @@ -853,9 +896,10 @@ bool LLXUIParser::readUIColorValue(void* val_ptr) return false; } -bool LLXUIParser::writeUIColorValue(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeUIColorValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { LLUIColor color = *((LLUIColor*)val_ptr); @@ -868,11 +912,12 @@ bool LLXUIParser::writeUIColorValue(const void* val_ptr, const name_stack_t& sta return false; } -bool LLXUIParser::readUUIDValue(void* val_ptr) +bool LLXUIParser::readUUIDValue(Parser& parser, void* val_ptr) { + LLXUIParser& self = static_cast<LLXUIParser&>(parser); LLUUID temp_id; // LLUUID::set is destructive, so use temporary value - if (temp_id.set(mCurReadNode->getSanitizedValue())) + if (temp_id.set(self.mCurReadNode->getSanitizedValue())) { *(LLUUID*)(val_ptr) = temp_id; return true; @@ -880,9 +925,10 @@ bool LLXUIParser::readUUIDValue(void* val_ptr) return false; } -bool LLXUIParser::writeUUIDValue(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeUUIDValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { node->setStringValue(((LLUUID*)val_ptr)->asString()); @@ -891,15 +937,18 @@ bool LLXUIParser::writeUUIDValue(const void* val_ptr, const name_stack_t& stack) return false; } -bool LLXUIParser::readSDValue(void* val_ptr) +bool LLXUIParser::readSDValue(Parser& parser, void* val_ptr) { - *((LLSD*)val_ptr) = LLSD(mCurReadNode->getSanitizedValue()); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + *((LLSD*)val_ptr) = LLSD(self.mCurReadNode->getSanitizedValue()); return true; } -bool LLXUIParser::writeSDValue(const void* val_ptr, const name_stack_t& stack) +bool LLXUIParser::writeSDValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) { - LLXMLNodePtr node = getNode(stack); + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + + LLXMLNodePtr node = self.getNode(stack); if (node.notNull()) { std::string string_val = ((LLSD*)val_ptr)->asString(); @@ -962,3 +1011,438 @@ void LLXUIParser::parserError(const std::string& message) Parser::parserError(message); #endif } + + +// +// LLSimpleXUIParser +// + +struct ScopedFile +{ + ScopedFile( const std::string& filename, const char* accessmode ) + { + mFile = LLFile::fopen(filename, accessmode); + } + + ~ScopedFile() + { + fclose(mFile); + mFile = NULL; + } + + S32 getRemainingBytes() + { + if (!isOpen()) return 0; + + S32 cur_pos = ftell(mFile); + fseek(mFile, 0L, SEEK_END); + S32 file_size = ftell(mFile); + fseek(mFile, cur_pos, SEEK_SET); + return file_size - cur_pos; + } + + bool isOpen() { return mFile != NULL; } + + LLFILE* mFile; +}; +static LLInitParam::Parser::parser_read_func_map_t sSimpleXUIReadFuncs; +static LLInitParam::Parser::parser_write_func_map_t sSimpleXUIWriteFuncs; +static LLInitParam::Parser::parser_inspect_func_map_t sSimpleXUIInspectFuncs; + +LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb) +: Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs), + mLastWriteGeneration(-1), + mCurReadDepth(0), + mElementCB(element_cb) +{ + if (sSimpleXUIReadFuncs.empty()) + { + registerParserFuncs<bool>(readBoolValue); + registerParserFuncs<std::string>(readStringValue); + registerParserFuncs<U8>(readU8Value); + registerParserFuncs<S8>(readS8Value); + registerParserFuncs<U16>(readU16Value); + registerParserFuncs<S16>(readS16Value); + registerParserFuncs<U32>(readU32Value); + registerParserFuncs<S32>(readS32Value); + registerParserFuncs<F32>(readF32Value); + registerParserFuncs<F64>(readF64Value); + registerParserFuncs<LLColor4>(readColor4Value); + registerParserFuncs<LLUIColor>(readUIColorValue); + registerParserFuncs<LLUUID>(readUUIDValue); + registerParserFuncs<LLSD>(readSDValue); + } +} + +LLSimpleXUIParser::~LLSimpleXUIParser() +{ +} + + +bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent) +{ + LLFastTimer timer(FTM_PARSE_XUI); + + mParser = XML_ParserCreate(NULL); + XML_SetUserData(mParser, this); + XML_SetElementHandler( mParser, startElementHandler, endElementHandler); + XML_SetCharacterDataHandler( mParser, characterDataHandler); + + mOutputStack.push_back(std::make_pair(&block, 0)); + mNameStack.clear(); + mCurFileName = filename; + mCurReadDepth = 0; + setParseSilently(silent); + + ScopedFile file(filename, "rb"); + if( !file.isOpen() ) + { + LL_WARNS("ReadXUI") << "Unable to open file " << filename << LL_ENDL; + return false; + } + + S32 bytes_read = 0; + + S32 buffer_size = file.getRemainingBytes(); + void* buffer = XML_GetBuffer(mParser, buffer_size); + if( !buffer ) + { + LL_WARNS("ReadXUI") << "Unable to allocate XML buffer while reading file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + bytes_read = (S32)fread(buffer, 1, buffer_size, file.mFile); + if( bytes_read <= 0 ) + { + LL_WARNS("ReadXUI") << "Error while reading file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) ) + { + LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL; + XML_ParserFree( mParser ); + return false; + } + + XML_ParserFree( mParser ); + return true; +} + +void LLSimpleXUIParser::startElementHandler(void *userData, const char *name, const char **atts) +{ + LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData); + self->startElement(name, atts); +} + +void LLSimpleXUIParser::endElementHandler(void *userData, const char *name) +{ + LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData); + self->endElement(name); +} + +void LLSimpleXUIParser::characterDataHandler(void *userData, const char *s, int len) +{ + LLSimpleXUIParser* self = reinterpret_cast<LLSimpleXUIParser*>(userData); + self->characterData(s, len); +} + +void LLSimpleXUIParser::startElement(const char *name, const char **atts) +{ + processText(); + + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("."); + + if (mElementCB) + { + LLInitParam::BaseBlock* blockp = mElementCB(*this, name); + if (blockp) + { + mOutputStack.push_back(std::make_pair(blockp, 0)); + } + } + + mOutputStack.back().second++; + S32 num_tokens_pushed = 0; + std::string child_name(name); + + if (mOutputStack.back().second == 1) + { // root node for this block + mScope.push_back(child_name); + } + else + { // compound attribute + if (child_name.find(".") == std::string::npos) + { + mNameStack.push_back(std::make_pair(child_name, newParseGeneration())); + num_tokens_pushed++; + mScope.push_back(child_name); + } + else + { + // parse out "dotted" name into individual tokens + tokenizer name_tokens(child_name, sep); + + tokenizer::iterator name_token_it = name_tokens.begin(); + if(name_token_it == name_tokens.end()) + { + return; + } + + // check for proper nesting + if(!mScope.empty() && *name_token_it != mScope.back()) + { + return; + } + + // now ignore first token + ++name_token_it; + + // copy remaining tokens on to our running token list + for(tokenizer::iterator token_to_push = name_token_it; token_to_push != name_tokens.end(); ++token_to_push) + { + mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration())); + num_tokens_pushed++; + } + mScope.push_back(mNameStack.back().first); + } + } + + mTokenSizeStack.push_back(num_tokens_pushed); + readAttributes(atts); +} + +bool LLSimpleXUIParser::readAttributes(const char **atts) +{ + typedef boost::tokenizer<boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("."); + + bool any_parsed = false; + for(S32 i = 0; atts[i] && atts[i+1]; i += 2 ) + { + std::string attribute_name(atts[i]); + mCurAttributeValueBegin = atts[i+1]; + + S32 num_tokens_pushed = 0; + tokenizer name_tokens(attribute_name, sep); + // copy remaining tokens on to our running token list + for(tokenizer::iterator token_to_push = name_tokens.begin(); token_to_push != name_tokens.end(); ++token_to_push) + { + mNameStack.push_back(std::make_pair(*token_to_push, newParseGeneration())); + num_tokens_pushed++; + } + + // child nodes are not necessarily valid attributes, so don't complain once we've recursed + any_parsed |= mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + + while(num_tokens_pushed-- > 0) + { + mNameStack.pop_back(); + } + } + return any_parsed; +} + +void LLSimpleXUIParser::processText() +{ + if (!mTextContents.empty()) + { + LLStringUtil::trim(mTextContents); + if (!mTextContents.empty()) + { + mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration())); + mCurAttributeValueBegin = mTextContents.c_str(); + mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + mNameStack.pop_back(); + } + mTextContents.clear(); + } +} + +void LLSimpleXUIParser::endElement(const char *name) +{ + processText(); + + if (--mOutputStack.back().second == 0) + { + if (mOutputStack.empty()) + { + LL_ERRS("ReadXUI") << "Parameter block output stack popped while empty." << LL_ENDL; + } + mOutputStack.pop_back(); + } + + S32 num_tokens_to_pop = mTokenSizeStack.back(); + mTokenSizeStack.pop_back(); + while(num_tokens_to_pop-- > 0) + { + mNameStack.pop_back(); + } + mScope.pop_back(); +} + +void LLSimpleXUIParser::characterData(const char *s, int len) +{ + mTextContents += std::string(s, len); +} + + +/*virtual*/ std::string LLSimpleXUIParser::getCurrentElementName() +{ + std::string full_name; + for (name_stack_t::iterator it = mNameStack.begin(); + it != mNameStack.end(); + ++it) + { + full_name += it->first + "."; // build up dotted names: "button.param.nestedparam." + } + + return full_name; +} + +const S32 LINE_NUMBER_HERE = 0; + +void LLSimpleXUIParser::parserWarning(const std::string& message) +{ +#ifdef LL_WINDOWS + // use Visual Studo friendly formatting of output message for easy access to originating xml + llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str()); + utf16str += '\n'; + OutputDebugString(utf16str.c_str()); +#else + Parser::parserWarning(message); +#endif +} + +void LLSimpleXUIParser::parserError(const std::string& message) +{ +#ifdef LL_WINDOWS + llutf16string utf16str = utf8str_to_utf16str(llformat("%s(%d):\t%s", mCurFileName.c_str(), LINE_NUMBER_HERE, message.c_str()).c_str()); + utf16str += '\n'; + OutputDebugString(utf16str.c_str()); +#else + Parser::parserError(message); +#endif +} + +bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + if (!strcmp(self.mCurAttributeValueBegin, "true")) + { + *((bool*)val_ptr) = true; + return true; + } + else if (!strcmp(self.mCurAttributeValueBegin, "false")) + { + *((bool*)val_ptr) = false; + return true; + } + + return false; +} + +bool LLSimpleXUIParser::readStringValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + *((std::string*)val_ptr) = self.mCurAttributeValueBegin; + return true; +} + +bool LLSimpleXUIParser::readU8Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U8*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS8Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S8*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readU16Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U16*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS16Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S16*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readU32Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, uint_p[assign_a(*(U32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readS32Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, int_p[assign_a(*(S32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readF32Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F32*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readF64Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return parse(self.mCurAttributeValueBegin, real_p[assign_a(*(F64*)val_ptr)]).full; +} + +bool LLSimpleXUIParser::readColor4Value(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + LLColor4 value; + + if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full) + { + *(LLColor4*)(val_ptr) = value; + return true; + } + return false; +} + +bool LLSimpleXUIParser::readUIColorValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + LLColor4 value; + LLUIColor* colorp = (LLUIColor*)val_ptr; + + if (parse(self.mCurAttributeValueBegin, real_p[assign_a(value.mV[0])] >> real_p[assign_a(value.mV[1])] >> real_p[assign_a(value.mV[2])] >> real_p[assign_a(value.mV[3])], space_p).full) + { + colorp->set(value); + return true; + } + return false; +} + +bool LLSimpleXUIParser::readUUIDValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + LLUUID temp_id; + // LLUUID::set is destructive, so use temporary value + if (temp_id.set(std::string(self.mCurAttributeValueBegin))) + { + *(LLUUID*)(val_ptr) = temp_id; + return true; + } + return false; +} + +bool LLSimpleXUIParser::readSDValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + *((LLSD*)val_ptr) = LLSD(self.mCurAttributeValueBegin); + return true; +} diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 30b7e8c356..5c613b0c69 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -96,14 +96,12 @@ public: -class LLXUIParser : public LLInitParam::Parser, public LLSingleton<LLXUIParser> +class LLXUIParser : public LLInitParam::Parser { LOG_CLASS(LLXUIParser); -protected: - LLXUIParser(); - friend class LLSingleton<LLXUIParser>; public: + LLXUIParser(); typedef LLInitParam::Parser::name_stack_t name_stack_t; /*virtual*/ std::string getCurrentElementName(); @@ -114,42 +112,40 @@ public: void writeXUI(LLXMLNodePtr node, const LLInitParam::BaseBlock& block, const LLInitParam::BaseBlock* diff_block = NULL); private: - typedef std::list<std::pair<std::string, bool> > token_list_t; - - bool readXUIImpl(LLXMLNodePtr node, const std::string& scope, LLInitParam::BaseBlock& block); + bool readXUIImpl(LLXMLNodePtr node, LLInitParam::BaseBlock& block); bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block); //reader helper functions - bool readBoolValue(void* val_ptr); - bool readStringValue(void* val_ptr); - bool readU8Value(void* val_ptr); - bool readS8Value(void* val_ptr); - bool readU16Value(void* val_ptr); - bool readS16Value(void* val_ptr); - bool readU32Value(void* val_ptr); - bool readS32Value(void* val_ptr); - bool readF32Value(void* val_ptr); - bool readF64Value(void* val_ptr); - bool readColor4Value(void* val_ptr); - bool readUIColorValue(void* val_ptr); - bool readUUIDValue(void* val_ptr); - bool readSDValue(void* val_ptr); + static bool readBoolValue(Parser& parser, void* val_ptr); + static bool readStringValue(Parser& parser, void* val_ptr); + static bool readU8Value(Parser& parser, void* val_ptr); + static bool readS8Value(Parser& parser, void* val_ptr); + static bool readU16Value(Parser& parser, void* val_ptr); + static bool readS16Value(Parser& parser, void* val_ptr); + static bool readU32Value(Parser& parser, void* val_ptr); + static bool readS32Value(Parser& parser, void* val_ptr); + static bool readF32Value(Parser& parser, void* val_ptr); + static bool readF64Value(Parser& parser, void* val_ptr); + static bool readColor4Value(Parser& parser, void* val_ptr); + static bool readUIColorValue(Parser& parser, void* val_ptr); + static bool readUUIDValue(Parser& parser, void* val_ptr); + static bool readSDValue(Parser& parser, void* val_ptr); //writer helper functions - bool writeBoolValue(const void* val_ptr, const name_stack_t&); - bool writeStringValue(const void* val_ptr, const name_stack_t&); - bool writeU8Value(const void* val_ptr, const name_stack_t&); - bool writeS8Value(const void* val_ptr, const name_stack_t&); - bool writeU16Value(const void* val_ptr, const name_stack_t&); - bool writeS16Value(const void* val_ptr, const name_stack_t&); - bool writeU32Value(const void* val_ptr, const name_stack_t&); - bool writeS32Value(const void* val_ptr, const name_stack_t&); - bool writeF32Value(const void* val_ptr, const name_stack_t&); - bool writeF64Value(const void* val_ptr, const name_stack_t&); - bool writeColor4Value(const void* val_ptr, const name_stack_t&); - bool writeUIColorValue(const void* val_ptr, const name_stack_t&); - bool writeUUIDValue(const void* val_ptr, const name_stack_t&); - bool writeSDValue(const void* val_ptr, const name_stack_t&); + static bool writeBoolValue(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeStringValue(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeU8Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeS8Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeU16Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeS16Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeU32Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeS32Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeF32Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeF64Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeColor4Value(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeUIColorValue(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeUUIDValue(Parser& parser, const void* val_ptr, const name_stack_t&); + static bool writeSDValue(Parser& parser, const void* val_ptr, const name_stack_t&); LLXMLNodePtr getNode(const name_stack_t& stack); @@ -165,6 +161,78 @@ private: LLXMLNodePtr mLastWrittenChild; S32 mCurReadDepth; std::string mCurFileName; + std::string mRootNodeName; +}; + +// LLSimpleXUIParser is a streamlined SAX-based XUI parser that does not support localization +// or parsing of a tree of independent param blocks, such as child widgets. +// Use this for reading non-localized files that only need a single param block as a result. +// +// NOTE: In order to support nested block parsing, we need callbacks for start element that +// push new blocks contexts on the mScope stack. +// NOTE: To support localization without building a DOM, we need to enforce consistent +// ordering of child elements from base file to localized diff file. Then we can use a pair +// of coroutines to perform matching of xml nodes during parsing. Not sure if the overhead +// of coroutines would offset the gain from SAX parsing + +class LLSimpleXUIParser : public LLInitParam::Parser +{ +LOG_CLASS(LLSimpleXUIParser); +public: + typedef LLInitParam::Parser::name_stack_t name_stack_t; + typedef LLInitParam::BaseBlock* (*element_start_callback_t)(LLSimpleXUIParser&, const char* block_name); + + LLSimpleXUIParser(element_start_callback_t element_cb = NULL); + virtual ~LLSimpleXUIParser(); + + /*virtual*/ std::string getCurrentElementName(); + /*virtual*/ void parserWarning(const std::string& message); + /*virtual*/ void parserError(const std::string& message); + + bool readXUI(const std::string& filename, LLInitParam::BaseBlock& block, bool silent=false); + + +private: + //reader helper functions + static bool readBoolValue(Parser&, void* val_ptr); + static bool readStringValue(Parser&, void* val_ptr); + static bool readU8Value(Parser&, void* val_ptr); + static bool readS8Value(Parser&, void* val_ptr); + static bool readU16Value(Parser&, void* val_ptr); + static bool readS16Value(Parser&, void* val_ptr); + static bool readU32Value(Parser&, void* val_ptr); + static bool readS32Value(Parser&, void* val_ptr); + static bool readF32Value(Parser&, void* val_ptr); + static bool readF64Value(Parser&, void* val_ptr); + static bool readColor4Value(Parser&, void* val_ptr); + static bool readUIColorValue(Parser&, void* val_ptr); + static bool readUUIDValue(Parser&, void* val_ptr); + static bool readSDValue(Parser&, void* val_ptr); + +private: + static void startElementHandler(void *userData, const char *name, const char **atts); + static void endElementHandler(void *userData, const char *name); + static void characterDataHandler(void *userData, const char *s, int len); + + void startElement(const char *name, const char **atts); + void endElement(const char *name); + void characterData(const char *s, int len); + bool readAttributes(const char **atts); + void processText(); + + Parser::name_stack_t mNameStack; + struct XML_ParserStruct* mParser; + S32 mLastWriteGeneration; + LLXMLNodePtr mLastWrittenChild; + S32 mCurReadDepth; + std::string mCurFileName; + std::string mTextContents; + const char* mCurAttributeValueBegin; + std::vector<S32> mTokenSizeStack; + std::vector<std::string> mScope; + element_start_callback_t mElementCB; + + std::vector<std::pair<LLInitParam::BaseBlock*, S32> > mOutputStack; }; diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp index 18c2028138..967c69fea9 100644 --- a/indra/lscript/lscript_library/lscript_library.cpp +++ b/indra/lscript/lscript_library/lscript_library.cpp @@ -448,6 +448,18 @@ void LLScriptLibrary::init() addFunction(10.f, 1.0f, dummy_func, "llSetPrimMediaParams", "i", "il"); addFunction(10.f, 1.0f, dummy_func, "llGetPrimMediaParams", "l", "il"); addFunction(10.f, 1.0f, dummy_func, "llClearPrimMedia", "i", "i"); + addFunction(10.f, 0.f, dummy_func, "llSetLinkPrimitiveParamsFast", NULL, "il"); + addFunction(10.f, 0.f, dummy_func, "llGetLinkPrimitiveParams", "l", "il"); + addFunction(10.f, 0.f, dummy_func, "llLinkParticleSystem", NULL, "il"); + addFunction(10.f, 0.f, dummy_func, "llSetLinkTextureAnim", NULL, "iiiiifff"); + + addFunction(10.f, 0.f, dummy_func, "llGetLinkNumberOfSides", "i", "i"); + + // IDEVO Name lookup calls, see lscript_avatar_names.h + addFunction(10.f, 0.f, dummy_func, "llGetUsername", "s", "k"); + addFunction(10.f, 0.f, dummy_func, "llRequestUsername", "k", "k"); + addFunction(10.f, 0.f, dummy_func, "llGetDisplayName", "s", "k"); + addFunction(10.f, 0.f, dummy_func, "llRequestDisplayName", "k", "k"); // energy, sleep, dummy_func, name, return type, parameters, help text, gods-only diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp index e4d100d1ec..23980ffac2 100644 --- a/indra/mac_updater/mac_updater.cpp +++ b/indra/mac_updater/mac_updater.cpp @@ -61,6 +61,7 @@ Boolean gCancelled = false; const char *gUpdateURL; const char *gProductName; +const char *gBundleID; void *updatethreadproc(void*); @@ -329,6 +330,10 @@ int parse_args(int argc, char **argv) { gProductName = argv[j]; } + else if ((!strcmp(argv[j], "-bundleid")) && (++j < argc)) + { + gBundleID = argv[j]; + } } return 0; @@ -355,6 +360,7 @@ int main(int argc, char **argv) // gUpdateURL = NULL; gProductName = NULL; + gBundleID = NULL; parse_args(argc, argv); if (!gUpdateURL) { @@ -372,6 +378,14 @@ int main(int argc, char **argv) { gProductName = "Second Life"; } + if (gBundleID) + { + llinfos << "Bundle ID is: " << gBundleID << llendl; + } + else + { + gBundleID = "com.secondlife.indra.viewer"; + } } llinfos << "Starting " << gProductName << " Updater" << llendl; @@ -592,7 +606,8 @@ static bool isFSRefViewerBundle(FSRef *targetRef) CFURLRef targetURL = NULL; CFBundleRef targetBundle = NULL; CFStringRef targetBundleID = NULL; - + CFStringRef sourceBundleID = NULL; + targetURL = CFURLCreateFromFSRef(NULL, targetRef); if(targetURL == NULL) @@ -619,7 +634,8 @@ static bool isFSRefViewerBundle(FSRef *targetRef) } else { - if(CFStringCompare(targetBundleID, CFSTR("com.secondlife.indra.viewer"), 0) == kCFCompareEqualTo) + sourceBundleID = CFStringCreateWithCString(NULL, gBundleID, kCFStringEncodingUTF8); + if(CFStringCompare(sourceBundleID, targetBundleID, 0) == kCFCompareEqualTo) { // This is the bundle we're looking for. result = true; diff --git a/indra/media_plugins/base/CMakeLists.txt b/indra/media_plugins/base/CMakeLists.txt index f8d2dabc6c..3ad94b0c64 100644 --- a/indra/media_plugins/base/CMakeLists.txt +++ b/indra/media_plugins/base/CMakeLists.txt @@ -25,6 +25,14 @@ include_directories( ### media_plugin_base +if(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + add_definitions(/FIXED:NO) + else(WINDOWS) # not windows therefore gcc LINUX and DARWIN + add_definitions(-fPIC) + endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + set(media_plugin_base_SOURCE_FILES media_plugin_base.cpp ) diff --git a/indra/media_plugins/example/CMakeLists.txt b/indra/media_plugins/example/CMakeLists.txt index 4d82f2747c..56cefde4bd 100644 --- a/indra/media_plugins/example/CMakeLists.txt +++ b/indra/media_plugins/example/CMakeLists.txt @@ -29,6 +29,14 @@ include_directories( ### media_plugin_example +if(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + add_definitions(/FIXED:NO) + else(WINDOWS) # not windows therefore gcc LINUX and DARWIN + add_definitions(-fPIC) + endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + set(media_plugin_example_SOURCE_FILES media_plugin_example.cpp ) diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt index 9f0ff654fc..5786bd1e25 100644 --- a/indra/media_plugins/gstreamer010/CMakeLists.txt +++ b/indra/media_plugins/gstreamer010/CMakeLists.txt @@ -30,6 +30,14 @@ include_directories( ### media_plugin_gstreamer010 +if(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + add_definitions(/FIXED:NO) + else(WINDOWS) # not windows therefore gcc LINUX and DARWIN + add_definitions(-fPIC) + endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + set(media_plugin_gstreamer010_SOURCE_FILES media_plugin_gstreamer010.cpp llmediaimplgstreamer_syms.cpp @@ -42,13 +50,6 @@ set(media_plugin_gstreamer010_HEADER_FILES llmediaimplgstreamertriviallogging.h ) -if (${CXX_VERSION_NUMBER} MATCHES "4[23456789].") - # Work around a bad interaction between broken gstreamer headers and - # g++ >= 4.2's increased strictness. - set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES - COMPILE_FLAGS -Wno-write-strings) -endif (${CXX_VERSION_NUMBER} MATCHES "4[23456789].") - add_library(media_plugin_gstreamer010 SHARED ${media_plugin_gstreamer010_SOURCE_FILES} diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp index a51a8aa9e1..cdb7f4faeb 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp @@ -48,7 +48,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_slvideo_debug); #define SLV_ALLCAPS GST_VIDEO_CAPS_RGBx SLV_SIZECAPS static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ( - "sink", + (gchar*)"sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS (SLV_ALLCAPS) @@ -508,18 +508,18 @@ plugin_init (GstPlugin * plugin) some g++ versions buggily avoid __attribute__((constructor)) functions - so we provide an explicit plugin init function. */ +#define PACKAGE (gchar*)"packagehack" +// this macro quietly refers to PACKAGE internally +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + (gchar*)"private-slvideoplugin", + (gchar*)"SL Video sink plugin", + plugin_init, (gchar*)"1.0", (gchar*)"LGPL", + (gchar*)"Second Life", + (gchar*)"http://www.secondlife.com/"); +#undef PACKAGE void gst_slvideo_init_class (void) { -#define PACKAGE "packagehack" - // this macro quietly refers to PACKAGE internally - static GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "private-slvideoplugin", - "SL Video sink plugin", - plugin_init, "0.1", GST_LICENSE_UNKNOWN, - "Second Life", - "http://www.secondlife.com/"); -#undef PACKAGE ll_gst_plugin_register_static (&gst_plugin_desc); DEBUGMSG("CLASS INIT"); } diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt index d576638dd7..05f1236606 100644 --- a/indra/media_plugins/webkit/CMakeLists.txt +++ b/indra/media_plugins/webkit/CMakeLists.txt @@ -32,6 +32,14 @@ include_directories( ### media_plugin_webkit +if(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + add_definitions(/FIXED:NO) + else(WINDOWS) # not windows therefore gcc LINUX and DARWIN + add_definitions(-fPIC) + endif(WINDOWS) +endif(NOT WORD_SIZE EQUAL 32) + set(media_plugin_webkit_SOURCE_FILES media_plugin_webkit.cpp ) @@ -51,9 +59,11 @@ set(media_plugin_webkit_LINK_LIBRARIES # Select which VolumeCatcher implementation to use if (LINUX) - if (PULSEAUDIO) + if (PULSEAUDIO_FOUND) list(APPEND media_plugin_webkit_SOURCE_FILES linux_volume_catcher.cpp) - endif (PULSEAUDIO) + else (PULSEAUDIO_FOUND) + list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp) + endif (PULSEAUDIO_FOUND) list(APPEND media_plugin_webkit_LINK_LIBRARIES ${UI_LIBRARIES} # for glib/GTK ) @@ -67,9 +77,6 @@ elseif (DARWIN) ) elseif (WINDOWS) list(APPEND media_plugin_webkit_SOURCE_FILES windows_volume_catcher.cpp) -else (LINUX) - # All other platforms use the dummy volume catcher for now. - list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp) endif (LINUX) set_source_files_properties(${media_plugin_webkit_HEADER_FILES} diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 047146f8f3..bd1a44a930 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -115,6 +115,7 @@ private: F32 mBackgroundR; F32 mBackgroundG; F32 mBackgroundB; + std::string mTarget; VolumeCatcher mVolumeCatcher; @@ -303,7 +304,7 @@ private: LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled ); // create single browser window - mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight ); + mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight, mTarget); // tell LLQtWebKit about the size of the browser window LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight ); @@ -313,9 +314,6 @@ private: // append details to agent string LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent ); - - // Set up window open behavior - LLQtWebKit::getInstance()->setWindowOpenBehavior(mBrowserWindowId, LLQtWebKit::WOB_SIMULATE_BLANK_HREF_CLICK); #if !LL_QTWEBKIT_USES_PIXMAPS // don't flip bitmap @@ -507,9 +505,9 @@ private: void onClickLinkHref(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_href"); - message.setValue("uri", event.getStringValue()); - message.setValue("target", event.getStringValue2()); - message.setValueU32("target_type", event.getLinkType()); + message.setValue("uri", event.getEventUri()); + message.setValue("target", event.getStringValue()); + message.setValue("uuid", event.getStringValue2()); sendMessage(message); } @@ -518,7 +516,7 @@ private: void onClickLinkNoFollow(const EventType& event) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "click_nofollow"); - message.setValue("uri", event.getStringValue()); + message.setValue("uri", event.getEventUri()); sendMessage(message); } @@ -534,6 +532,42 @@ private: // message.setValueBoolean("dead", (event.getIntValue() != 0)) sendMessage(message); } + + //////////////////////////////////////////////////////////////////////////////// + // virtual + void onWindowCloseRequested(const EventType& event) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "close_request"); + message.setValue("uuid", event.getStringValue()); + sendMessage(message); + } + + //////////////////////////////////////////////////////////////////////////////// + // virtual + void onWindowGeometryChangeRequested(const EventType& event) + { + int x, y, width, height; + event.getRectValue(x, y, width, height); + + // This sometimes gets called with a zero-size request. Don't pass these along. + if(width > 0 && height > 0) + { + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "geometry_change"); + message.setValue("uuid", event.getStringValue()); + message.setValueS32("x", x); + message.setValueS32("y", y); + message.setValueS32("width", width); + message.setValueS32("height", height); + sendMessage(message); + } + } + + //////////////////////////////////////////////////////////////////////////////// + // virtual + std::string onRequestFilePicker( const EventType& eventIn ) + { + return blockingPickFile(); + } LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers) { @@ -679,6 +713,26 @@ private: } } + + std::string mPickedFile; + + std::string blockingPickFile(void) + { + mPickedFile.clear(); + + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "pick_file"); + message.setValueBoolean("blocking_request", true); + + // The "blocking_request" key in the message means this sendMessage call will block until a response is received. + sendMessage(message); + + return mPickedFile; + } + + void onPickFileResponse(const std::string &file) + { + mPickedFile = file; + } }; @@ -817,6 +871,8 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) { if(message_name == "init") { + mTarget = message_in.getValue("target"); + // This is the media init message -- all necessary data for initialization should have been received. if(initBrowser()) { @@ -1036,10 +1092,14 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) LLQtWebKit::getInstance()->userAction( mBrowserWindowId, LLQtWebKit::UA_EDIT_PASTE ); checkEditState(); } + if(message_name == "pick_file_response") + { + onPickFileResponse(message_in.getValue("file")); + } else { // std::cerr << "MediaPluginWebKit::receiveMessage: unknown media message: " << message_string << std::endl; - }; + } } else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER) { @@ -1139,6 +1199,17 @@ void MediaPluginWebKit::receiveMessage(const char *message_string) } } } + else if(message_name == "proxy_window_opened") + { + std::string target = message_in.getValue("target"); + std::string uuid = message_in.getValue("uuid"); + LLQtWebKit::getInstance()->proxyWindowOpened(mBrowserWindowId, target, uuid); + } + else if(message_name == "proxy_window_closed") + { + std::string uuid = message_in.getValue("uuid"); + LLQtWebKit::getInstance()->proxyWindowClosed(mBrowserWindowId, uuid); + } else { // std::cerr << "MediaPluginWebKit::receiveMessage: unknown media_browser message: " << message_string << std::endl; diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 382bbaeba1..5647418619 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -94,6 +94,7 @@ set(viewer_SOURCE_FILES llbottomtray.cpp llbox.cpp llbreadcrumbview.cpp + llbrowsernotification.cpp llbuycurrencyhtml.cpp llcallbacklist.cpp llcallfloater.cpp @@ -139,10 +140,10 @@ set(viewer_SOURCE_FILES lldriverparam.cpp lldynamictexture.cpp llemote.cpp - lleventinfo.cpp lleventnotifier.cpp lleventpoll.cpp llexpandabletextbox.cpp + llexternaleditor.cpp llface.cpp llfasttimerview.cpp llfavoritesbar.cpp @@ -168,6 +169,7 @@ set(viewer_SOURCE_FILES llfloatercamera.cpp llfloatercolorpicker.cpp llfloaterdaycycle.cpp + llfloaterdisplayname.cpp llfloaterenvsettings.cpp llfloaterevent.cpp llfloaterfonttest.cpp @@ -199,6 +201,7 @@ set(viewer_SOURCE_FILES llfloaterpostprocess.cpp llfloaterpreference.cpp llfloaterproperties.cpp + llfloaterregiondebugconsole.cpp llfloaterregioninfo.cpp llfloaterreporter.cpp llfloaterscriptdebug.cpp @@ -216,7 +219,6 @@ set(viewer_SOURCE_FILES llfloatertos.cpp llfloateruipreview.cpp llfloaterurlentry.cpp - llfloatervoicedevicesettings.cpp llfloatervoiceeffect.cpp llfloaterwater.cpp llfloaterwhitelistentry.cpp @@ -234,6 +236,7 @@ set(viewer_SOURCE_FILES llgroupiconctrl.cpp llgrouplist.cpp llgroupmgr.cpp + llhints.cpp llhomelocationresponder.cpp llhudeffect.cpp llhudeffectbeam.cpp @@ -242,6 +245,7 @@ set(viewer_SOURCE_FILES llhudeffecttrail.cpp llhudicon.cpp llhudmanager.cpp + llhudnametag.cpp llhudobject.cpp llhudrender.cpp llhudtext.cpp @@ -288,7 +292,6 @@ set(viewer_SOURCE_FILES llmediadataclient.cpp llmemoryview.cpp llmenucommands.cpp - llmetricperformancetester.cpp llmimetypes.cpp llmorphview.cpp llmoveview.cpp @@ -304,6 +307,7 @@ set(viewer_SOURCE_FILES llnotificationalerthandler.cpp llnotificationgrouphandler.cpp llnotificationhandlerutil.cpp + llnotificationhinthandler.cpp llnotificationmanager.cpp llnotificationofferhandler.cpp llnotificationscripthandler.cpp @@ -363,6 +367,7 @@ set(viewer_SOURCE_FILES llpaneltiptoast.cpp llpanelvoiceeffect.cpp llpaneltopinfobar.cpp + llpanelvoicedevicesettings.cpp llpanelvolume.cpp llpanelvolumepulldown.cpp llpanelwearing.cpp @@ -440,6 +445,7 @@ set(viewer_SOURCE_FILES lltoastimpanel.cpp lltoastnotifypanel.cpp lltoastpanel.cpp + lltoastscripttextbox.cpp lltool.cpp lltoolbrush.cpp lltoolcomp.cpp @@ -482,6 +488,7 @@ set(viewer_SOURCE_FILES llviewercontrol.cpp llviewercontrollistener.cpp llviewerdisplay.cpp + llviewerdisplayname.cpp llviewerfloaterreg.cpp llviewerfoldertype.cpp llviewergenericmessage.cpp @@ -667,10 +674,10 @@ set(viewer_HEADER_FILES lldriverparam.h lldynamictexture.h llemote.h - lleventinfo.h lleventnotifier.h lleventpoll.h llexpandabletextbox.h + llexternaleditor.h llface.h llfasttimerview.h llfavoritesbar.h @@ -696,6 +703,7 @@ set(viewer_HEADER_FILES llfloatercamera.h llfloatercolorpicker.h llfloaterdaycycle.h + llfloaterdisplayname.h llfloaterenvsettings.h llfloaterevent.h llfloaterfonttest.h @@ -727,6 +735,7 @@ set(viewer_HEADER_FILES llfloaterpostprocess.h llfloaterpreference.h llfloaterproperties.h + llfloaterregiondebugconsole.h llfloaterregioninfo.h llfloaterreporter.h llfloaterscriptdebug.h @@ -744,7 +753,6 @@ set(viewer_HEADER_FILES llfloatertos.h llfloateruipreview.h llfloaterurlentry.h - llfloatervoicedevicesettings.h llfloatervoiceeffect.h llfloaterwater.h llfloaterwhitelistentry.h @@ -762,6 +770,7 @@ set(viewer_HEADER_FILES llgroupiconctrl.h llgrouplist.h llgroupmgr.h + llhints.h llhomelocationresponder.h llhudeffect.h llhudeffectbeam.h @@ -770,6 +779,7 @@ set(viewer_HEADER_FILES llhudeffecttrail.h llhudicon.h llhudmanager.h + llhudnametag.h llhudobject.h llhudrender.h llhudtext.h @@ -816,7 +826,6 @@ set(viewer_HEADER_FILES llmediadataclient.h llmemoryview.h llmenucommands.h - llmetricperformancetester.h llmimetypes.h llmorphview.h llmoveview.h @@ -884,6 +893,7 @@ set(viewer_HEADER_FILES llpanelprofileview.h llpanelteleporthistory.h llpaneltiptoast.h + llpanelvoicedevicesettings.h llpanelvoiceeffect.h llpaneltopinfobar.h llpanelvolume.h @@ -966,6 +976,7 @@ set(viewer_HEADER_FILES lltoastimpanel.h lltoastnotifypanel.h lltoastpanel.h + lltoastscripttextbox.h lltool.h lltoolbrush.h lltoolcomp.h @@ -1009,6 +1020,7 @@ set(viewer_HEADER_FILES llviewercontrol.h llviewercontrollistener.h llviewerdisplay.h + llviewerdisplayname.h llviewerfloaterreg.h llviewerfoldertype.h llviewergenericmessage.h @@ -1309,6 +1321,7 @@ set(viewer_APPSETTINGS_FILES app_settings/cmd_line.xml app_settings/grass.xml app_settings/high_graphics.xml + app_settings/ignorable_dialogs.xml app_settings/keys.ini app_settings/keywords.ini app_settings/logcontrol.xml @@ -1466,6 +1479,9 @@ if (WINDOWS) ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll + ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll + ${SHARED_LIB_STAGING_DIR}/Debug/fmod.dll ${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll ${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll ${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest @@ -1487,7 +1503,6 @@ if (WINDOWS) ${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 ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index 5f143431de..0562cf5480 100644 --- a/indra/newview/app_settings/cmd_line.xml +++ b/indra/newview/app_settings/cmd_line.xml @@ -118,6 +118,8 @@ <map> <key>desc</key> <string>Log metrics for benchmarking</string> + <key>count</key> + <integer>1</integer> <key>map-to</key> <string>LogMetrics</string> </map> @@ -296,7 +298,7 @@ <key>multiple</key> <map> <key>desc</key> - <string>Allow multple viewers.</string> + <string>Allow multiple viewers.</string> <key>map-to</key> <string>AllowMultipleViewers</string> </map> @@ -391,5 +393,13 @@ <string>CrashOnStartup</string> </map> + <key>disablecrashlogger</key> + <map> + <key>desc</key> + <string>Disables the crash logger and lets the OS handle crashes</string> + <key>map-to</key> + <string>DisableCrashLogger</string> + </map> + </map> </llsd> diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index d0e1f62a84..9ddf007ce7 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -1,10 +1,10 @@ <?xml version="1.0" ?> <llsd> <map> - <key>FirstAppearance</key> + <key>FirstInventoryOffer</key> <map> <key>Comment</key> - <string>Enables FirstAppearance warning dialog</string> + <string>Shows hint when a person or object offers resident an inventory item</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -12,120 +12,65 @@ <key>Value</key> <integer>1</integer> </map> - <key>FirstAttach</key> - <map> - <key>Comment</key> - <string>Enables FirstAttach warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstBalanceDecrease</key> - <map> - <key>Comment</key> - <string>Enables FirstBalanceDecrease warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstBalanceIncrease</key> - <map> - <key>Comment</key> - <string>Enables FirstBalanceIncrease warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstBuild</key> - <map> - <key>Comment</key> - <string>Enables FirstBuild warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstDebugMenus</key> - <map> - <key>Comment</key> - <string>Enables FirstDebugMenus warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstFlexible</key> - <map> - <key>Comment</key> - <string>Enables FirstFlexible warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstGoTo</key> - <map> - <key>Comment</key> - <string>Enables FirstGoTo warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstInventory</key> - <map> - <key>Comment</key> - <string>Enables FirstInventory warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstLeftClickNoHit</key> - <map> - <key>Comment</key> - <string>Enables FirstLeftClickNoHit warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstMap</key> - <map> - <key>Comment</key> - <string>Enables FirstMap warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstMedia</key> + <key>FirstNotUseDestinationGuide</key> + <map> + <key>Comment</key> + <string>Shows hint when resident doesn't activate destination guide</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstNotUseSidePanel</key> + <map> + <key>Comment</key> + <string>Shows hint when resident doesn't activate side panel</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstNotMoving</key> + <map> + <key>Comment</key> + <string>Shows hint when resident doesn't move</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstDisplayName</key> + <map> + <key>Comment</key> + <string>Shows hint when edits profile for the first time</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstReceiveLindens</key> + <map> + <key>Comment</key> + <string>Shows hint when resident receives linden dollars</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>FirstOtherChatBeforeUser</key> <map> <key>Comment</key> - <string>Enables FirstMedia warning dialog</string> + <string>Shows hint when someone else chats first</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -155,43 +100,11 @@ <key>Value</key> <integer>1</integer> </map> - <key>FirstSculptedPrim</key> - <map> - <key>Comment</key> - <string>Enables FirstSculptedPrim warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> + <key>FirstSit</key> <map> <key>Comment</key> - <string>Enables FirstSit warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstTeleport</key> - <map> - <key>Comment</key> - <string>Enables FirstTeleport warning dialog</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> - <key>FirstVoice</key> - <map> - <key>Comment</key> - <string>Enables FirstVoice warning dialog</string> + <string>Shows hint when someone sits for the first time</string> <key>Persist</key> <integer>1</integer> <key>Type</key> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0342072b3d..e5845bc947 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -24,6 +24,28 @@ <key>Value</key> <real>300</real> </map> + <key>AdminMenu</key> + <map> + <key>Comment</key> + <string>Enable the debug admin menu from the main menu. Note: This will just allow the menu to be shown; this does not grant admin privileges.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>ActiveFloaterTransparency</key> + <map> + <key>Comment</key> + <string>Transparency of active floaters (floaters that have focus)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.95</real> + </map> <key>AdvanceSnapshot</key> <map> <key>Comment</key> @@ -1150,13 +1172,13 @@ <key>CacheNumberOfRegionsForObjects</key> <map> <key>Comment</key> - <string>Controls number of regions to be cached for objects, ranges from 16 to 128.</string> + <string>Controls number of regions to be cached for objects.</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>U32</string> <key>Value</key> - <integer>128</integer> + <integer>20000</integer> </map> <key>CacheSize</key> <map> @@ -1343,6 +1365,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>LetterKeysFocusChatBar</key> + <map> + <key>Comment</key> + <string>When printable characters keys (possibly with Shift held) are pressed, the chatbar takes focus</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>0</integer> + </map> <key>ChatBubbleOpacity</key> <map> <key>Comment</key> @@ -2567,6 +2600,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableGroupChatPopups</key> + <map> + <key>Comment</key> + <string>Enable Incoming Group Chat Popups</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableIMChatPopups</key> + <map> + <key>Comment</key> + <string>Enable Incoming IM Chat Popups</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>DisplayAvatarAgentTarget</key> <map> <key>Comment</key> @@ -2842,6 +2897,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>EnableUIHints</key> + <map> + <key>Comment</key> + <string>Toggles UI hint popups</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>EnableVoiceChat</key> <map> <key>Comment</key> @@ -2886,6 +2952,17 @@ <key>Value</key> <integer>175</integer> </map> + <key>EventURL</key> + <map> + <key>Comment</key> + <string>URL for Event website, displayed in the event floater</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://events.secondlife.com/viewer/embed/event/</string> + </map> <key>EveryoneCopy</key> <map> <key>Comment</key> @@ -3826,7 +3903,7 @@ <key>Comment</key> <string>URL for the web page to display in the Home side panel</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>String</string> <key>Value</key> @@ -3841,7 +3918,7 @@ <key>Type</key> <string>String</string> <key>Value</key> - <string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> + <string>http://search.secondlife.com/viewer/[CATEGORY]/?q=[QUERY]&p=[AUTH_TOKEN]&r=[MATURITY]&lang=[LANGUAGE]&g=[GODLIKE]&sid=[SESSION_ID]&rid=[REGION_ID]&pid=[PARCEL_ID]&channel=[CHANNEL]&version=[VERSION]&major=[VERSION_MAJOR]&minor=[VERSION_MINOR]&patch=[VERSION_PATCH]&build=[VERSION_BUILD]</string> </map> <key>HighResSnapshot</key> <map> @@ -3931,6 +4008,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>InactiveFloaterTransparency</key> + <map> + <key>Comment</key> + <string>Transparency of inactive floaters (floaters that have no focus)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.5</real> + </map> <key>InBandwidth</key> <map> <key>Comment</key> @@ -4559,6 +4647,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>LogTextureNetworkTraffic</key> + <map> + <key>Comment</key> + <string>Log network traffic for textures</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>LoginAsGod</key> <map> <key>Comment</key> @@ -5219,6 +5318,17 @@ <key>Value</key> <real>3.0</real> </map> + <key>MediaEnablePopups</key> + <map> + <key>Comment</key> + <string>If true, enable targeted links and javascript in media to open new media browser windows without a prompt.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>MediaOnAPrimUI</key> <map> <key>Comment</key> @@ -5750,13 +5860,13 @@ <key>ToastGap</key> <map> <key>Comment</key> - <string>Gap between toasts on a screen</string> + <string>Gap between toasts on a screen (min. value is 5)</string> <key>Persist</key> <integer>1</integer> <key>Type</key> <string>S32</string> <key>Value</key> - <integer>5</integer> + <integer>7</integer> </map> <key>ToastButtonWidth</key> <map> @@ -5860,6 +5970,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ObjectCacheEnabled</key> + <map> + <key>Comment</key> + <string>Enable the object cache.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>OpenDebugStatAdvanced</key> <map> <key>Comment</key> @@ -6480,6 +6601,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>MediaBrowserWindowLimit</key> + <map> + <key>Comment</key> + <string>Maximum number of media brower windows that can be open at once (0 for no limit)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>S32</string> + <key>Value</key> + <integer>5</integer> + </map> <key>MediaRollOffRate</key> <map> <key>Comment</key> @@ -7899,6 +8031,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>RenderHighlightSelections</key> + <map> + <key>Comment</key> + <string>Show selection outlines on objects</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderHiddenSelections</key> <map> <key>Comment</key> @@ -7921,7 +8064,7 @@ <key>Value</key> <integer>0</integer> </map> - <key>RenderShowGroupTitleAll</key> + <key>NameTagShowGroupTitles</key> <map> <key>Comment</key> <string>Show group titles in name labels</string> @@ -7930,6 +8073,39 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> + <integer>0</integer> + </map> + <key>NameTagShowDisplayNames</key> + <map> + <key>Comment</key> + <string>Show display names in name labels</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>NameTagShowFriends</key> + <map> + <key>Comment</key> + <string>Highlight the name tags of your friends</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>NameTagShowUsernames</key> + <map> + <key>Comment</key> + <string>Show usernames in avatar name tags</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> <integer>1</integer> </map> <key>RenderInitError</key> @@ -8175,6 +8351,17 @@ <key>Value</key> <real>1.0</real> </map> + <key>RenderTransparentWater</key> + <map> + <key>Comment</key> + <string>Render water as transparent. Setting to false renders water as opaque with a simple texture applied.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RenderTreeLODFactor</key> <map> <key>Comment</key> @@ -8195,7 +8382,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>RenderUIBuffer</key> <map> @@ -8888,7 +9075,7 @@ <key>Type</key> <string>Boolean</string> <key>Value</key> - <integer>1</integer> + <integer>0</integer> </map> <key>GroupListShowIcons</key> <map> @@ -10991,6 +11178,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>UseDisplayNames</key> + <map> + <key>Comment</key> + <string>Use new, changeable, unicode names</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>UseEnergy</key> <map> <key>Comment</key> @@ -11046,6 +11244,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>SpeakerParticipantDefaultOrder</key> + <map> + <key>Comment</key> + <string>Order for displaying speakers in voice controls. 0 = alphabetical. 1 = recent.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> <key>SpeakerParticipantRemoveDelay</key> <map> <key>Comment</key> @@ -11201,6 +11410,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>InterpolationTime</key> + <map> + <key>Comment</key> + <string>How long to extrapolate object motion after last packet received</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>3.0</integer> + </map> + <key>InterpolationPhaseOut</key> + <map> + <key>Comment</key> + <string>Seconds to phase out interpolated motion</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <integer>1.0</integer> + </map> <key>VerboseLogs</key> <map> <key>Comment</key> @@ -11696,10 +11927,10 @@ <key>Value</key> <real>150000.0</real> </map> - <key>XUIEditor</key> + <key>ExternalEditor</key> <map> <key>Comment</key> - <string>Path to program used to edit XUI files</string> + <string>Path to program used to edit LSL scripts and XUI files, e.g.: /usr/bin/gedit --new-window "%s"</string> <key>Persist</key> <integer>1</integer> <key>Type</key> @@ -12013,5 +12244,49 @@ <key>Value</key> <integer>10</integer> </map> + <key>NotMovingHintTimeout</key> + <map> + <key>Comment</key> + <string>Number of seconds to wait for resident to move before displaying move hint.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>120.0</real> + </map> + <key>DestinationGuideHintTimeout</key> + <map> + <key>Comment</key> + <string>Number of seconds to wait before telling resident about destination guide.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>600.0</real> + </map> + <key>SidePanelHintTimeout</key> + <map> + <key>Comment</key> + <string>Number of seconds to wait before telling resident about side panel.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>300.0</real> + </map> + <key>GroupMembersSortOrder</key> + <map> + <key>Comment</key> + <string>The order by which group members will be sorted (name|donated|online)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>name</string> + </map> </map> </llsd> diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index dc76a4e518..705c73cbf7 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -110,7 +110,17 @@ <key>Value</key> <string>00000000-0000-0000-0000-000000000000</string> </map> - + <key>LogFileNamewithDate</key> + <map> + <key>Comment</key> + <string>Add Date Stamp to chat and IM Logs with format chat-YYYY-MM-DD and 'IM file name'-YYYY-MM. To view old logs goto ..\Second Life\[login name]</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <!-- Settings below are for back compatibility only. They are not used in current viewer anymore. But they can't be removed to avoid influence on previous versions of the viewer in case of settings are not used or default value diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index f8adc15edc..a95abd7dd1 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 23 +version 25 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -42,6 +42,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 @@ -80,6 +81,7 @@ RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 @@ -108,6 +110,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -135,6 +138,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 2 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -144,7 +148,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -162,6 +166,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 2.0 @@ -171,7 +176,7 @@ WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) @@ -553,4 +558,3 @@ list NVIDIA_GeForce_Go_7800 RenderShaderLightingMaxLevel 1 2 list NVIDIA_GeForce_Go_7900 RenderShaderLightingMaxLevel 1 2 - diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 4a99280b06..a52b32355d 100644 --- a/indra/newview/featuretable_linux.txt +++ b/indra/newview/featuretable_linux.txt @@ -42,6 +42,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 @@ -79,6 +80,7 @@ RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 @@ -107,6 +109,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -134,6 +137,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 2 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -143,7 +147,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -161,6 +165,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 2.0 @@ -170,7 +175,7 @@ WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 67cace7268..6dabef53a8 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -43,6 +43,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 3 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 @@ -80,6 +81,7 @@ RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 @@ -107,6 +109,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -133,6 +136,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 2 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -140,7 +144,7 @@ RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -159,6 +163,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 3 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 2.0 @@ -166,7 +171,7 @@ RenderWaterReflections 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index 1e83bc73a5..a09ba17c62 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.txt @@ -1,4 +1,4 @@ -version 23 +version 25 // NOTE: This is mostly identical to featuretable_mac.txt with a few differences // Should be combined into one table @@ -42,6 +42,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVBOEnable 1 1 @@ -80,6 +81,7 @@ RenderObjectBump 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 @@ -108,6 +110,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 0 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 1.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -135,6 +138,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 2 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 0.5 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 1.125 @@ -144,7 +148,7 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -162,6 +166,7 @@ RenderObjectBump 1 1 RenderReflectionDetail 1 4 RenderTerrainDetail 1 1 RenderTerrainLODFactor 1 2.0 +RenderTransparentWater 1 1 RenderTreeLODFactor 1 1.0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 2.0 @@ -171,7 +176,7 @@ WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 +RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index d1cd335783..d5712f80cf 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -52,7 +52,7 @@ LangString LanguageCode ${LANG_JAPANESE} "ja" LangString LanguageCode ${LANG_ITALIAN} "it" LangString LanguageCode ${LANG_KOREAN} "ko" LangString LanguageCode ${LANG_DUTCH} "nl" -LangString LanguageCode ${LANG_POLISH} "da" +LangString LanguageCode ${LANG_POLISH} "pl" LangString LanguageCode ${LANG_PORTUGUESEBR} "pt" LangString LanguageCode ${LANG_SIMPCHINESE} "zh" diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 9350e50305..3a45c79ec3 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -38,6 +38,7 @@ #include "llcallingcard.h" #include "llchannelmanager.h" #include "llconsole.h" +#include "llfirstuse.h" #include "llfloatercamera.h" #include "llfloaterreg.h" #include "llfloatertools.h" @@ -195,8 +196,6 @@ LLAgent::LLAgent() : mbFlagsDirty(FALSE), mbFlagsNeedReset(FALSE), - mbJump(FALSE), - mAutoPilot(FALSE), mAutoPilotFlyOnStop(FALSE), mAutoPilotTargetGlobal(), @@ -228,8 +227,9 @@ LLAgent::LLAgent() : mControlsTakenPassedOnCount[i] = 0; } - mListener.reset(new LLAgentListener(*this)); + + mMoveTimer.stop(); } // Requires gSavedSettings to be initialized. @@ -238,6 +238,8 @@ LLAgent::LLAgent() : //----------------------------------------------------------------------------- void LLAgent::init() { + mMoveTimer.start(); + gSavedSettings.declareBOOL("SlowMotionAnimation", FALSE, "Declared in code", FALSE); gSavedSettings.getControl("SlowMotionAnimation")->getSignal()->connect(boost::bind(&handleSlowMotionAnimation, _2)); @@ -302,6 +304,9 @@ void LLAgent::ageChat() //----------------------------------------------------------------------------- void LLAgent::moveAt(S32 direction, bool reset) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -327,6 +332,9 @@ void LLAgent::moveAt(S32 direction, bool reset) //----------------------------------------------------------------------------- void LLAgent::moveAtNudge(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -349,6 +357,9 @@ void LLAgent::moveAtNudge(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveLeft(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -371,6 +382,9 @@ void LLAgent::moveLeft(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveLeftNudge(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -393,6 +407,9 @@ void LLAgent::moveLeftNudge(S32 direction) //----------------------------------------------------------------------------- void LLAgent::moveUp(S32 direction) { + mMoveTimer.reset(); + LLFirstUse::notMoving(false); + // age chat timer so it fades more quickly when you are intentionally moving ageChat(); @@ -538,6 +555,9 @@ void LLAgent::toggleFlying() { BOOL fly = !gAgent.getFlying(); + gAgent.mMoveTimer.reset(); + LLFirstUse::notMoving(false); + gAgent.setFlying( fly ); gAgentCamera.resetView(); } @@ -1535,6 +1555,11 @@ void LLAgent::propagate(const F32 dt) //----------------------------------------------------------------------------- void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32 mouse_x, const S32 mouse_y) { + if (mMoveTimer.getStarted() && mMoveTimer.getElapsedTimeF32() > gSavedSettings.getF32("NotMovingHintTimeout")) + { + LLFirstUse::notMoving(); + } + propagate(dt); // static S32 cameraUpdateCount = 0; @@ -2963,12 +2988,6 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **) total_count++; } } - - // Any control taken? If so, might be first time. - //if (total_count > 0) - //{ - //LLFirstUse::useOverrideKeys(); - //} } else { @@ -3432,16 +3451,16 @@ void LLAgent::setTeleportState(ETeleportState state) break; case TELEPORT_MOVING: - // We're outa here. Save "back" slurl. - LLAgentUI::buildSLURL(mTeleportSourceSLURL); + // We're outa here. Save "back" slurl. + LLAgentUI::buildSLURL(mTeleportSourceSLURL); break; 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()); + // 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: diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 30685461b9..6c598d5d71 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -264,6 +264,7 @@ public: private: LLFrameTimer mFidgetTimer; LLFrameTimer mFocusObjectFadeTimer; + LLFrameTimer mMoveTimer; F32 mNextFidgetTime; S32 mCurrentFidget; @@ -360,14 +361,6 @@ private: BOOL mIsBusy; //-------------------------------------------------------------------- - // Jump - //-------------------------------------------------------------------- -public: - BOOL getJump() const { return mbJump; } -private: - BOOL mbJump; - - //-------------------------------------------------------------------- // Grab //-------------------------------------------------------------------- public: diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 68e408d3e4..7c953cd2dc 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -296,8 +296,11 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera) LLSelectMgr::getInstance()->deselectAll(); } - // Hide all popup menus - gMenuHolder->hideMenus(); + if (gMenuHolder != NULL) + { + // Hide all popup menus + gMenuHolder->hideMenus(); + } } if (change_camera && !gSavedSettings.getBOOL("FreezeTime")) diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp index f52f136118..b9ec304b7e 100644 --- a/indra/newview/llagentui.cpp +++ b/indra/newview/llagentui.cpp @@ -40,29 +40,6 @@ #include "llslurl.h" //static -void LLAgentUI::buildName(std::string& name) -{ - name.clear(); - if (isAgentAvatarValid()) - { - LLNameValue *first_nv = gAgentAvatarp->getNVPair("FirstName"); - LLNameValue *last_nv = gAgentAvatarp->getNVPair("LastName"); - if (first_nv && last_nv) - { - name = first_nv->printData() + " " + last_nv->printData(); - } - else - { - llwarns << "Agent is missing FirstName and/or LastName nv pair." << llendl; - } - } - else - { - name = gSavedSettings.getString("FirstName") + " " + gSavedSettings.getString("LastName"); - } -} - -//static void LLAgentUI::buildFullname(std::string& name) { if (isAgentAvatarValid()) diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h index afc0ba5d9a..dda5dc1fd1 100644 --- a/indra/newview/llagentui.h +++ b/indra/newview/llagentui.h @@ -41,7 +41,6 @@ public: LOCATION_FORMAT_FULL, // Parcel, Region (x, y, z) - Maturity }; - static void buildName(std::string& name); static void buildFullname(std::string &name); static void buildSLURL(LLSLURL& slurl, const bool escaped = true); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ed5e8ceee3..4e0bfb2e22 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2204,12 +2204,11 @@ void LLAppearanceMgr::updateIsDirty() base_outfit = catp->getUUID(); } - if(base_outfit.isNull()) - { - // no outfit link found, display "unsaved outfit" - mOutfitIsDirty = true; - } - else + // Set dirty to "false" if no base outfit found to disable "Save" + // and leave only "Save As" enabled in My Outfits. + mOutfitIsDirty = false; + + if (base_outfit.notNull()) { LLIsOfAssetType collector = LLIsOfAssetType(LLAssetType::AT_LINK); @@ -2248,8 +2247,6 @@ void LLAppearanceMgr::updateIsDirty() return; } } - - mOutfitIsDirty = false; } } @@ -2440,6 +2437,12 @@ public: virtual ~LLShowCreatedOutfit() { + if (!LLApp::isRunning()) + { + llwarns << "called during shutdown, skipping" << llendl; + return; + } + LLSD key; //EXT-7727. For new accounts LLShowCreatedOutfit is created during login process @@ -2635,6 +2638,7 @@ void LLAppearanceMgr::dumpItemArray(const LLInventoryModel::item_array_t& items, LLAppearanceMgr::LLAppearanceMgr(): mAttachmentInvLinkEnabled(false), mOutfitIsDirty(false), + mOutfitLocked(false), mIsInUpdateAppearanceFromCOF(false) { LLOutfitObserver& outfit_observer = LLOutfitObserver::instance(); diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 92a9b83bc5..f66663891d 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -30,6 +30,7 @@ // Viewer includes #include "llversioninfo.h" +#include "llversionviewer.h" #include "llfeaturemanager.h" #include "lluictrlfactory.h" #include "lltexteditor.h" @@ -84,6 +85,7 @@ #include "llsecondlifeurls.h" // Linden library includes +#include "llavatarnamecache.h" #include "llimagej2c.h" #include "llmemory.h" #include "llprimitive.h" @@ -156,7 +158,6 @@ // Included so that constants/settings might be initialized // in save_settings_to_globals() #include "llbutton.h" -#include "llcombobox.h" #include "llstatusbar.h" #include "llsurface.h" #include "llvosky.h" @@ -262,6 +263,7 @@ const F64 FRAME_STALL_THRESHOLD = 1.0; LLTimer gRenderStartTime; LLFrameTimer gForegroundTime; +LLFrameTimer gLoggedInTime; LLTimer gLogoutTimer; static const F32 LOGOUT_REQUEST_TIME = 6.f; // this will be cut short by the LogoutReply msg. F32 gLogoutMaxTime = LOGOUT_REQUEST_TIME; @@ -360,19 +362,19 @@ bool create_text_segment_icon_from_url_match(LLUrlMatch* match,LLTextBase* base) if(gAgent.isInGroup(match_id, TRUE)) { - LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>(); + LLGroupIconCtrl::Params icon_params; icon_params.group_id = match_id; icon_params.rect = LLRect(0, 16, 16, 0); icon_params.visible = true; - icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params); + icon = LLUICtrlFactory::instance().create<LLGroupIconCtrl>(icon_params); } else { - LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>(); + LLAvatarIconCtrl::Params icon_params; icon_params.avatar_id = match_id; icon_params.rect = LLRect(0, 16, 16, 0); icon_params.visible = true; - icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); + icon = LLUICtrlFactory::instance().create<LLAvatarIconCtrl>(icon_params); } LLInlineViewSegment::Params params; @@ -432,9 +434,6 @@ static void settings_to_globals() MENU_BAR_HEIGHT = gSavedSettings.getS32("MenuBarHeight"); MENU_BAR_WIDTH = gSavedSettings.getS32("MenuBarWidth"); - LLCOMBOBOX_HEIGHT = BTN_HEIGHT - 2; - LLCOMBOBOX_WIDTH = 128; - LLSurface::setTextureSize(gSavedSettings.getU32("RegionTextureSize")); LLImageGL::sGlobalUseAnisotropic = gSavedSettings.getBOOL("RenderAnisotropic"); @@ -511,16 +510,10 @@ class LLFastTimerLogThread : public LLThread public: std::string mFile; - LLFastTimerLogThread() : LLThread("fast timer log") + LLFastTimerLogThread(std::string& test_name) : LLThread("fast timer log") { - if(LLFastTimer::sLog) - { - mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance.slp"); - } - if(LLFastTimer::sMetricLog) - { - mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric.slp"); - } + std::string file_name = test_name + std::string(".slp"); + mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_name); } void run() @@ -536,6 +529,7 @@ public: os.close(); } + }; //virtual @@ -591,6 +585,7 @@ LLAppViewer::LLAppViewer() : setupErrorHandling(); sInstance = this; + gLoggedInTime.stop(); } LLAppViewer::~LLAppViewer() @@ -982,6 +977,7 @@ bool LLAppViewer::mainLoop() LLVoiceClient::getInstance()->init(gServicePump); LLTimer frameTimer,idleTimer; LLTimer debugTime; + LLFrameTimer memCheckTimer; LLViewerJoystick* joystick(LLViewerJoystick::getInstance()); joystick->setNeedsReset(true); @@ -992,11 +988,29 @@ bool LLAppViewer::mainLoop() // point of posting. LLSD newFrame; + const F32 memory_check_interval = 1.0f ; //second + // Handle messages while (!LLApp::isExiting()) { LLFastTimer::nextFrame(); // Should be outside of any timer instances + //clear call stack records + llclearcallstacks; + + //check memory availability information + { + if(memory_check_interval < memCheckTimer.getElapsedTimeF32()) + { + memCheckTimer.reset() ; + + //update the availability of memory + LLMemoryInfo::getAvailableMemoryKB(mAvailPhysicalMemInKB, mAvailVirtualMemInKB) ; + } + llcallstacks << "Available physical mem(KB): " << mAvailPhysicalMemInKB << llcallstacksendl ; + llcallstacks << "Available virtual mem(KB): " << mAvailVirtualMemInKB << llcallstacksendl ; + } + try { pingMainloopTimeout("Main:MiscNativeWindowEvents"); @@ -1223,11 +1237,20 @@ bool LLAppViewer::mainLoop() resumeMainloopTimeout(); pingMainloopTimeout("Main:End"); - } - + } } catch(std::bad_alloc) { + { + llinfos << "Availabe physical memory(KB) at the beginning of the frame: " << mAvailPhysicalMemInKB << llendl ; + llinfos << "Availabe virtual memory(KB) at the beginning of the frame: " << mAvailVirtualMemInKB << llendl ; + + LLMemoryInfo::getAvailableMemoryKB(mAvailPhysicalMemInKB, mAvailVirtualMemInKB) ; + + llinfos << "Current availabe physical memory(KB): " << mAvailPhysicalMemInKB << llendl ; + llinfos << "Current availabe virtual memory(KB): " << mAvailVirtualMemInKB << llendl ; + } + //stop memory leaking simulation LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); @@ -1354,8 +1377,7 @@ bool LLAppViewer::cleanup() LLPolyMesh::freeAllMeshes(); - delete gCacheName; - gCacheName = NULL; + LLStartUp::cleanupNameCache(); // Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be deleted. @@ -1616,22 +1638,16 @@ bool LLAppViewer::cleanup() { llinfos << "Analyzing performance" << llendl; - if(LLFastTimer::sLog) - { - LLFastTimerView::doAnalysis( - gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance_baseline.slp"), - gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance.slp"), - gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "performance_report.csv")); - } - if(LLFastTimer::sMetricLog) - { - LLFastTimerView::doAnalysis( - gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric_baseline.slp"), - gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric.slp"), - gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "metric_report.csv")); - } + std::string baseline_name = LLFastTimer::sLogName + "_baseline.slp"; + std::string current_name = LLFastTimer::sLogName + ".slp"; + std::string report_name = LLFastTimer::sLogName + "_report.csv"; + + LLFastTimerView::doAnalysis( + gDirUtilp->getExpandedFilename(LL_PATH_LOGS, baseline_name), + gDirUtilp->getExpandedFilename(LL_PATH_LOGS, current_name), + gDirUtilp->getExpandedFilename(LL_PATH_LOGS, report_name)); } - LLMetricPerformanceTester::cleanClass() ; + LLMetricPerformanceTesterBasic::cleanClass() ; llinfos << "Cleaning up Media and Textures" << llendflush; @@ -1738,7 +1754,7 @@ bool LLAppViewer::initThreads() if (LLFastTimer::sLog || LLFastTimer::sMetricLog) { LLFastTimer::sLogLock = new LLMutex(NULL); - mFastTimerLogThread = new LLFastTimerLogThread(); + mFastTimerLogThread = new LLFastTimerLogThread(LLFastTimer::sLogName); mFastTimerLogThread->start(); } @@ -2021,6 +2037,15 @@ bool LLAppViewer::initConfiguration() // - apply command line settings clp.notify(); + // Register the core crash option as soon as we can + // if we want gdb post-mortem on cores we need to be up and running + // ASAP or we might miss init issue etc. + if(clp.hasOption("disablecrashlogger")) + { + llwarns << "Crashes will be handled by system, stack trace logs and crash logger are both disabled" << llendl; + LLAppViewer::instance()->disableCrashlogger(); + } + // Handle initialization from settings. // Start up the debugging console before handling other options. if (gSavedSettings.getBOOL("ShowConsoleWindow")) @@ -2080,11 +2105,25 @@ bool LLAppViewer::initConfiguration() if (clp.hasOption("logperformance")) { LLFastTimer::sLog = TRUE; + LLFastTimer::sLogName = std::string("performance"); } - if(clp.hasOption("logmetrics")) + if (clp.hasOption("logmetrics")) { LLFastTimer::sMetricLog = TRUE ; + // '--logmetrics' can be specified with a named test metric argument so the data gathering is done only on that test + // In the absence of argument, every metric is gathered (makes for a rather slow run and hard to decipher report...) + std::string test_name = clp.getOption("logmetrics")[0]; + llinfos << "'--logmetrics' argument : " << test_name << llendl; + if (test_name == "") + { + llwarns << "No '--logmetrics' argument given, will output all metrics to " << DEFAULT_METRIC_NAME << llendl; + LLFastTimer::sLogName = DEFAULT_METRIC_NAME; + } + else + { + LLFastTimer::sLogName = test_name; + } } if (clp.hasOption("graphicslevel")) @@ -2597,6 +2636,11 @@ void LLAppViewer::handleViewerCrash() abort(); } + if (LLApp::isCrashloggerDisabled()) + { + abort(); + } + // Returns whether a dialog was shown. // Only do the logic in here once if (pApp->mReportedCrash) @@ -2992,7 +3036,7 @@ void LLAppViewer::migrateCacheDirectory() S32 file_count = 0; std::string file_name; std::string mask = delimiter + "*.*"; - while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name, false)) + while (gDirUtilp->getNextFileInDir(old_cache_dir, mask, file_name)) { if (file_name == "." || file_name == "..") continue; std::string source_path = old_cache_dir + delimiter + file_name; @@ -3211,7 +3255,7 @@ bool LLAppViewer::initCache() dir = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,""); std::string found_file; - if (gDirUtilp->getNextFileInDir(dir, mask, found_file, false)) + if (gDirUtilp->getNextFileInDir(dir, mask, found_file)) { old_vfs_data_file = dir + gDirUtilp->getDirDelimiter() + found_file; @@ -3433,6 +3477,15 @@ void LLAppViewer::saveFinalSnapshot() void LLAppViewer::loadNameCache() { + // display names cache + std::string filename = + gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml"); + llifstream name_cache_stream(filename); + if(name_cache_stream.is_open()) + { + LLAvatarNameCache::importFile(name_cache_stream); + } + if (!gCacheName) return; std::string name_cache; @@ -3442,19 +3495,19 @@ void LLAppViewer::loadNameCache() { if(gCacheName->importFile(cache_file)) return; } +} - // Try to load from the legacy format. This should go away after a - // while. Phoenix 2008-01-30 - LLFILE* name_cache_fp = LLFile::fopen(name_cache, "r"); // Flawfinder: ignore - if (name_cache_fp) +void LLAppViewer::saveNameCache() { - gCacheName->importFile(name_cache_fp); - fclose(name_cache_fp); - } + // display names cache + std::string filename = + gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "avatar_name_cache.xml"); + llofstream name_cache_stream(filename); + if(name_cache_stream.is_open()) + { + LLAvatarNameCache::exportFile(name_cache_stream); } -void LLAppViewer::saveNameCache() -{ if (!gCacheName) return; std::string name_cache; @@ -3654,6 +3707,7 @@ void LLAppViewer::idle() // NOTE: Starting at this point, we may still have pointers to "dead" objects // floating throughout the various object lists. // + idleNameCache(); idleNetwork(); @@ -3991,6 +4045,60 @@ void LLAppViewer::sendLogoutRequest() } } +void LLAppViewer::idleNameCache() +{ + // Neither old nor new name cache can function before agent has a region + LLViewerRegion* region = gAgent.getRegion(); + if (!region) return; + + // deal with any queued name requests and replies. + gCacheName->processPending(); + + // Can't run the new cache until we have the list of capabilities + // for the agent region, and can therefore decide whether to use + // display names or fall back to the old name system. + if (!region->capabilitiesReceived()) return; + + // Agent may have moved to a different region, so need to update cap URL + // for name lookups. Can't do this in the cap grant code, as caps are + // granted to neighbor regions before the main agent gets there. Can't + // do it in the move-into-region code because cap not guaranteed to be + // granted yet, for example on teleport. + bool had_capability = LLAvatarNameCache::hasNameLookupURL(); + std::string name_lookup_url; + name_lookup_url.reserve(128); // avoid a memory allocation below + name_lookup_url = region->getCapability("GetDisplayNames"); + bool have_capability = !name_lookup_url.empty(); + if (have_capability) + { + // we have support for display names, use it + U32 url_size = name_lookup_url.size(); + // capabilities require URLs with slashes before query params: + // https://<host>:<port>/cap/<uuid>/?ids=<blah> + // but the caps are granted like: + // https://<host>:<port>/cap/<uuid> + if (url_size > 0 && name_lookup_url[url_size-1] != '/') + { + name_lookup_url += '/'; + } + LLAvatarNameCache::setNameLookupURL(name_lookup_url); + } + else + { + // Display names not available on this region + LLAvatarNameCache::setNameLookupURL( std::string() ); + } + + // Error recovery - did we change state? + if (had_capability != have_capability) + { + // name tags are persistant on screen, so make sure they refresh + LLVOAvatar::invalidateNameTags(); + } + + LLAvatarNameCache::idle(); +} + // // Handle messages, and all message related stuff // @@ -4016,8 +4124,6 @@ void LLAppViewer::idleNetwork() { LLFastTimer t(FTM_IDLE_NETWORK); // decode - // deal with any queued name requests and replies. - gCacheName->processPending(); LLTimer check_message_timer; // Read all available packets from network const S64 frame_count = gFrameCount; // U32->S64 @@ -4275,6 +4381,7 @@ void LLAppViewer::pingMainloopTimeout(const std::string& state, F32 secs) void LLAppViewer::handleLoginComplete() { + gLoggedInTime.start(); initMainloopTimeout("Mainloop Init"); // Store some data to DebugInfo in case of a freeze. @@ -4452,6 +4559,8 @@ void LLAppViewer::launchUpdater() LLAppViewer::sUpdaterInfo->mUpdateExePath += update_url.asString(); LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -name \""; LLAppViewer::sUpdaterInfo->mUpdateExePath += LLAppViewer::instance()->getSecondLifeTitle(); + LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" -bundleid \""; + LLAppViewer::sUpdaterInfo->mUpdateExePath += LL_VERSION_BUNDLE_ID; LLAppViewer::sUpdaterInfo->mUpdateExePath += "\" &"; LL_DEBUGS("AppInit") << "Calling updater: " << LLAppViewer::sUpdaterInfo->mUpdateExePath << LL_ENDL; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index c5cac6827c..a14ab4362f 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -204,6 +204,8 @@ private: void idle(); void idleShutdown(); + // update avatar SLID and display name caches + void idleNameCache(); void idleNetwork(); void sendLogoutRequest(); @@ -249,7 +251,9 @@ private: LLWatchdogTimeout* mMainloopTimeout; + // For performance and metric gathering LLThread* mFastTimerLogThread; + // for tracking viewer<->region circuit death bool mAgentRegionLastAlive; LLUUID mAgentRegionLastID; @@ -258,6 +262,8 @@ private: std::set<struct apr_dso_handle_t*> mPlugins; + U32 mAvailPhysicalMemInKB ; + U32 mAvailVirtualMemInKB ; public: //some information for updater typedef struct @@ -308,6 +314,7 @@ extern U32 gFrameStalls; extern LLTimer gRenderStartTime; extern LLFrameTimer gForegroundTime; +extern LLFrameTimer gLoggedInTime; extern F32 gLogoutMaxTime; extern LLTimer gLogoutTimer; diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp index 7629265730..898cc1c0ba 100644 --- a/indra/newview/llappviewerlinux.cpp +++ b/indra/newview/llappviewerlinux.cpp @@ -504,8 +504,7 @@ std::string LLAppViewerLinux::generateSerialNumber() // trawl /dev/disk/by-uuid looking for a good-looking UUID to grab std::string this_name; - BOOL wrap = FALSE; - while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name, wrap)) + while (gDirUtilp->getNextFileInDir(uuiddir, "*", this_name)) { if (this_name.length() > best.length() || (this_name.length() == best.length() && diff --git a/indra/newview/llaudiosourcevo.cpp b/indra/newview/llaudiosourcevo.cpp index 40eb5ebcd1..b37aba6c15 100644 --- a/indra/newview/llaudiosourcevo.cpp +++ b/indra/newview/llaudiosourcevo.cpp @@ -35,11 +35,8 @@ LLAudioSourceVO::LLAudioSourceVO(const LLUUID &sound_id, const LLUUID& owner_id, const F32 gain, LLViewerObject *objectp) : LLAudioSource(sound_id, owner_id, gain, LLAudioEngine::AUDIO_TYPE_SFX), - mObjectp(objectp), - mActualGain(gain) + mObjectp(objectp) { - setAmbient(FALSE); - updateGain(); update(); } @@ -54,18 +51,18 @@ LLAudioSourceVO::~LLAudioSourceVO() void LLAudioSourceVO::setGain(const F32 gain) { - mActualGain = llclamp(gain, 0.f, 1.f); - updateGain(); + mGain = llclamp(gain, 0.f, 1.f); } -void LLAudioSourceVO::updateGain() +void LLAudioSourceVO::updateMute() { - if (!mObjectp) + if (!mObjectp || mObjectp->isDead()) { + mSourceMuted = true; return; } - BOOL mute = FALSE; + bool mute = false; LLVector3d pos_global; if (mObjectp->isAttachment()) @@ -84,21 +81,21 @@ void LLAudioSourceVO::updateGain() { pos_global = mObjectp->getPositionGlobal(); } - + if (!LLViewerParcelMgr::getInstance()->canHearSound(pos_global)) { - mute = TRUE; + mute = true; } if (!mute) { if (LLMuteList::getInstance()->isMuted(mObjectp->getID())) { - mute = TRUE; + mute = true; } else if (LLMuteList::getInstance()->isMuted(mOwnerID, LLMute::flagObjectSounds)) { - mute = TRUE; + mute = true; } else if (mObjectp->isAttachment()) { @@ -110,24 +107,38 @@ void LLAudioSourceVO::updateGain() if (parent && LLMuteList::getInstance()->isMuted(parent->getID())) { - mute = TRUE; + mute = true; } } } - if (!mute) + if (mute != mSourceMuted) { - mGain = mActualGain; - } - else - { - mGain = 0.f; + mSourceMuted = mute; + if (mSourceMuted) + { + // Stop the sound. + this->play(LLUUID::null); + } + else + { + // Muted sounds keep there data at all times, because + // it's the place where the audio UUID is stored. + // However, it's possible that mCurrentDatap is + // NULL when this source did only preload sounds. + if (mCurrentDatap) + { + // Restart the sound. + this->play(mCurrentDatap->getID()); + } + } } } - void LLAudioSourceVO::update() { + updateMute(); + if (!mObjectp) { return; @@ -139,7 +150,11 @@ void LLAudioSourceVO::update() return; } - updateGain(); + if (mSourceMuted) + { + return; + } + if (mObjectp->isHUDAttachment()) { mPositionGlobal = gAgentCamera.getCameraPositionGlobal(); diff --git a/indra/newview/llaudiosourcevo.h b/indra/newview/llaudiosourcevo.h index a68f58a4b2..f1d8ef4528 100644 --- a/indra/newview/llaudiosourcevo.h +++ b/indra/newview/llaudiosourcevo.h @@ -42,11 +42,10 @@ public: /*virtual*/ void setGain(const F32 gain); private: - void updateGain(); + void updateMute(); private: LLPointer<LLViewerObject> mObjectp; - F32 mActualGain; // The "real" gain, when not off due to parcel effects }; #endif // LL_LLAUDIOSOURCEVO_H diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index b9ae976e58..066b4d8bc3 100644 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -31,11 +31,11 @@ #include "boost/lambda/lambda.hpp" // for lambda::constant +#include "llavatarnamecache.h" // IDEVO #include "llsd.h" #include "lldarray.h" #include "llnotifications.h" #include "llnotificationsutil.h" - #include "roles_constants.h" // for GP_MEMBER_INVITE #include "llagent.h" @@ -49,6 +49,7 @@ #include "llfloaterpay.h" #include "llfloaterworldmap.h" #include "llgiveinventory.h" +#include "llinventorybridge.h" #include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType #include "llinventorypanel.h" #include "llimview.h" // for gIMMgr @@ -64,6 +65,7 @@ #include "llimfloater.h" #include "lltrans.h" #include "llcallingcard.h" +#include "llslurl.h" // IDEVO // static void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::string& name) @@ -75,26 +77,22 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id, const std::strin } LLSD args; - args["NAME"] = name; + args["NAME"] = LLSLURL("agent", id, "completename").getSLURLString(); LLSD payload; payload["id"] = id; payload["name"] = name; - // Look for server versions like: Second Life Server 1.24.4.95600 - if (gLastVersionChannel.find(" 1.24.") != std::string::npos) - { - // Old and busted server version, doesn't support friend - // requests with messages. - LLNotificationsUtil::add("AddFriend", args, payload, &callbackAddFriend); - } - else - { + LLNotificationsUtil::add("AddFriendWithMessage", args, payload, &callbackAddFriendWithMessage); - } // add friend to recent people list LLRecentPeople::instance().add(id); } +void on_avatar_name_friendship(const LLUUID& id, const LLAvatarName av_name) +{ + LLAvatarActions::requestFriendshipDialog(id, av_name.getCompleteName()); +} + // static void LLAvatarActions::requestFriendshipDialog(const LLUUID& id) { @@ -103,9 +101,7 @@ void LLAvatarActions::requestFriendshipDialog(const LLUUID& id) return; } - std::string full_name; - gCacheName->getFullName(id, full_name); - requestFriendshipDialog(id, full_name); + LLAvatarNameCache::get(id, boost::bind(&on_avatar_name_friendship, _1, _2)); } // static @@ -130,11 +126,10 @@ void LLAvatarActions::removeFriendsDialog(const uuid_vec_t& ids) if(ids.size() == 1) { LLUUID agent_id = ids[0]; - std::string first, last; - if(gCacheName->getName(agent_id, first, last)) + LLAvatarName av_name; + if(LLAvatarNameCache::get(agent_id, &av_name)) { - args["FIRST_NAME"] = first; - args["LAST_NAME"] = last; + args["NAME"] = av_name.mDisplayName; } msgType = "RemoveFromFriends"; @@ -162,14 +157,6 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee) if (invitee.isNull()) return; - //waiting until Name Cache gets updated with corresponding avatar name - std::string just_to_request_name; - if (!gCacheName->getFullName(invitee, just_to_request_name)) - { - gCacheName->get(invitee, FALSE, boost::bind((void (*)(const LLUUID&)) &LLAvatarActions::offerTeleport, invitee)); - return; - } - LLDynamicArray<LLUUID> ids; ids.push_back(invitee); offerTeleport(ids); @@ -184,20 +171,11 @@ void LLAvatarActions::offerTeleport(const uuid_vec_t& ids) handle_lure(ids); } -// static -void LLAvatarActions::startIM(const LLUUID& id) +static void on_avatar_name_cache_start_im(const LLUUID& agent_id, + const LLAvatarName& av_name) { - if (id.isNull()) - return; - - std::string name; - if (!gCacheName->getFullName(id, name)) - { - gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::startIM, id)); - return; - } - - LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id); + std::string name = av_name.getCompleteName(); + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, agent_id); if (session_id != LLUUID::null) { LLIMFloater::show(session_id); @@ -206,6 +184,16 @@ void LLAvatarActions::startIM(const LLUUID& id) } // static +void LLAvatarActions::startIM(const LLUUID& id) +{ + if (id.isNull()) + return; + + LLAvatarNameCache::get(id, + boost::bind(&on_avatar_name_cache_start_im, _1, _2)); +} + +// static void LLAvatarActions::endIM(const LLUUID& id) { if (id.isNull()) @@ -218,6 +206,18 @@ void LLAvatarActions::endIM(const LLUUID& id) } } +static void on_avatar_name_cache_start_call(const LLUUID& agent_id, + const LLAvatarName& av_name) +{ + std::string name = av_name.getCompleteName(); + LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, agent_id, true); + if (session_id != LLUUID::null) + { + gIMMgr->startCall(session_id); + } + make_ui_sound("UISndStartIM"); +} + // static void LLAvatarActions::startCall(const LLUUID& id) { @@ -225,15 +225,8 @@ void LLAvatarActions::startCall(const LLUUID& id) { return; } - - std::string name; - gCacheName->getFullName(id, name); - LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true); - if (session_id != LLUUID::null) - { - gIMMgr->startCall(session_id); - } - make_ui_sound("UISndStartIM"); + LLAvatarNameCache::get(id, + boost::bind(&on_avatar_name_cache_start_call, _1, _2)); } // static @@ -329,14 +322,14 @@ void LLAvatarActions::showProfile(const LLUUID& id) // static void LLAvatarActions::showOnMap(const LLUUID& id) { - std::string name; - if (!gCacheName->getFullName(id, name)) + LLAvatarName av_name; + if (!LLAvatarNameCache::get(id, &av_name)) { - gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::showOnMap, id)); + LLAvatarNameCache::get(id, boost::bind(&LLAvatarActions::showOnMap, id)); return; } - gFloaterWorldMap->trackAvatar(id, name); + gFloaterWorldMap->trackAvatar(id, av_name.mDisplayName); LLFloaterReg::showInstance("world_map"); } @@ -443,17 +436,27 @@ namespace action_give_inventory } /** - * Checks My Inventory visibility. + * @return active inventory panel, or NULL if there's no such panel */ - static bool is_give_inventory_acceptable() + static LLInventoryPanel* get_active_inventory_panel() { LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); if (!active_panel) { active_panel = get_outfit_editor_inventory_panel(); - if (!active_panel) return false; } + return active_panel; + } + + /** + * Checks My Inventory visibility. + */ + static bool is_give_inventory_acceptable() + { + LLInventoryPanel* active_panel = get_active_inventory_panel(); + if (!active_panel) return false; + // check selection in the panel const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList(); if (inventory_selected_uuids.empty()) return false; // nothing selected @@ -486,14 +489,15 @@ namespace action_give_inventory return acceptable; } - static void build_residents_string(const std::vector<std::string>& avatar_names, std::string& residents_string) + static void build_residents_string(const std::vector<LLAvatarName> avatar_names, std::string& residents_string) { llassert(avatar_names.size() > 0); const std::string& separator = LLTrans::getString("words_separator"); - for (std::vector<std::string>::const_iterator it = avatar_names.begin(); ; ) + for (std::vector<LLAvatarName>::const_iterator it = avatar_names.begin(); ; ) { - residents_string.append(*it); + LLAvatarName av_name = *it; + residents_string.append(av_name.mDisplayName); if (++it == avatar_names.end()) { break; @@ -530,7 +534,7 @@ namespace action_give_inventory struct LLShareInfo : public LLSingleton<LLShareInfo> { - std::vector<std::string> mAvatarNames; + std::vector<LLAvatarName> mAvatarNames; uuid_vec_t mAvatarUuids; }; @@ -543,12 +547,8 @@ namespace action_give_inventory return; } - LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); - if (!active_panel) - { - active_panel = get_outfit_editor_inventory_panel(); - if (!active_panel) return; - } + LLInventoryPanel* active_panel = get_active_inventory_panel(); + if (!active_panel) return; const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList(); if (inventory_selected_uuids.empty()) @@ -595,7 +595,7 @@ namespace action_give_inventory } else { - LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id); + LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id); shared = true; } } @@ -627,17 +627,12 @@ namespace action_give_inventory * @param avatar_names - avatar names request to be sent. * @param avatar_uuids - avatar names request to be sent. */ - static void give_inventory(const std::vector<std::string>& avatar_names, const uuid_vec_t& avatar_uuids) + static void give_inventory(const uuid_vec_t& avatar_uuids, const std::vector<LLAvatarName> avatar_names) { llassert(avatar_names.size() == avatar_uuids.size()); - - LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE); - if (!active_panel) - { - active_panel = get_outfit_editor_inventory_panel(); - if (!active_panel) return; - } + LLInventoryPanel* active_panel = get_active_inventory_panel(); + if (!active_panel) return; const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList(); if (inventory_selected_uuids.empty()) @@ -672,12 +667,59 @@ void LLAvatarActions::shareWithAvatars() LLNotificationsUtil::add("ShareNotification"); } + +// static +bool LLAvatarActions::canShareSelectedItems(LLInventoryPanel* inv_panel /* = NULL*/) +{ + using namespace action_give_inventory; + + if (!inv_panel) + { + LLInventoryPanel* active_panel = get_active_inventory_panel(); + if (!active_panel) return false; + inv_panel = active_panel; + } + + // check selection in the panel + LLFolderView* root_folder = inv_panel->getRootFolder(); + const uuid_set_t inventory_selected_uuids = root_folder->getSelectionList(); + if (inventory_selected_uuids.empty()) return false; // nothing selected + + bool can_share = true; + uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); + const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end(); + for (; it != it_end; ++it) + { + LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it); + // any category can be offered. + if (inv_cat) + { + continue; + } + + // check if inventory item can be given + LLFolderViewItem* item = root_folder->getItemByID(*it); + if (!item) return false; + LLInvFVBridge* bridge = dynamic_cast<LLInvFVBridge*>(item->getListener()); + if (bridge && bridge->canShare()) + { + continue; + } + + // there are neither item nor category in inventory + can_share = false; + break; + } + + return can_share; +} + // static void LLAvatarActions::toggleBlock(const LLUUID& id) { std::string name; - gCacheName->getFullName(id, name); + gCacheName->getFullName(id, name); // needed for mute LLMute mute(id, name, LLMute::AGENT); if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName)) @@ -865,23 +907,6 @@ bool LLAvatarActions::handleUnfreeze(const LLSD& notification, const LLSD& respo } return false; } -// static -bool LLAvatarActions::callbackAddFriend(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option == 0) - { - // Servers older than 1.25 require the text of the message to be the - // calling card folder ID for the offering user. JC - LLUUID calling_card_folder_id = - gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD); - std::string message = calling_card_folder_id.asString(); - requestFriendship(notification["payload"]["id"].asUUID(), - notification["payload"]["name"].asString(), - message); - } - return false; -} // static void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::string& target_name, const std::string& message) @@ -899,7 +924,6 @@ void LLAvatarActions::requestFriendship(const LLUUID& target_id, const std::stri LLSD payload; payload["from_id"] = target_id; - payload["SESSION_NAME"] = target_name; payload["SUPPRESS_TOAST"] = true; LLNotificationsUtil::add("FriendshipOffered", args, payload); } @@ -914,16 +938,16 @@ bool LLAvatarActions::isFriend(const LLUUID& id) bool LLAvatarActions::isBlocked(const LLUUID& id) { std::string name; - gCacheName->getFullName(id, name); + gCacheName->getFullName(id, name); // needed for mute return LLMuteList::getInstance()->isMuted(id, name); } // static bool LLAvatarActions::canBlock(const LLUUID& id) { - std::string firstname, lastname; - gCacheName->getName(id, firstname, lastname); - bool is_linden = !LLStringUtil::compareStrings(lastname, "Linden"); + std::string full_name; + gCacheName->getFullName(id, full_name); // needed for mute + bool is_linden = (full_name.find("Linden") != std::string::npos); bool is_self = id == gAgentID; return !is_self && !is_linden; } diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h index 6313ae0759..2db2918eed 100644 --- a/indra/newview/llavataractions.h +++ b/indra/newview/llavataractions.h @@ -34,6 +34,8 @@ #include <string> #include <vector> +class LLInventoryPanel; + /** * Friend-related actions (add, remove, offer teleport, etc) */ @@ -183,8 +185,16 @@ public: */ static bool canOfferTeleport(const uuid_vec_t& ids); + /** + * Checks whether all items selected in the given inventory panel can be shared + * + * @param inv_panel Inventory panel to get selection from. If NULL, the active inventory panel is used. + * + * @return false if the selected items cannot be shared or the active inventory panel cannot be obtained + */ + static bool canShareSelectedItems(LLInventoryPanel* inv_panel = NULL); + private: - static bool callbackAddFriend(const LLSD& notification, const LLSD& response); static bool callbackAddFriendWithMessage(const LLSD& notification, const LLSD& response); static bool handleRemove(const LLSD& notification, const LLSD& response); static bool handlePay(const LLSD& notification, const LLSD& response, LLUUID avatar_id); diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 09fbed9e06..d0f4d19f56 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -28,17 +28,19 @@ #include "llavatariconctrl.h" +// viewer includes #include "llagent.h" #include "llavatarconstants.h" #include "llcallingcard.h" // for LLAvatarTracker #include "llavataractions.h" #include "llmenugl.h" #include "lluictrlfactory.h" - -#include "llcachename.h" #include "llagentdata.h" #include "llimfloater.h" +// library includes +#include "llavatarnamecache.h" + #define MENU_ITEM_VIEW_PROFILE 0 #define MENU_ITEM_SEND_IM 1 @@ -227,6 +229,9 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) // Check if cache already contains image_id for that avatar if (!updateFromCache()) { + // *TODO: Consider getting avatar icon/badge directly from + // People API, rather than sending AvatarPropertyRequest + // messages. People API already hits the user table. LLIconCtrl::setValue(mDefaultIconName); app->addObserver(mAvatarId, this); app->sendAvatarPropertiesRequest(mAvatarId); @@ -238,10 +243,9 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) LLIconCtrl::setValue(value); } - if (gCacheName) - { - gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4)); - } + LLAvatarNameCache::get(mAvatarId, + boost::bind(&LLAvatarIconCtrl::onAvatarNameCache, + this, _1, _2)); } bool LLAvatarIconCtrl::updateFromCache() @@ -284,24 +288,21 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type) } } -void LLAvatarIconCtrl::nameUpdatedCallback( - const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group) +void LLAvatarIconCtrl::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name) { - if (id == mAvatarId) + if (agent_id == mAvatarId) { - mFirstName = first; - mLastName = last; + // Most avatar icon controls are next to a UI element that shows + // a display name, so only show username. + mFullName = av_name.mUsername; if (mDrawTooltip) { - setToolTip(mFirstName + " " + mLastName); + setToolTip(mFullName); } else { - setToolTip(std::string("")); + setToolTip(std::string()); } } } diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h index b24d7356a8..7f568fc5b8 100644 --- a/indra/newview/llavatariconctrl.h +++ b/indra/newview/llavatariconctrl.h @@ -31,6 +31,8 @@ #include "llavatarpropertiesprocessor.h" #include "llviewermenu.h" +class LLAvatarName; + class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache> { public: @@ -84,22 +86,16 @@ public: // LLAvatarPropertiesProcessor observer trigger virtual void processProperties(void* data, EAvatarProcessorType type); - void nameUpdatedCallback( - const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group); + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); const LLUUID& getAvatarId() const { return mAvatarId; } - const std::string& getFirstName() const { return mFirstName; } - const std::string& getLastName() const { return mLastName; } + const std::string& getFullName() const { return mFullName; } void setDrawTooltip(bool value) { mDrawTooltip = value;} protected: LLUUID mAvatarId; - std::string mFirstName; - std::string mLastName; + std::string mFullName; bool mDrawTooltip; std::string mDefaultIconName; diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index 5241f20c0e..ff7dfccc0a 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -38,6 +38,7 @@ // newview #include "llagentdata.h" // for comparator #include "llavatariconctrl.h" +#include "llavatarnamecache.h" #include "llcallingcard.h" // for LLAvatarTracker #include "llcachename.h" #include "lllistcontextmenu.h" @@ -131,6 +132,7 @@ LLAvatarList::LLAvatarList(const Params& p) , mShowLastInteractionTime(p.show_last_interaction_time) , mContextMenu(NULL) , mDirty(true) // to force initial update +, mNeedUpdateNames(false) , mLITUpdateTimer(NULL) , mShowIcons(true) , mShowInfoBtn(p.show_info_btn) @@ -149,8 +151,17 @@ LLAvatarList::LLAvatarList(const Params& p) mLITUpdateTimer->setTimerExpirySec(0); // zero to force initial update mLITUpdateTimer->start(); } + + LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLAvatarList::handleDisplayNamesOptionChanged, this)); +} + + +void LLAvatarList::handleDisplayNamesOptionChanged() +{ + mNeedUpdateNames = true; } + LLAvatarList::~LLAvatarList() { delete mLITUpdateTimer; @@ -170,6 +181,11 @@ void LLAvatarList::draw() LLFlatListViewEx::draw(); + if (mNeedUpdateNames) + { + updateAvatarNames(); + } + if (mDirty) refresh(); @@ -233,7 +249,6 @@ void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_i ////////////////////////////////////////////////////////////////////////// // PROTECTED SECTION ////////////////////////////////////////////////////////////////////////// - void LLAvatarList::refresh() { bool have_names = TRUE; @@ -252,12 +267,15 @@ void LLAvatarList::refresh() // Handle added items. unsigned nadded = 0; + const std::string waiting_str = LLTrans::getString("AvatarNameWaiting"); + for (uuid_vec_t::const_iterator it=added.begin(); it != added.end(); it++) { - std::string name; const LLUUID& buddy_id = *it; - have_names &= (bool)gCacheName->getFullName(buddy_id, name); - if (!have_filter || findInsensitive(name, mNameFilter)) + LLAvatarName av_name; + have_names &= LLAvatarNameCache::get(buddy_id, &av_name); + + if (!have_filter || findInsensitive(av_name.mDisplayName, mNameFilter)) { if (nadded >= ADD_LIMIT) { @@ -266,7 +284,11 @@ void LLAvatarList::refresh() } else { - addNewItem(buddy_id, name, LLAvatarTracker::instance().isBuddyOnline(buddy_id)); + // *NOTE: If you change the UI to show a different string, + // be sure to change the filter code below. + addNewItem(buddy_id, + av_name.mDisplayName.empty() ? waiting_str : av_name.mDisplayName, + LLAvatarTracker::instance().isBuddyOnline(buddy_id)); modified = true; nadded++; } @@ -288,10 +310,10 @@ void LLAvatarList::refresh() for (std::vector<LLSD>::const_iterator it=cur_values.begin(); it != cur_values.end(); it++) { - std::string name; const LLUUID& buddy_id = it->asUUID(); - have_names &= (bool)gCacheName->getFullName(buddy_id, name); - if (!findInsensitive(name, mNameFilter)) + LLAvatarName av_name; + have_names &= LLAvatarNameCache::get(buddy_id, &av_name); + if (!findInsensitive(av_name.mDisplayName, mNameFilter)) { removeItemByUUID(buddy_id); modified = true; @@ -337,20 +359,34 @@ void LLAvatarList::refresh() onCommit(); } +void LLAvatarList::updateAvatarNames() +{ + std::vector<LLPanel*> items; + getItems(items); + + for( std::vector<LLPanel*>::const_iterator it = items.begin(); it != items.end(); it++) + { + LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it); + item->updateAvatarName(); + } + mNeedUpdateNames = false; +} + + bool LLAvatarList::filterHasMatches() { uuid_vec_t values = getIDs(); for (uuid_vec_t::const_iterator it=values.begin(); it != values.end(); it++) { - std::string name; const LLUUID& buddy_id = *it; - BOOL have_name = gCacheName->getFullName(buddy_id, name); + LLAvatarName av_name; + bool have_name = LLAvatarNameCache::get(buddy_id, &av_name); // If name has not been loaded yet we consider it as a match. // When the name will be loaded the filter will be applied again(in refresh()). - if (have_name && !findInsensitive(name, mNameFilter)) + if (have_name && !findInsensitive(av_name.mDisplayName, mNameFilter)) { continue; } @@ -384,7 +420,7 @@ S32 LLAvatarList::notifyParent(const LLSD& info) void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos) { LLAvatarListItem* item = new LLAvatarListItem(); - item->setName(name); + // This sets the name as a side effect item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus); item->setOnline(mIgnoreOnlineStatus ? true : is_online); item->showLastInteractionTime(mShowLastInteractionTime); @@ -509,7 +545,7 @@ LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarList , mIsHideNumber(hide_number) { // should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called. - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml"); + buildFromFile( "panel_avatar_list_item.xml"); } BOOL LLAvalineListItem::postBuild() @@ -551,11 +587,13 @@ void LLAvalineListItem::setName(const std::string& name) std::string hidden_name = LLTrans::getString("AvalineCaller", args); LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL; - LLAvatarListItem::setName(hidden_name); + LLAvatarListItem::setAvatarName(hidden_name); + LLAvatarListItem::setAvatarToolTip(hidden_name); } else { const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name); - LLAvatarListItem::setName(formatted_phone); + LLAvatarListItem::setAvatarName(formatted_phone); + LLAvatarListItem::setAvatarToolTip(formatted_phone); } } diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 9d3dcb75f3..cacbcf7244 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -28,7 +28,6 @@ #define LL_LLAVATARLIST_H #include "llflatlistview.h" - #include "llavatarlistitem.h" class LLTimer; @@ -96,6 +95,7 @@ public: virtual S32 notifyParent(const LLSD& info); void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name); + void handleDisplayNamesOptionChanged(); protected: void refresh(); @@ -105,14 +105,17 @@ protected: const uuid_vec_t& vnew, uuid_vec_t& vadded, uuid_vec_t& vremoved); - void updateLastInteractionTimes(); + void updateLastInteractionTimes(); + void rebuildNames(); void onItemDoubleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask); + void updateAvatarNames(); private: bool mIgnoreOnlineStatus; bool mShowLastInteractionTime; bool mDirty; + bool mNeedUpdateNames; bool mShowIcons; bool mShowInfoBtn; bool mShowProfileBtn; diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index 06ac189cbd..30eecfe323 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -35,12 +35,13 @@ #include "lltextutil.h" #include "llagent.h" +#include "llavatarnamecache.h" #include "llavatariconctrl.h" #include "lloutputmonitorctrl.h" bool LLAvatarListItem::sStaticInitialized = false; S32 LLAvatarListItem::sLeftPadding = 0; -S32 LLAvatarListItem::sRightNamePadding = 0; +S32 LLAvatarListItem::sNameRightPadding = 0; S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT]; static LLWidgetNameRegistry::StaticRegistrar sRegisterAvatarListItemParams(&typeid(LLAvatarListItem::Params), "avatar_list_item"); @@ -51,7 +52,8 @@ LLAvatarListItem::Params::Params() voice_call_joined_style("voice_call_joined_style"), voice_call_left_style("voice_call_left_style"), online_style("online_style"), - offline_style("offline_style") + offline_style("offline_style"), + name_right_pad("name_right_pad", 0) {}; @@ -70,11 +72,12 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/) mOnlineStatus(E_UNKNOWN), mShowInfoBtn(true), mShowProfileBtn(true), - mShowPermissions(false) + mShowPermissions(false), + mHovered(false) { if (not_from_ui_factory) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml"); + buildFromFile("panel_avatar_list_item.xml"); } // *NOTE: mantipov: do not use any member here. They can be uninitialized here in case instance // is created from the UICtrlFactory @@ -117,6 +120,9 @@ BOOL LLAvatarListItem::postBuild() // so that we can hide and show them again later. initChildrenWidths(this); + // Right padding between avatar name text box and nearest visible child. + sNameRightPadding = LLUICtrlFactory::getDefaultParams<LLAvatarListItem>().name_right_pad; + sStaticInitialized = true; } @@ -185,11 +191,16 @@ void LLAvatarListItem::setOnline(bool online) setState(online ? IS_ONLINE : IS_OFFLINE); } -void LLAvatarListItem::setName(const std::string& name) +void LLAvatarListItem::setAvatarName(const std::string& name) { setNameInternal(name, mHighlihtSubstring); } +void LLAvatarListItem::setAvatarToolTip(const std::string& tooltip) +{ + mAvatarName->setToolTip(tooltip); +} + void LLAvatarListItem::setHighlight(const std::string& highlight) { setNameInternal(mAvatarName->getText(), mHighlihtSubstring = highlight); @@ -248,7 +259,8 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, b mAvatarIcon->setValue(id); // Set avatar name. - gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3)); + LLAvatarNameCache::get(id, + boost::bind(&LLAvatarListItem::onAvatarNameCache, this, _2)); } } @@ -334,23 +346,33 @@ const LLUUID& LLAvatarListItem::getAvatarId() const return mAvatarId; } -const std::string LLAvatarListItem::getAvatarName() const +std::string LLAvatarListItem::getAvatarName() const { return mAvatarName->getValue(); } -//== PRIVATE SECTION ========================================================== +std::string LLAvatarListItem::getAvatarToolTip() const +{ + return mAvatarName->getToolTip(); +} + +void LLAvatarListItem::updateAvatarName() +{ + LLAvatarNameCache::get(getAvatarId(), + boost::bind(&LLAvatarListItem::onAvatarNameCache, this, _2)); +} + +//== PRIVATE SECITON ========================================================== void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight) { LLTextUtil::textboxSetHighlightedVal(mAvatarName, mAvatarNameStyle, name, highlight); - mAvatarName->setToolTip(name); } -void LLAvatarListItem::onNameCache(const std::string& first_name, const std::string& last_name) +void LLAvatarListItem::onAvatarNameCache(const LLAvatarName& av_name) { - std::string name = first_name + " " + last_name; - setName(name); + setAvatarName(av_name.mDisplayName); + setAvatarToolTip(av_name.mUsername); //requesting the list to resort notifyParent(LLSD().with("sort", LLSD())); @@ -468,7 +490,6 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item) S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft; sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft; - sRightNamePadding = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarName->getRect().mRight; S32 index = ALIC_COUNT; sChildrenWidths[--index] = icon_width; @@ -547,7 +568,7 @@ void LLAvatarListItem::updateChildren() // apply paddings name_new_width -= sLeftPadding; - name_new_width -= sRightNamePadding; + name_new_width -= sNameRightPadding; name_view_rect.setLeftTopAndSize( name_new_left, diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 52187284eb..c95ac39696 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -36,6 +36,7 @@ #include "llcallingcard.h" // for LLFriendObserver class LLAvatarIconCtrl; +class LLAvatarName; class LLIconCtrl; class LLAvatarListItem : public LLPanel, public LLFriendObserver @@ -50,6 +51,8 @@ public: online_style, offline_style; + Optional<S32> name_right_pad; + Params(); }; @@ -86,7 +89,9 @@ public: virtual void changed(U32 mask); // from LLFriendObserver void setOnline(bool online); - void setName(const std::string& name); + void updateAvatarName(); // re-query the name cache + void setAvatarName(const std::string& name); + void setAvatarToolTip(const std::string& tooltip); void setHighlight(const std::string& highlight); void setState(EItemState item_style); void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true); @@ -100,7 +105,8 @@ public: void setAvatarIconVisible(bool visible); const LLUUID& getAvatarId() const; - const std::string getAvatarName() const; + std::string getAvatarName() const; + std::string getAvatarToolTip() const; void onInfoBtnClick(); void onProfileBtnClick(); @@ -154,7 +160,7 @@ private: } EAvatarListItemChildIndex; void setNameInternal(const std::string& name, const std::string& highlight); - void onNameCache(const std::string& first_name, const std::string& last_name); + void onAvatarNameCache(const LLAvatarName& av_name); std::string formatSeconds(U32 secs); @@ -211,7 +217,7 @@ private: 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 + static S32 sNameRightPadding; // right padding from name to next visible child /** * Contains widths of each child specified by EAvatarListItemChildIndex diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 29f4311ea4..29c2b7565e 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -41,6 +41,7 @@ #include "llagentcamera.h" #include "llchiclet.h" #include "llfloatercamera.h" +#include "llhints.h" #include "llimfloater.h" // for LLIMFloater #include "llnearbychatbar.h" #include "llspeakbutton.h" @@ -104,10 +105,6 @@ template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance(); namespace { const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel"; - const std::string& PANEL_CHATBAR_NAME = "chat_bar"; - const std::string& PANEL_MOVEMENT_NAME = "movement_panel"; - const std::string& PANEL_CAMERA_NAME = "cam_panel"; - const std::string& PANEL_GESTURE_NAME = "gesture_panel"; S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel) { @@ -115,7 +112,7 @@ namespace llassert(stack); if ( stack && panel && panel->getVisible() ) { - stack->getPanelMinSize(panel->getName(), &minimal_width, NULL); + stack->getPanelMinSize(panel->getName(), &minimal_width); } return minimal_width; } @@ -126,7 +123,7 @@ namespace llassert(stack); if ( stack && panel && panel->getVisible() ) { - stack->getPanelMaxSize(panel->getName(), &max_width, NULL); + stack->getPanelMaxSize(panel->getName(), &max_width); } return max_width; } @@ -148,26 +145,30 @@ class LLBottomTrayLite public: LLBottomTrayLite() : mNearbyChatBar(NULL), + mChatBarContainer(NULL), mGesturePanel(NULL) { mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_bottomtray_lite.xml"); + buildFromFile("panel_bottomtray_lite.xml"); // Necessary for focus movement among child controls setFocusRoot(TRUE); } BOOL postBuild() { - mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); + mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar"); + mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel"); mGesturePanel = getChild<LLPanel>("gesture_panel"); // Hide "show_nearby_chat" button - LLLineEditor* chat_box = mNearbyChatBar->getChatBox(); - LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat"); - S32 delta_width = show_btn->getRect().getWidth(); - show_btn->setVisible(FALSE); - chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight()); - + if (mNearbyChatBar) + { + LLLineEditor* chat_box = mNearbyChatBar->getChatBox(); + LLUICtrl* show_btn = mNearbyChatBar->getChild<LLUICtrl>("show_nearby_chat"); + S32 delta_width = show_btn->getRect().getWidth(); + show_btn->setVisible(FALSE); + chat_box->reshape(chat_box->getRect().getWidth() + delta_width, chat_box->getRect().getHeight()); + } return TRUE; } @@ -180,6 +181,7 @@ public: } LLNearbyChatBar* mNearbyChatBar; + LLLayoutPanel* mChatBarContainer; LLPanel* mGesturePanel; }; @@ -188,17 +190,18 @@ LLBottomTray::LLBottomTray(const LLSD&) mSpeakPanel(NULL), mSpeakBtn(NULL), mNearbyChatBar(NULL), - mToolbarStack(NULL) -, mMovementButton(NULL) -, mResizeState(RS_NORESIZE) -, mBottomTrayContextMenu(NULL) -, mCamButton(NULL) -, mBottomTrayLite(NULL) -, mIsInLiteMode(false) -, mDragStarted(false) -, mDraggedItem(NULL) -, mLandingTab(NULL) -, mCheckForDrag(false) + mChatBarContainer(NULL), + mToolbarStack(NULL), + mMovementButton(NULL), + mResizeState(RS_NORESIZE), + mBottomTrayContextMenu(NULL), + mCamButton(NULL), + mBottomTrayLite(NULL), + mIsInLiteMode(false), + mDragStarted(false), + mDraggedItem(NULL), + mLandingTab(NULL), + mCheckForDrag(false) { // Firstly add ourself to IMSession observers, so we catch session events // before chiclets do that. @@ -206,7 +209,7 @@ LLBottomTray::LLBottomTray(const LLSD&) mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); - LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml"); + buildFromFile("panel_bottomtray.xml"); LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2)); @@ -225,6 +228,7 @@ LLBottomTray::LLBottomTray(const LLSD&) } mImageDragIndication = LLUI::getUIImage(getString("DragIndicationImageName")); + mDesiredNearbyChatWidth = mNearbyChatBar ? mNearbyChatBar->getRect().getWidth() : 0; } LLBottomTray::~LLBottomTray() @@ -237,7 +241,7 @@ LLBottomTray::~LLBottomTray() if (mNearbyChatBar) { // store custom width of chatbar panel. - S32 custom_width = mNearbyChatBar->getRect().getWidth(); + S32 custom_width = mChatBarContainer->getRect().getWidth(); gSavedSettings.setS32("ChatBarCustomWidth", custom_width); } @@ -432,7 +436,7 @@ S32 LLBottomTray::notifyParent(const LLSD& info) const std::string& name = info["view_name"]; // expected only resize of nearby chatbar - if (mNearbyChatBar->getName() != name) return LLPanel::notifyParent(info); + if (mChatBarContainer->getName() != name) return LLPanel::notifyParent(info); const S32 new_width = info["new_width"]; @@ -462,8 +466,8 @@ void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask) { LLUICtrl* edit_box = mNearbyChatBar->getChild<LLUICtrl>("chat_box"); - S32 local_x = x - mNearbyChatBar->getRect().mLeft - edit_box->getRect().mLeft; - S32 local_y = y - mNearbyChatBar->getRect().mBottom - edit_box->getRect().mBottom; + S32 local_x = x - mChatBarContainer->getRect().mLeft - edit_box->getRect().mLeft; + S32 local_y = y - mChatBarContainer->getRect().mBottom - edit_box->getRect().mBottom; bool in_edit_box = edit_box->pointInView(local_x, local_y); @@ -516,10 +520,14 @@ BOOL LLBottomTray::postBuild() mBottomTrayContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_bottomtray.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); gMenuHolder->addChild(mBottomTrayContextMenu); + mNearbyChatBar = findChild<LLNearbyChatBar>("chat_bar"); + LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle()); + + mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel"); - mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar"); mToolbarStack = getChild<LLLayoutStack>("toolbar_stack"); mMovementButton = getChild<LLButton>("movement_btn"); + LLHints::registerHintTarget("move_btn", mMovementButton->getHandle()); mCamButton = getChild<LLButton>("camera_btn"); setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4)); @@ -762,7 +770,7 @@ void LLBottomTray::loadButtonsOrder() } // Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it // manually here - mToolbarStack->movePanel(mNearbyChatBar, NULL, true); + mToolbarStack->movePanel(mChatBarContainer, NULL, true); } void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y) @@ -961,14 +969,15 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent) // we can not to do this from postBuild because reshape is called from parent view on startup // creation after it and reset width according to resize logic. static bool needs_restore_custom_state = true; - if (mNearbyChatBar && needs_restore_custom_state) + if (mChatBarContainer && needs_restore_custom_state) { // restore custom width of chatbar panel. S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth"); if (new_width > 0) { + mDesiredNearbyChatWidth = new_width; processChatbarCustomization(new_width); - mNearbyChatBar->reshape(new_width, mNearbyChatBar->getRect().getHeight()); + mChatBarContainer->reshape(new_width, mChatBarContainer->getRect().getHeight()); } needs_restore_custom_state = false; } @@ -982,6 +991,9 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + // There are four steps of processing width decrease. If in one of them required width was reached, + // further are not needed. + // 1. Decreasing width of chiclet panel. if (chiclet_panel_width > chiclet_panel_min_width) { // we have some space to decrease chiclet panel @@ -1007,8 +1019,15 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) << llendl; } - const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); - const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar); + S32 buttons_freed_width = 0; + // 2. Decreasing width of buttons. + if (still_should_be_processed) + { + processShrinkButtons(delta_width, buttons_freed_width); + } + // 3. Decreasing width of nearby chat. + const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mChatBarContainer); + const S32 chatbar_panel_width = mChatBarContainer->getRect().getWidth(); if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width) { // we have some space to decrease chatbar panel @@ -1021,7 +1040,11 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) still_should_be_processed = delta_width < 0; - mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight()); + // chatbar should only be shrunk here, not stretched + if(delta_panel > 0) + { + mChatBarContainer->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mChatBarContainer->getRect().getHeight()); + } log(mNearbyChatBar, "after processing panel decreasing via nearby chatbar panel"); @@ -1032,11 +1055,9 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) } S32 extra_shrink_width = 0; - S32 buttons_freed_width = 0; + // 4. Hiding buttons if needed. if (still_should_be_processed) { - processShrinkButtons(delta_width, buttons_freed_width); - processHideButtons(delta_width, buttons_freed_width); if (delta_width < 0) @@ -1048,10 +1069,15 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width) if (buttons_freed_width > 0) { - log(mNearbyChatBar, "before applying compensative width"); - mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() ); - log(mNearbyChatBar, "after applying compensative width"); - lldebugs << buttons_freed_width << llendl; + S32 nearby_needed_width = mDesiredNearbyChatWidth - mNearbyChatBar->getRect().getWidth(); + if (nearby_needed_width > 0) + { + S32 compensative_width = nearby_needed_width > buttons_freed_width ? buttons_freed_width : nearby_needed_width; + log(mNearbyChatBar, "before applying compensative width"); + mChatBarContainer->reshape(mChatBarContainer->getRect().getWidth() + compensative_width, mChatBarContainer->getRect().getHeight() ); + log(mNearbyChatBar, "after applying compensative width"); + lldebugs << buttons_freed_width << llendl; + } } } @@ -1065,18 +1091,12 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); - const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth(); - static const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar); - static const S32 chatbar_panel_max_width = get_panel_max_width(mToolbarStack, mNearbyChatBar); - - const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width; const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; // how many room we have to show hidden buttons - S32 total_available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet; + S32 total_available_width = delta_width + available_width_chiclet; lldebugs << "Processing extending, available width:" - << ", chatbar - " << chatbar_available_shrink_width << ", chiclets - " << available_width_chiclet << ", total - " << total_available_width << llendl; @@ -1085,8 +1105,6 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) processShowButtons(available_width); - processExtendButtons(available_width); - // if we have to show/extend some buttons but resized delta width is not enough... S32 processed_width = total_available_width - available_width; if (processed_width > delta_width) @@ -1097,21 +1115,7 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) // 1. use delta width of resizing required_to_process_width -= delta_width; - // 2. use width available via decreasing of nearby chat panel - S32 chatbar_shrink_width = required_to_process_width; - if (chatbar_available_shrink_width < chatbar_shrink_width) - { - chatbar_shrink_width = chatbar_available_shrink_width; - } - - log(mNearbyChatBar, "increase width: before applying compensative width"); - mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() ); - if (mNearbyChatBar) log(mNearbyChatBar, "after applying compensative width"); - lldebugs << chatbar_shrink_width << llendl; - - // 3. use width available via decreasing of chiclet panel - required_to_process_width -= chatbar_shrink_width; - + // 2. use width available via decreasing of chiclet panel if (required_to_process_width > 0) { mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight()); @@ -1126,10 +1130,10 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) // how many space can nearby chatbar take? - S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth(); - if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width) + S32 chatbar_panel_width_ = mChatBarContainer->getRect().getWidth(); + if (delta_width > 0 && chatbar_panel_width_ < mDesiredNearbyChatWidth) { - S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_; + S32 delta_panel_max = mDesiredNearbyChatWidth - chatbar_panel_width_; S32 delta_panel = llmin(delta_width, delta_panel_max); lldebugs << "Unprocesed delta width: " << delta_width << ", can be applied to chatbar: " << delta_panel_max @@ -1137,9 +1141,13 @@ void LLBottomTray::processWidthIncreased(S32 delta_width) << llendl; delta_width -= delta_panel_max; - mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight()); + mChatBarContainer->reshape(chatbar_panel_width_ + delta_panel, mChatBarContainer->getRect().getHeight()); log(mNearbyChatBar, "applied unprocessed delta width"); } + if (delta_width > 0) + { + processExtendButtons(delta_width); + } } void LLBottomTray::processShowButtons(S32& available_width) @@ -1259,7 +1267,7 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_ S32 panel_min_width = 0; std::string panel_name = mSpeakPanel->getName(); - bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL); + bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); if (!success) { lldebugs << "Panel was not found to get its min width: " << panel_name << llendl; @@ -1305,7 +1313,7 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& S32 panel_width = panel->getRect().getWidth(); S32 panel_min_width = 0; std::string panel_name = panel->getName(); - bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width, NULL); + bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width); S32 possible_shrink_width = panel_width - panel_min_width; if (!success) @@ -1597,7 +1605,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible { // Calculate the possible shrunk width as difference between current and minimal widths const S32 chatbar_shrunk_width = - mNearbyChatBar->getRect().getWidth() - get_panel_min_width(mToolbarStack, mNearbyChatBar); + mChatBarContainer->getRect().getWidth() - get_panel_min_width(mToolbarStack, mChatBarContainer); S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel); S32 sum_of_curr_widths = get_curr_width(mSpeakPanel); @@ -1617,7 +1625,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible // Minimal width of current panel S32 minimal_width = 0; - mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width, NULL); + mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width); if ( (available_width + possible_shrunk_width) >= minimal_width) { @@ -1694,10 +1702,12 @@ void LLBottomTray::processChatbarCustomization(S32 new_width) { if (NULL == mNearbyChatBar) return; - const S32 delta_width = mNearbyChatBar->getRect().getWidth() - new_width; + const S32 delta_width = mChatBarContainer->getRect().getWidth() - new_width; if (delta_width == 0) return; + mDesiredNearbyChatWidth = new_width; + LLView * chiclet_layout_panel = mChicletPanel->getParent(); const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel); const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth(); diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 1197c5a10a..8d8a42c553 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -27,20 +27,18 @@ #ifndef LL_LLBOTTOMPANEL_H #define LL_LLBOTTOMPANEL_H -#include "llmenugl.h" - #include "llpanel.h" #include "llimview.h" -#include "llcombobox.h" +#include "llbutton.h" class LLChicletPanel; -class LLLineEditor; class LLLayoutStack; -class LLNotificationChiclet; class LLSpeakButton; class LLNearbyChatBar; class LLIMChiclet; class LLBottomTrayLite; +class LLLayoutPanel; +class LLMenuGL; // Build time optimization, generate once in .cpp file #ifndef LLBOTTOMTRAY_CPP @@ -439,10 +437,15 @@ protected: void onContextMenuItemClicked(const LLSD& userdata); bool onContextMenuItemEnabled(const LLSD& userdata); + // Either default or saved after user's manual resize width of nearby chat. + // Nearby chat will not always have it, because sometimes it can be shrunk on resize, + // but when possible it will be restored back to this value. + S32 mDesiredNearbyChatWidth; LLChicletPanel* mChicletPanel; LLPanel* mSpeakPanel; LLSpeakButton* mSpeakBtn; LLNearbyChatBar* mNearbyChatBar; + LLLayoutPanel* mChatBarContainer; LLLayoutStack* mToolbarStack; LLMenuGL* mBottomTrayContextMenu; LLButton* mCamButton; diff --git a/indra/newview/llbrowsernotification.cpp b/indra/newview/llbrowsernotification.cpp new file mode 100644 index 0000000000..d6a813d608 --- /dev/null +++ b/indra/newview/llbrowsernotification.cpp @@ -0,0 +1,48 @@ +/** + * @file llbrowsernotification.cpp + * @brief Notification Handler Class for browser popups + * + * $LicenseInfo:firstyear=2000&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" // must be first include + +#include "llnotificationhandler.h" +#include "llnotifications.h" +#include "llfloaterreg.h" +#include "llmediactrl.h" + +using namespace LLNotificationsUI; + +bool LLBrowserNotification::processNotification(const LLSD& notify) +{ + LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + if (!notification) return false; + + LLMediaCtrl* media_instance = LLMediaCtrl::getInstance(notification->getPayload()["media_id"].asUUID()); + if (media_instance) + { + media_instance->showNotification(notification); + } + return false; +} diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index c78f73c3b8..b2e9564f7d 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -27,13 +27,14 @@ #include "llviewerprecompiledheaders.h" +#include "llcallfloater.h" + #include "llnotificationsutil.h" #include "lltrans.h" -#include "llcallfloater.h" - #include "llagent.h" #include "llagentdata.h" // for gAgentID +#include "llavatarnamecache.h" #include "llavatariconctrl.h" #include "llavatarlist.h" #include "llbottomtray.h" @@ -44,6 +45,8 @@ #include "llspeakers.h" #include "lltextutil.h" #include "lltransientfloatermgr.h" +#include "llviewercontrol.h" +#include "llviewerdisplayname.h" #include "llviewerwindow.h" #include "llvoicechannel.h" #include "llviewerparcelmgr.h" @@ -77,7 +80,8 @@ public: void setName(const std::string& name) { const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name); - LLAvatarListItem::setName(formatted_phone); + LLAvatarListItem::setAvatarName(formatted_phone); + LLAvatarListItem::setAvatarToolTip(formatted_phone); } void setSpeakerId(const LLUUID& id) { mSpeakingIndicator->setSpeakerId(id); } @@ -112,6 +116,11 @@ LLCallFloater::LLCallFloater(const LLSD& key) // force docked state since this floater doesn't save it between recreations setDocked(true); + + // update the agent's name if display name setting change + LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this)); + LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLCallFloater::updateAgentModeratorState, this)); + } LLCallFloater::~LLCallFloater() @@ -141,7 +150,7 @@ BOOL LLCallFloater::postBuild() childSetAction("leave_call_btn", boost::bind(&LLCallFloater::leaveCall, this)); - mNonAvatarCaller = getChild<LLNonAvatarCaller>("non_avatar_caller"); + mNonAvatarCaller = findChild<LLNonAvatarCaller>("non_avatar_caller"); mNonAvatarCaller->setVisible(FALSE); LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_flyout_btn"); @@ -327,8 +336,9 @@ void LLCallFloater::refreshParticipantList() { mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false); mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1)); - mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS); - + const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder"); + mParticipants->setSortOrder(LLParticipantList::EParticipantSortOrder(speaker_sort_order)); + if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager) { mAvatarList->setNoItemsCommentText(getString("no_one_near")); @@ -368,9 +378,31 @@ void LLCallFloater::sOnCurrentChannelChanged(const LLUUID& /*session_id*/) call_floater->connectToChannel(channel); } +void LLCallFloater::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) +{ + LLStringUtil::format_map_t args; + args["[NAME]"] = av_name.getCompleteName(); + std::string title = getString("title_peer_2_peer", args); + setTitle(title); +} + void LLCallFloater::updateTitle() { LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); + if (mVoiceType == VC_PEER_TO_PEER) + { + LLUUID session_id = voice_channel->getSessionID(); + LLIMModel::LLIMSession* im_session = + LLIMModel::getInstance()->findIMSession(session_id); + if (im_session) + { + LLAvatarNameCache::get(im_session->mOtherParticipantID, + boost::bind(&LLCallFloater::onAvatarNameCache, + this, _1, _2)); + return; + } + } std::string title; switch (mVoiceType) { @@ -415,9 +447,10 @@ void LLCallFloater::initAgentData() { mAgentPanel->getChild<LLUICtrl>("user_icon")->setValue(gAgentID); - std::string name; - gCacheName->getFullName(gAgentID, name); - mAgentPanel->getChild<LLUICtrl>("user_text")->setValue(name); + // Just use display name, because it's you + LLAvatarName av_name; + LLAvatarNameCache::get( gAgentID, &av_name ); + mAgentPanel->getChild<LLUICtrl>("user_text")->setValue(av_name.mDisplayName); mSpeakingIndicator = mAgentPanel->getChild<LLOutputMonitorCtrl>("speaking_indicator"); mSpeakingIndicator->setSpeakerId(gAgentID); @@ -435,12 +468,12 @@ void LLCallFloater::setModeratorMutedVoice(bool moderator_muted) mSpeakingIndicator->setIsMuted(moderator_muted); } -void LLCallFloater::updateAgentModeratorState() +void LLCallFloater::onModeratorNameCache(const LLAvatarName& av_name) { std::string name; - gCacheName->getFullName(gAgentID, name); + name = av_name.mDisplayName; - if(gAgent.isInGroup(mSpeakerManager->getSessionID())) + if(mSpeakerManager && gAgent.isInGroup(mSpeakerManager->getSessionID())) { // This method can be called when LLVoiceChannel.mState == STATE_NO_CHANNEL_INFO // in this case there are not any speakers yet. @@ -458,6 +491,11 @@ void LLCallFloater::updateAgentModeratorState() mAgentPanel->getChild<LLUICtrl>("user_text")->setValue(name); } +void LLCallFloater::updateAgentModeratorState() +{ + LLAvatarNameCache::get(gAgentID, boost::bind(&LLCallFloater::onModeratorNameCache, this, _2)); +} + static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids) { // Get a list of participants from VoiceClient diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 881f777b48..3bc7043353 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -34,6 +34,7 @@ class LLAvatarList; class LLAvatarListItem; +class LLAvatarName; class LLNonAvatarCaller; class LLOutputMonitorCtrl; class LLParticipantList; @@ -116,11 +117,16 @@ private: */ void onAvatarListRefreshed(); + /** + * Updates window title with an avatar name + */ + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); void updateTitle(); void initAgentData(); void setModeratorMutedVoice(bool moderator_muted); void updateAgentModeratorState(); + void onModeratorNameCache(const LLAvatarName& av_name); /** * Sets initial participants voice states in avatar list (Invited, Joined, Has Left). diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index a664dbe53a..0d55c4429a 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -37,6 +37,7 @@ //#include <iterator> #include "indra_constants.h" +#include "llavatarnamecache.h" #include "llcachename.h" #include "llstl.h" #include "lltimer.h" @@ -44,6 +45,7 @@ #include "message.h" #include "llagent.h" +#include "llavatarnamecache.h" #include "llbutton.h" #include "llinventoryobserver.h" #include "llinventorymodel.h" @@ -90,8 +92,10 @@ const F32 OFFLINE_SECONDS = FIND_FREQUENCY + 8.0f; // static LLAvatarTracker LLAvatarTracker::sInstance; - - +static void on_avatar_name_cache_notify(const LLUUID& agent_id, + const LLAvatarName& av_name, + bool online, + LLSD payload); ///---------------------------------------------------------------------------- /// Class LLAvatarTracker @@ -244,7 +248,7 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds) using namespace std; U32 new_buddy_count = 0; - std::string first,last; + std::string full_name; LLUUID agent_id; for(buddy_map_t::const_iterator itr = buds.begin(); itr != buds.end(); ++itr) { @@ -254,7 +258,8 @@ S32 LLAvatarTracker::addBuddyList(const LLAvatarTracker::buddy_map_t& buds) { ++new_buddy_count; mBuddyInfo[agent_id] = (*itr).second; - gCacheName->getName(agent_id, first, last); + // IDEVO: is this necessary? name is unused? + gCacheName->getFullName(agent_id, full_name); addChangedMask(LLFriendObserver::ADD, agent_id); lldebugs << "Added buddy " << agent_id << ", " << (mBuddyInfo[agent_id]->isOnline() ? "Online" : "Offline") @@ -627,12 +632,9 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg) { if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS) { - std::string name; LLSD args; - if(gCacheName->getFullName(agent_id, name)) - { - args["NAME"] = name; - } + args["NAME"] = LLSLURL("agent", agent_id, "displayname").getSLURLString(); + LLSD payload; payload["from_id"] = agent_id; if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights) @@ -674,8 +676,6 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) { tracking_id = mTrackingData->mAvatarID; } - BOOL notify = FALSE; - LLSD args; LLSD payload; for(S32 i = 0; i < count; ++i) { @@ -685,17 +685,6 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) if(info) { setBuddyOnline(agent_id,online); - if(chat_notify) - { - std::string first, last; - if(gCacheName->getName(agent_id, first, last)) - { - notify = TRUE; - args["FIRST"] = first; - args["LAST"] = last; - } - - } } else { @@ -711,29 +700,12 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) // *TODO: get actual inventory id gInventory.addChangedMask(LLInventoryObserver::CALLING_CARD, LLUUID::null); } - if(notify) + if(chat_notify) { - // Popup a notify box with online status of this agent - LLNotificationPtr notification; - - if (online) - { - notification = - LLNotificationsUtil::add("FriendOnline", - args, - payload.with("respond_on_mousedown", TRUE), - boost::bind(&LLAvatarActions::startIM, agent_id)); - } - else - { - notification = - LLNotificationsUtil::add("FriendOffline", args, payload); - } - - // If there's an open IM session with this agent, send a notification there too. - LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id); - std::string notify_msg = notification->getMessage(); - LLIMModel::instance().proccessOnlineOfflineNotification(session_id, notify_msg); + // Look up the name of this agent for the notification + LLAvatarNameCache::get(agent_id, + boost::bind(&on_avatar_name_cache_notify, + _1, _2, online, payload)); } mModifyMask |= LLFriendObserver::ONLINE; @@ -742,6 +714,37 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online) } } +static void on_avatar_name_cache_notify(const LLUUID& agent_id, + const LLAvatarName& av_name, + bool online, + LLSD payload) +{ + // Popup a notify box with online status of this agent + // Use display name only because this user is your friend + LLSD args; + args["NAME"] = av_name.mDisplayName; + + LLNotificationPtr notification; + if (online) + { + notification = + LLNotificationsUtil::add("FriendOnline", + args, + payload.with("respond_on_mousedown", TRUE), + boost::bind(&LLAvatarActions::startIM, agent_id)); + } + else + { + notification = + LLNotificationsUtil::add("FriendOffline", args, payload); + } + + // If there's an open IM session with this agent, send a notification there too. + LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id); + std::string notify_msg = notification->getMessage(); + LLIMModel::instance().proccessOnlineOfflineNotification(session_id, notify_msg); +} + void LLAvatarTracker::formFriendship(const LLUUID& id) { if(id.notNull()) @@ -862,10 +865,9 @@ bool LLCollectProxyBuddies::operator()(const LLUUID& buddy_id, LLRelationship* b bool LLCollectMappableBuddies::operator()(const LLUUID& buddy_id, LLRelationship* buddy) { - gCacheName->getName(buddy_id, mFirst, mLast); - std::ostringstream fullname; - fullname << mFirst << " " << mLast; - buddy_map_t::value_type value(fullname.str(), buddy_id); + LLAvatarName av_name; + LLAvatarNameCache::get( buddy_id, &av_name); + buddy_map_t::value_type value(av_name.mDisplayName, buddy_id); if(buddy->isOnline() && buddy->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) { mMappable.insert(value); @@ -875,10 +877,8 @@ bool LLCollectMappableBuddies::operator()(const LLUUID& buddy_id, LLRelationship bool LLCollectOnlineBuddies::operator()(const LLUUID& buddy_id, LLRelationship* buddy) { - gCacheName->getName(buddy_id, mFirst, mLast); - std::ostringstream fullname; - fullname << mFirst << " " << mLast; - buddy_map_t::value_type value(fullname.str(), buddy_id); + gCacheName->getFullName(buddy_id, mFullName); + buddy_map_t::value_type value(mFullName, buddy_id); if(buddy->isOnline()) { mOnline.insert(value); @@ -888,10 +888,10 @@ bool LLCollectOnlineBuddies::operator()(const LLUUID& buddy_id, LLRelationship* bool LLCollectAllBuddies::operator()(const LLUUID& buddy_id, LLRelationship* buddy) { - gCacheName->getName(buddy_id, mFirst, mLast); - std::ostringstream fullname; - fullname << mFirst << " " << mLast; - buddy_map_t::value_type value(fullname.str(), buddy_id); + LLAvatarName av_name; + LLAvatarNameCache::get(buddy_id, &av_name); + mFullName = av_name.mDisplayName; + buddy_map_t::value_type value(mFullName, buddy_id); if(buddy->isOnline()) { mOnline.insert(value); @@ -902,5 +902,3 @@ bool LLCollectAllBuddies::operator()(const LLUUID& buddy_id, LLRelationship* bud } return true; } - - diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h index 15ca51743a..8803cce59d 100644 --- a/indra/newview/llcallingcard.h +++ b/indra/newview/llcallingcard.h @@ -235,8 +235,7 @@ public: virtual bool operator()(const LLUUID& buddy_id, LLRelationship* buddy); typedef std::map<std::string, LLUUID, LLDictionaryLess> buddy_map_t; buddy_map_t mMappable; - std::string mFirst; - std::string mLast; + std::string mFullName; }; // collect dictionary sorted map of name -> agent_id for every online buddy @@ -248,8 +247,7 @@ public: virtual bool operator()(const LLUUID& buddy_id, LLRelationship* buddy); typedef std::map<std::string, LLUUID, LLDictionaryLess> buddy_map_t; buddy_map_t mOnline; - std::string mFirst; - std::string mLast; + std::string mFullName; }; // collect dictionary sorted map of name -> agent_id for every buddy, @@ -263,8 +261,7 @@ public: typedef std::map<std::string, LLUUID, LLDictionaryLess> buddy_map_t; buddy_map_t mOnline; buddy_map_t mOffline; - std::string mFirst; - std::string mLast; + std::string mFullName; }; #endif // LL_LLCALLINGCARD_H diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp index d251931eca..6e58be8174 100644 --- a/indra/newview/llchatbar.cpp +++ b/indra/newview/llchatbar.cpp @@ -565,6 +565,10 @@ void LLChatBar::sendChatFromViewer(const std::string &utf8text, EChatType type, void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate) { + // as soon as we say something, we no longer care about teaching the user + // how to chat + gWarningSettings.setBOOL("FirstOtherChatBeforeUser", FALSE); + // Look for "/20 foo" channel chats. S32 channel = 0; LLWString out_text = stripChannelNumber(wtext, &channel); @@ -685,14 +689,14 @@ public: } else { - S32 channel = tokens[0].asInteger(); + S32 channel = tokens[0].asInteger(); // VWR-19499 Restrict function to chat channels greater than 0. if ((channel > 0) && (channel < 2147483647)) { retval = true; // Say mesg on channel - std::string mesg = tokens[1].asString(); - send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel); + std::string mesg = tokens[1].asString(); + send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel); } else { diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index dfb1db523d..271ee0c4a4 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -26,10 +26,12 @@ #include "llviewerprecompiledheaders.h" +#include "llchathistory.h" + +#include "llavatarnamecache.h" #include "llinstantmessage.h" #include "llimview.h" -#include "llchathistory.h" #include "llcommandhandler.h" #include "llpanel.h" #include "lluictrlfactory.h" @@ -52,7 +54,9 @@ #include "llviewertexteditor.h" #include "llworld.h" #include "lluiconstants.h" +#include "llstring.h" +#include "llviewercontrol.h" #include "llsidetray.h"//for blocked objects panel @@ -98,10 +102,22 @@ LLObjectIMHandler gObjectIMHandler; class LLChatHistoryHeader: public LLPanel { public: + LLChatHistoryHeader() + : LLPanel(), + mPopupMenuHandleAvatar(), + mPopupMenuHandleObject(), + mAvatarID(), + mSourceType(CHAT_SOURCE_UNKNOWN), + mFrom(), + mSessionID(), + mMinUserNameWidth(0), + mUserNameFont(NULL) + {} + static LLChatHistoryHeader* createInstance(const std::string& file_name) { LLChatHistoryHeader* pInstance = new LLChatHistoryHeader; - LLUICtrlFactory::getInstance()->buildPanel(pInstance, file_name); + pInstance->buildFromFile(file_name); return pInstance; } @@ -240,35 +256,86 @@ public: mAvatarID = chat.mFromID; mSessionID = chat.mSessionID; mSourceType = chat.mSourceType; - gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4)); //*TODO overly defensive thing, source type should be maintained out there if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull()) { mSourceType = CHAT_SOURCE_SYSTEM; - } + } - LLTextBox* userName = getChild<LLTextBox>("user_name"); + mUserNameFont = style_params.font(); + LLTextBox* user_name = getChild<LLTextBox>("user_name"); + user_name->setReadOnlyColor(style_params.readonly_color()); + user_name->setColor(style_params.color()); - userName->setReadOnlyColor(style_params.readonly_color()); - userName->setColor(style_params.color()); - - userName->setValue(chat.mFromName); - mFrom = chat.mFromName; - if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType) + if (chat.mFromName.empty() + || mSourceType == CHAT_SOURCE_SYSTEM) { mFrom = LLTrans::getString("SECOND_LIFE"); - userName->setValue(mFrom); + user_name->setValue(mFrom); + updateMinUserNameWidth(); } + else if (mSourceType == CHAT_SOURCE_AGENT + && !mAvatarID.isNull() + && chat.mChatStyle != CHAT_STYLE_HISTORY) + { + // ...from a normal user, lookup the name and fill in later. + // *NOTE: Do not do this for chat history logs, otherwise the viewer + // will flood the People API with lookup requests on startup + + // Start with blank so sample data from XUI XML doesn't + // flash on the screen + user_name->setValue( LLSD() ); + LLAvatarNameCache::get(mAvatarID, + boost::bind(&LLChatHistoryHeader::onAvatarNameCache, this, _1, _2)); + } + else if (chat.mChatStyle == CHAT_STYLE_HISTORY || + mSourceType == CHAT_SOURCE_AGENT) + { + //if it's an avatar name with a username add formatting + S32 username_start = chat.mFromName.rfind(" ("); + S32 username_end = chat.mFromName.rfind(')'); + + if (username_start != std::string::npos && + username_end == (chat.mFromName.length() - 1)) + { + mFrom = chat.mFromName.substr(0, username_start); + user_name->setValue(mFrom); + if (gSavedSettings.getBOOL("NameTagShowUsernames")) + { + std::string username = chat.mFromName.substr(username_start + 2); + username = username.substr(0, username.length() - 1); + LLStyle::Params style_params_name; + LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor"); + style_params_name.color(userNameColor); + style_params_name.font.name("SansSerifSmall"); + style_params_name.font.style("NORMAL"); + style_params_name.readonly_color(userNameColor); + user_name->appendText(" - " + username, FALSE, style_params_name); + } + } + else + { + mFrom = chat.mFromName; + user_name->setValue(mFrom); + updateMinUserNameWidth(); + } + } + else + { + // ...from an object, just use name as given + mFrom = chat.mFromName; + user_name->setValue(mFrom); + updateMinUserNameWidth(); + } - mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING; setTimeField(chat); LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); - if(mSourceType != CHAT_SOURCE_AGENT) + if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull()) icon->setDrawTooltip(false); switch (mSourceType) @@ -317,12 +384,41 @@ public: LLPanel::draw(); } - void nameUpdatedCallback(const LLUUID& id,const std::string& first,const std::string& last,BOOL is_group) + void updateMinUserNameWidth() { - if (id != mAvatarID) - return; - mFrom = first + " " + last; + if (mUserNameFont) + { + LLTextBox* user_name = getChild<LLTextBox>("user_name"); + const LLWString& text = user_name->getWText(); + mMinUserNameWidth = mUserNameFont->getWidth(text.c_str()) + PADDING; + } + } + + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name) + { + mFrom = av_name.mDisplayName; + + LLTextBox* user_name = getChild<LLTextBox>("user_name"); + user_name->setValue( LLSD(av_name.mDisplayName ) ); + user_name->setToolTip( av_name.mUsername ); + + if (gSavedSettings.getBOOL("NameTagShowUsernames") && + LLAvatarNameCache::useDisplayNames() && + !av_name.mIsDisplayNameDefault) + { + LLStyle::Params style_params_name; + LLColor4 userNameColor = LLUIColorTable::instance().getColor("EmphasisColor"); + style_params_name.color(userNameColor); + style_params_name.font.name("SansSerifSmall"); + style_params_name.font.style("NORMAL"); + style_params_name.readonly_color(userNameColor); + user_name->appendText(" - " + av_name.mUsername, FALSE, style_params_name); + } + setToolTip( av_name.mUsername ); + // name might have changed, update width + updateMinUserNameWidth(); } + protected: static const S32 PADDING = 20; @@ -396,7 +492,7 @@ protected: return; } - LLTextBase* name = getChild<LLTextBase>("user_name"); + LLTextBox* name = getChild<LLTextBox>("user_name"); LLRect sticky_rect = name->getRect(); S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3); sInfoCtrl->setOrigin(icon_x, sticky_rect.getCenterY() - sInfoCtrl->getRect().getHeight() / 2 ) ; @@ -449,6 +545,7 @@ protected: LLUUID mSessionID; S32 mMinUserNameWidth; + const LLFontGL* mUserNameFont; }; LLUICtrl* LLChatHistoryHeader::sInfoCtrl = NULL; @@ -496,12 +593,17 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p) const S32 NEW_TEXT_NOTICE_HEIGHT = 20; - LLPanel::Params panel_p; + LLLayoutPanel::Params panel_p; panel_p.name = "spacer"; panel_p.background_visible = false; panel_p.has_border = false; panel_p.mouse_opaque = false; - stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, S32_MAX, S32_MAX, true, false, LLLayoutStack::ANIMATE); + panel_p.min_dim = 30; + panel_p.max_dim = S32_MAX; + panel_p.auto_resize = true; + panel_p.user_resize = false; + + stackp->addPanel(LLUICtrlFactory::create<LLLayoutPanel>(panel_p), LLLayoutStack::ANIMATE); panel_p.name = "new_text_notice_holder"; LLRect new_text_notice_rect = getLocalRect(); @@ -510,7 +612,10 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p) panel_p.background_opaque = true; panel_p.background_visible = true; panel_p.visible = false; - mMoreChatPanel = LLUICtrlFactory::create<LLPanel>(panel_p); + panel_p.min_dim = 0; + panel_p.auto_resize = false; + panel_p.user_resize = false; + mMoreChatPanel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); LLTextBox::Params text_p(p.more_chat_text); text_p.rect = mMoreChatPanel->getLocalRect(); @@ -519,7 +624,7 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p) mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel); mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this)); - stackp->addPanel(mMoreChatPanel, 0, 0, S32_MAX, S32_MAX, false, false, LLLayoutStack::ANIMATE); + stackp->addPanel(mMoreChatPanel, LLLayoutStack::ANIMATE); } @@ -685,21 +790,27 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL // (don't let object names with hyperlinks override our objectim Url) LLStyle::Params link_params(style_params); link_params.color.control = "HTMLLinkColor"; + link_params.is_link = true; link_params.link_href = url; - mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, + mEditor->appendText(chat.mFromName + delimiter, false, link_params); } else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log) { LLStyle::Params link_params(style_params); - link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); + + // Setting is_link = true for agent SLURL to avoid applying default style to it. + // See LLTextBase::appendTextImpl(). + link_params.is_link = true; + link_params.link_href = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString(); + // Add link to avatar's inspector and delimiter to message. - mEditor->appendText(link_params.link_href, false, style_params); + mEditor->appendText(chat.mFromName, false, link_params); mEditor->appendText(delimiter, false, style_params); } else { - mEditor->appendText(chat.mFromName + delimiter, false, style_params); + mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter, false, style_params); } } } diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index 112a33f1ee..ac48d7bf29 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -138,7 +138,7 @@ class LLChatHistory : public LLUICtrl S32 mTopHeaderPad; S32 mBottomHeaderPad; - LLPanel* mMoreChatPanel; + class LLLayoutPanel* mMoreChatPanel; LLTextBox* mMoreChatText; LLTextEditor* mEditor; typedef std::set<std::string> unread_chat_source_t; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 67b7ac5383..3afddc1145 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -31,6 +31,7 @@ #include "llchatmsgbox.h" #include "llavatariconctrl.h" +#include "llcommandhandler.h" #include "llfloaterreg.h" #include "lllocalcliprect.h" #include "lltrans.h" @@ -45,13 +46,47 @@ static const S32 msg_right_offset = 10; static const S32 msg_height_pad = 5; //******************************************************************************************************************* +// LLObjectHandler +//******************************************************************************************************************* + +// handle secondlife:///app/object/<ID>/inspect SLURLs +class LLObjectHandler : public LLCommandHandler +{ +public: + LLObjectHandler() : LLCommandHandler("object", UNTRUSTED_BLOCK) { } + + bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web) + { + if (params.size() < 2) return false; + + LLUUID object_id; + if (!object_id.set(params[0], FALSE)) + { + return false; + } + + const std::string verb = params[1].asString(); + + if (verb == "inspect") + { + LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", object_id)); + return true; + } + + return false; + } +}; + +LLObjectHandler gObjectHandler; + +//******************************************************************************************************************* //LLNearbyChatToastPanel //******************************************************************************************************************* LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance() { LLNearbyChatToastPanel* item = new LLNearbyChatToastPanel(); - LLUICtrlFactory::getInstance()->buildPanel(item, "panel_chat_item.xml"); + item->buildFromFile("panel_chat_item.xml"); item->setFollows(FOLLOWS_NONE); return item; } @@ -173,24 +208,39 @@ void LLNearbyChatToastPanel::init(LLSD& notification) str_sender+=" "; - //append user name + //append sender name + if (mSourceType == CHAT_SOURCE_AGENT || mSourceType == CHAT_SOURCE_OBJECT) { LLStyle::Params style_params_name; - LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor"); + std::string href; + + if (mSourceType == CHAT_SOURCE_AGENT) + { + href = LLSLURL("agent", mFromID, "about").getSLURLString(); + } + else + { + href = LLSLURL("object", mFromID, "inspect").getSLURLString(); + } - style_params_name.color(userNameColor); + style_params_name.color(textColor); std::string font_name = LLFontGL::nameFromFont(messageFont); std::string font_style_size = LLFontGL::sizeFromFont(messageFont); style_params_name.font.name(font_name); style_params_name.font.size(font_style_size); - style_params_name.link_href = LLSLURL("agent",mFromID,"about").getSLURLString(); + style_params_name.link_href = href; + style_params_name.is_link = true; msg_text->appendText(str_sender, FALSE, style_params_name); } + else + { + msg_text->appendText(str_sender, false); + } } //append text diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index c9a526a3be..e7634ff0f4 100644 --- a/indra/newview/llcolorswatch.cpp +++ b/indra/newview/llcolorswatch.cpp @@ -53,6 +53,7 @@ LLColorSwatchCtrl::Params::Params() alpha_background_image("alpha_background_image"), border_color("border_color"), label_width("label_width", -1), + label_height("label_height", -1), caption_text("caption_text"), border("border") { @@ -68,17 +69,20 @@ LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p) mOnCancelCallback(p.cancel_callback()), mOnSelectCallback(p.select_callback()), mBorderColor(p.border_color()), - mLabelWidth(p.label_width) + mLabelWidth(p.label_width), + mLabelHeight(p.label_height) { LLTextBox::Params tp = p.caption_text; + // use custom label height if it is provided + mLabelHeight = mLabelHeight != -1 ? mLabelHeight : BTN_HEIGHT_SMALL; // label_width is specified, not -1 if(mLabelWidth!= -1) { - tp.rect(LLRect( 0, BTN_HEIGHT_SMALL, mLabelWidth, 0 )); + tp.rect(LLRect( 0, mLabelHeight, mLabelWidth, 0 )); } else { - tp.rect(LLRect( 0, BTN_HEIGHT_SMALL, getRect().getWidth(), 0 )); + tp.rect(LLRect( 0, mLabelHeight, getRect().getWidth(), 0 )); } tp.initial_value(p.label()); @@ -88,7 +92,7 @@ LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p) LLRect border_rect = getLocalRect(); border_rect.mTop -= 1; border_rect.mRight -=1; - border_rect.mBottom += BTN_HEIGHT_SMALL; + border_rect.mBottom += mLabelHeight; LLViewBorder::Params params = p.border; params.rect(border_rect); @@ -194,7 +198,7 @@ void LLColorSwatchCtrl::draw() F32 alpha = getDrawContext().mAlpha; mBorder->setKeyboardFocusHighlight(hasFocus()); // Draw border - LLRect border( 0, getRect().getHeight(), getRect().getWidth(), BTN_HEIGHT_SMALL ); + LLRect border( 0, getRect().getHeight(), getRect().getWidth(), mLabelHeight ); gl_rect_2d( border, mBorderColor.get(), FALSE ); LLRect interior = border; diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h index a4ce1ca099..cd859ea128 100644 --- a/indra/newview/llcolorswatch.h +++ b/indra/newview/llcolorswatch.h @@ -61,6 +61,7 @@ public: Optional<commit_callback_t> select_callback; Optional<LLUIColor> border_color; Optional<S32> label_width; + Optional<S32> label_height; Optional<LLTextBox::Params> caption_text; Optional<LLViewBorder::Params> border; @@ -112,6 +113,7 @@ protected: commit_callback_t mOnCancelCallback; commit_callback_t mOnSelectCallback; S32 mLabelWidth; + S32 mLabelHeight; LLPointer<LLUIImage> mAlphaGradientImage; std::string mFallbackImageName; diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index ee8646aad0..f31ff14df6 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -267,7 +267,11 @@ bool LLCommandLineParser::parseAndStoreResults(po::command_line_parser& clp) { clp.options(gOptionsDesc); clp.positional(gPositionalOptions); - clp.style(po::command_line_style::default_style + // SNOW-626: Boost 1.42 erroneously added allow_guessing to the default style + // (see http://groups.google.com/group/boost-list/browse_thread/thread/545d7bf98ff9bb16?fwc=2&pli=1) + // Remove allow_guessing from the default style, because that is not allowed + // when we have options that are a prefix of other options (aka, --help and --helperuri). + clp.style((po::command_line_style::default_style & ~po::command_line_style::allow_guessing) | po::command_line_style::allow_long_disguise); if(mExtraParser) { diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp index 268d9958d1..a42677845e 100644 --- a/indra/newview/llcompilequeue.cpp +++ b/indra/newview/llcompilequeue.cpp @@ -89,7 +89,6 @@ LLFloaterScriptQueue::LLFloaterScriptQueue(const LLSD& key) : mDone(false), mMono(false) { - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_script_queue.xml", FALSE); } // Destroys the object diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp index e575e06c5a..fcc73a07bc 100644 --- a/indra/newview/lldateutil.cpp +++ b/indra/newview/lldateutil.cpp @@ -166,3 +166,23 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string) { return ageFromDate(date_string, LLDate::now()); } + +//std::string LLDateUtil::ageFromDateISO(const std::string& date_string, +// const LLDate& now) +//{ +// S32 born_month, born_day, born_year; +// S32 matched = sscanf(date_string.c_str(), "%d-%d-%d", +// &born_year, &born_month, &born_day); +// if (matched != 3) return "???"; +// date.fromYMDHMS(year, month, day); +// F64 secs_since_epoch = date.secondsSinceEpoch(); +// // Correct for the fact that specified date is in Pacific time, == UTC - 8 +// secs_since_epoch += 8.0 * 60.0 * 60.0; +// date.secondsSinceEpoch(secs_since_epoch); +// return ageFromDate(born_year, born_month, born_day, now); +//} +// +//std::string LLDateUtil::ageFromDateISO(const std::string& date_string) +//{ +// return ageFromDateISO(date_string, LLDate::now()); +//} diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h index 5b465367dc..2843a357c9 100644 --- a/indra/newview/lldateutil.h +++ b/indra/newview/lldateutil.h @@ -61,6 +61,14 @@ namespace LLDateUtil // Calls the above with LLDate::now() std::string ageFromDate(const std::string& date_string); + + // As above, for YYYY-MM-DD dates + //std::string ageFromDateISO(const std::string& date_string, const LLDate& now); + + // Calls the above with LLDate::now() + //std::string ageFromDateISO(const std::string& date_string); + + //std::string ageFromDate(S32 born_year, S32 born_month, S32 born_day, const LLDate& now); } #endif diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp index 583bb54160..8106fada11 100644 --- a/indra/newview/lldrawable.cpp +++ b/indra/newview/lldrawable.cpp @@ -358,6 +358,7 @@ void LLDrawable::makeActive() { U32 pcode = mVObjp->getPCode(); if (pcode == LLViewerObject::LL_VO_WATER || + pcode == LLViewerObject::LL_VO_VOID_WATER || pcode == LLViewerObject::LL_VO_SURFACE_PATCH || pcode == LLViewerObject::LL_VO_PART_GROUP || pcode == LLViewerObject::LL_VO_HUD_PART_GROUP || diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h index 9cf9b69d3e..2cea41df0a 100644 --- a/indra/newview/lldrawable.h +++ b/indra/newview/lldrawable.h @@ -47,6 +47,7 @@ class LLCamera; class LLDrawPool; class LLDrawable; class LLFace; +class LLFacePool; class LLSpatialGroup; class LLSpatialBridge; class LLSpatialPartition; diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp index cb651f9d3a..ba576ff97f 100644 --- a/indra/newview/lldrawpool.cpp +++ b/indra/newview/lldrawpool.cpp @@ -89,6 +89,7 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0) case POOL_SKY: poolp = new LLDrawPoolSky(); break; + case POOL_VOIDWATER: case POOL_WATER: poolp = new LLDrawPoolWater(); break; diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index 221f81ec25..1d6f99d346 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -57,6 +57,7 @@ public: POOL_BUMP, POOL_INVISIBLE, // see below * POOL_AVATAR, + POOL_VOIDWATER, POOL_WATER, POOL_GLOW, POOL_ALPHA, @@ -167,7 +168,6 @@ public: LLFacePool(const U32 type); virtual ~LLFacePool(); - virtual void renderForSelect() = 0; BOOL isDead() { return mReferences.empty(); } virtual LLViewerTexture *getTexture(); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 8cf4dc1b95..dbd5da31a6 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -743,79 +743,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) } } -//----------------------------------------------------------------------------- -// renderForSelect() -//----------------------------------------------------------------------------- -void LLDrawPoolAvatar::renderForSelect() -{ - - - if (mDrawFace.empty()) - { - return; - } - - const LLFace *facep = mDrawFace[0]; - if (!facep->getDrawable()) - { - return; - } - LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get(); - - if (avatarp->isDead() || avatarp->mIsDummy || avatarp->mDrawable.isNull()) - { - return; - } - - S32 curr_shader_level = getVertexShaderLevel(); - S32 name = avatarp->mDrawable->getVObj()->mGLName; - LLColor4U color((U8)(name >> 16), (U8)(name >> 8), (U8)name); - - BOOL impostor = avatarp->isImpostor(); - if (impostor) - { - gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_COLOR); - gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); - - avatarp->renderImpostor(color); - - gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); - return; - } - - sVertexProgram = &gAvatarPickProgram; - if (curr_shader_level > 0) - { - gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX]; - } - gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f); - gGL.setSceneBlendType(LLRender::BT_REPLACE); - - glColor4ubv(color.mV); - - if (curr_shader_level > 0) // for hardware blending - { - sRenderingSkinned = TRUE; - sVertexProgram->bind(); - enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]); - } - - avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE); - - // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done - if (curr_shader_level > 0) - { - sRenderingSkinned = FALSE; - sVertexProgram->unbind(); - disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]); - } - - gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - // restore texture mode - gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); -} //----------------------------------------------------------------------------- // getDebugTexture() diff --git a/indra/newview/lldrawpoolavatar.h b/indra/newview/lldrawpoolavatar.h index c46fed824e..f536d3c911 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -64,7 +64,6 @@ public: /*virtual*/ void endRenderPass(S32 pass); /*virtual*/ void prerender(); /*virtual*/ void render(S32 pass = 0); - /*virtual*/ void renderForSelect(); /*virtual*/ S32 getNumDeferredPasses(); /*virtual*/ void beginDeferredPass(S32 pass); diff --git a/indra/newview/lldrawpoolclouds.cpp b/indra/newview/lldrawpoolclouds.cpp index f7da144671..5db1d8cfed 100644 --- a/indra/newview/lldrawpoolclouds.cpp +++ b/indra/newview/lldrawpoolclouds.cpp @@ -95,6 +95,3 @@ void LLDrawPoolClouds::render(S32 pass) } -void LLDrawPoolClouds::renderForSelect() -{ -} diff --git a/indra/newview/lldrawpoolclouds.h b/indra/newview/lldrawpoolclouds.h index 548720ed9c..019f11a795 100644 --- a/indra/newview/lldrawpoolclouds.h +++ b/indra/newview/lldrawpoolclouds.h @@ -49,7 +49,6 @@ public: /*virtual*/ void enqueue(LLFace *face); /*virtual*/ void beginRenderPass(S32 pass); /*virtual*/ void render(S32 pass = 0); - /*virtual*/ void renderForSelect(); }; #endif // LL_LLDRAWPOOLSKY_H diff --git a/indra/newview/lldrawpoolground.cpp b/indra/newview/lldrawpoolground.cpp index e950fbfa82..ce07e62122 100644 --- a/indra/newview/lldrawpoolground.cpp +++ b/indra/newview/lldrawpoolground.cpp @@ -68,7 +68,7 @@ void LLDrawPoolGround::render(S32 pass) LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - LLGLClampToFarClip far_clip(glh_get_current_projection()); + LLGLSquashToFarClip far_clip(glh_get_current_projection()); F32 water_height = gAgent.getRegion()->getWaterHeight(); glPushMatrix(); @@ -85,7 +85,3 @@ void LLDrawPoolGround::render(S32 pass) glPopMatrix(); } -void LLDrawPoolGround::renderForSelect() -{ -} - diff --git a/indra/newview/lldrawpoolground.h b/indra/newview/lldrawpoolground.h index c6c7cbf964..a4f8a3fcf5 100644 --- a/indra/newview/lldrawpoolground.h +++ b/indra/newview/lldrawpoolground.h @@ -47,7 +47,6 @@ public: /*virtual*/ void prerender(); /*virtual*/ void render(S32 pass = 0); - /*virtual*/ void renderForSelect(); }; #endif // LL_LLDRAWPOOLGROUND_H diff --git a/indra/newview/lldrawpoolsky.cpp b/indra/newview/lldrawpoolsky.cpp index d811ab8c54..6b45c5abb0 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -97,7 +97,7 @@ void LLDrawPoolSky::render(S32 pass) LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - LLGLClampToFarClip far_clip(glh_get_current_projection()); + LLGLSquashToFarClip far_clip(glh_get_current_projection()); LLGLEnable fog_enable( (mVertexShaderLevel < 1 && LLViewerCamera::getInstance()->cameraUnderWater()) ? GL_FOG : 0); @@ -143,10 +143,6 @@ void LLDrawPoolSky::renderSkyCubeFace(U8 side) } } -void LLDrawPoolSky::renderForSelect() -{ -} - void LLDrawPoolSky::endRenderPass( S32 pass ) { } diff --git a/indra/newview/lldrawpoolsky.h b/indra/newview/lldrawpoolsky.h index 15d643c886..098bd2134a 100644 --- a/indra/newview/lldrawpoolsky.h +++ b/indra/newview/lldrawpoolsky.h @@ -58,7 +58,6 @@ public: /*virtual*/ void prerender(); /*virtual*/ void render(S32 pass = 0); - /*virtual*/ void renderForSelect(); /*virtual*/ void endRenderPass(S32 pass); void setSkyTex(LLSkyTex* const st) { mSkyTex = st; } diff --git a/indra/newview/lldrawpoolterrain.cpp b/indra/newview/lldrawpoolterrain.cpp index 3dede9d8fc..84eeace9c6 100644 --- a/indra/newview/lldrawpoolterrain.cpp +++ b/indra/newview/lldrawpoolterrain.cpp @@ -899,27 +899,6 @@ void LLDrawPoolTerrain::renderOwnership() } -void LLDrawPoolTerrain::renderForSelect() -{ - if (mDrawFace.empty()) - { - return; - } - - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); - iter != mDrawFace.end(); iter++) - { - LLFace *facep = *iter; - if (!facep->getDrawable()->isDead() && (facep->getDrawable()->getVObj()->mGLName)) - { - facep->renderForSelect(LLVertexBuffer::MAP_VERTEX); - } - } -} - void LLDrawPoolTerrain::dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures) { LLViewerFetchedTexture* tex = LLViewerTextureManager::staticCastToFetchedTexture(mTexturep) ; diff --git a/indra/newview/lldrawpoolterrain.h b/indra/newview/lldrawpoolterrain.h index 730298609d..3056da44d5 100644 --- a/indra/newview/lldrawpoolterrain.h +++ b/indra/newview/lldrawpoolterrain.h @@ -66,7 +66,6 @@ public: /*virtual*/ void prerender(); /*virtual*/ void beginRenderPass( S32 pass ); /*virtual*/ void endRenderPass( S32 pass ); - /*virtual*/ void renderForSelect(); /*virtual*/ void dirtyTextures(const std::set<LLViewerFetchedTexture*>& textures); /*virtual*/ LLViewerTexture *getTexture(); /*virtual*/ LLViewerTexture *getDebugTexture(); diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp index 09cca8b73c..f1198c9a8d 100644 --- a/indra/newview/lldrawpooltree.cpp +++ b/indra/newview/lldrawpooltree.cpp @@ -183,68 +183,6 @@ void LLDrawPoolTree::endShadowPass(S32 pass) } -void LLDrawPoolTree::renderForSelect() -{ - if (mDrawFace.empty()) - { - return; - } - - LLOverrideFaceColor color(this, 1.f, 1.f, 1.f, 1.f); - - LLGLSObjectSelectAlpha gls_alpha; - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - gGL.setSceneBlendType(LLRender::BT_REPLACE); - gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f); - - gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); - gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); - - if (gSavedSettings.getBOOL("RenderAnimateTrees")) - { - renderTree(TRUE); - } - else - { - gGL.getTexUnit(sDiffTex)->bind(mTexturep); - - for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); - iter != mDrawFace.end(); iter++) - { - LLFace *face = *iter; - LLDrawable *drawablep = face->getDrawable(); - - if (drawablep->isDead() || face->mVertexBuffer.isNull()) - { - continue; - } - - // Render each of the trees - LLVOTree *treep = (LLVOTree *)drawablep->getVObj().get(); - - LLColor4U color(255,255,255,255); - - if (treep->mGLName != 0) - { - S32 name = treep->mGLName; - color = LLColor4U((U8)(name >> 16), (U8)(name >> 8), (U8)name, 255); - - LLFacePool::LLOverrideFaceColor col(this, color); - - face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK); - face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0); - gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()); - } - } - } - - gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); - gGL.setSceneBlendType(LLRender::BT_ALPHA); - - gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); -} - void LLDrawPoolTree::renderTree(BOOL selecting) { LLGLState normalize(GL_NORMALIZE, TRUE); diff --git a/indra/newview/lldrawpooltree.h b/indra/newview/lldrawpooltree.h index cebe41f75f..ddb259bb82 100644 --- a/indra/newview/lldrawpooltree.h +++ b/indra/newview/lldrawpooltree.h @@ -62,7 +62,6 @@ public: /*virtual*/ void render(S32 pass = 0); /*virtual*/ void endRenderPass( S32 pass ); /*virtual*/ S32 getNumPasses() { return 1; } - /*virtual*/ void renderForSelect(); /*virtual*/ BOOL verify() const; /*virtual*/ LLViewerTexture *getTexture(); /*virtual*/ LLViewerTexture *getDebugTexture(); diff --git a/indra/newview/lldrawpoolwater.cpp b/indra/newview/lldrawpoolwater.cpp index ce1b899d55..dc94924da4 100644 --- a/indra/newview/lldrawpoolwater.cpp +++ b/indra/newview/lldrawpoolwater.cpp @@ -48,7 +48,8 @@ #include "llviewershadermgr.h" #include "llwaterparammanager.h" -const LLUUID WATER_TEST("2bfd3884-7e27-69b9-ba3a-3e673f680004"); +const LLUUID TRANSPARENT_WATER_TEXTURE("2bfd3884-7e27-69b9-ba3a-3e673f680004"); +const LLUUID OPAQUE_WATER_TEXTURE("43c32285-d658-1793-c123-bf86315de055"); static float sTime; @@ -71,10 +72,14 @@ LLDrawPoolWater::LLDrawPoolWater() : gGL.getTexUnit(0)->bind(mHBTex[1]); mHBTex[1]->setAddressMode(LLTexUnit::TAM_CLAMP); - mWaterImagep = LLViewerTextureManager::getFetchedTexture(WATER_TEST); - mWaterImagep->setNoDelete() ; + + mWaterImagep = LLViewerTextureManager::getFetchedTexture(TRANSPARENT_WATER_TEXTURE); + llassert(mWaterImagep); + mWaterImagep->setNoDelete(); + mOpaqueWaterImagep = LLViewerTextureManager::getFetchedTexture(OPAQUE_WATER_TEXTURE); + llassert(mOpaqueWaterImagep); mWaterNormp = LLViewerTextureManager::getFetchedTexture(DEFAULT_WATER_NORMAL); - mWaterNormp->setNoDelete() ; + mWaterNormp->setNoDelete(); restoreGL(); } @@ -161,6 +166,14 @@ void LLDrawPoolWater::render(S32 pass) std::sort(mDrawFace.begin(), mDrawFace.end(), LLFace::CompareDistanceGreater()); + // See if we are rendering water as opaque or not + if (!gSavedSettings.getBOOL("RenderTransparentWater")) + { + // render water for low end hardware + renderOpaqueLegacyWater(); + return; + } + LLGLEnable blend(GL_BLEND); if ((mVertexShaderLevel > 0) && !sSkipScreenCopy) @@ -314,6 +327,87 @@ void LLDrawPoolWater::render(S32 pass) gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); } +// for low end hardware +void LLDrawPoolWater::renderOpaqueLegacyWater() +{ + LLVOSky *voskyp = gSky.mVOSkyp; + + stop_glerror(); + + // Depth sorting and write to depth buffer + // since this is opaque, we should see nothing + // behind the water. No blending because + // of no transparency. And no face culling so + // that the underside of the water is also opaque. + LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE); + LLGLDisable no_cull(GL_CULL_FACE); + LLGLDisable no_blend(GL_BLEND); + + gPipeline.disableLights(); + + mOpaqueWaterImagep->addTextureStats(1024.f*1024.f); + + // Activate the texture binding and bind one + // texture since all images will have the same texture + gGL.getTexUnit(0)->activate(); + gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(0)->bind(mOpaqueWaterImagep); + + // Automatically generate texture coords for water texture + glEnable(GL_TEXTURE_GEN_S); //texture unit 0 + glEnable(GL_TEXTURE_GEN_T); //texture unit 0 + glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); + + // Use the fact that we know all water faces are the same size + // to save some computation + + // Slowly move texture coordinates over time so the watter appears + // to be moving. + F32 movement_period_secs = 50.f; + + F32 offset = fmod(gFrameTimeSeconds, movement_period_secs); + + if (movement_period_secs != 0) + { + offset /= movement_period_secs; + } + else + { + offset = 0; + } + + F32 tp0[4] = { 16.f / 256.f, 0.0f, 0.0f, offset }; + F32 tp1[4] = { 0.0f, 16.f / 256.f, 0.0f, offset }; + + glTexGenfv(GL_S, GL_OBJECT_PLANE, tp0); + glTexGenfv(GL_T, GL_OBJECT_PLANE, tp1); + + glColor3f(1.f, 1.f, 1.f); + + for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); + iter != mDrawFace.end(); iter++) + { + LLFace *face = *iter; + if (voskyp->isReflFace(face)) + { + continue; + } + + face->renderIndexed(); + } + + stop_glerror(); + + // Reset the settings back to expected values + glDisable(GL_TEXTURE_GEN_S); //texture unit 0 + glDisable(GL_TEXTURE_GEN_T); //texture unit 0 + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); +} + + void LLDrawPoolWater::renderReflection(LLFace* face) { LLVOSky *voskyp = gSky.mVOSkyp; @@ -532,6 +626,7 @@ void LLDrawPoolWater::shade() glColor4fv(water_color.mV); { + LLGLEnable depth_clamp(gGLManager.mHasDepthClamp ? GL_DEPTH_CLAMP : 0); LLGLDisable cullface(GL_CULL_FACE); for (std::vector<LLFace*>::iterator iter = mDrawFace.begin(); iter != mDrawFace.end(); iter++) @@ -548,30 +643,19 @@ void LLDrawPoolWater::shade() sNeedsReflectionUpdate = TRUE; - if (water->getUseTexture()) + if (water->getUseTexture() || !water->getIsEdgePatch()) { sNeedsDistortionUpdate = TRUE; face->renderIndexed(); } + else if (gGLManager.mHasDepthClamp || deferred_render) + { + face->renderIndexed(); + } else - { //smash background faces to far clip plane - if (water->getIsEdgePatch()) - { - if (deferred_render) - { - face->renderIndexed(); - } - else - { - LLGLClampToFarClip far_clip(glh_get_current_projection()); - face->renderIndexed(); - } - } - else - { - sNeedsDistortionUpdate = TRUE; - face->renderIndexed(); - } + { + LLGLSquashToFarClip far_clip(glh_get_current_projection()); + face->renderIndexed(); } } } @@ -601,12 +685,6 @@ void LLDrawPoolWater::shade() } -void LLDrawPoolWater::renderForSelect() -{ - // Can't select water! - return; -} - LLViewerTexture *LLDrawPoolWater::getDebugTexture() { return LLViewerFetchedTexture::sSmokeImagep; diff --git a/indra/newview/lldrawpoolwater.h b/indra/newview/lldrawpoolwater.h index 3ab4bc5e2c..99b541ca5a 100644 --- a/indra/newview/lldrawpoolwater.h +++ b/indra/newview/lldrawpoolwater.h @@ -39,6 +39,7 @@ class LLDrawPoolWater: public LLFacePool protected: LLPointer<LLViewerTexture> mHBTex[2]; LLPointer<LLViewerTexture> mWaterImagep; + LLPointer<LLViewerTexture> mOpaqueWaterImagep; LLPointer<LLViewerTexture> mWaterNormp; public: @@ -74,13 +75,15 @@ public: /*virtual*/ S32 getNumPasses(); /*virtual*/ void render(S32 pass = 0); /*virtual*/ void prerender(); - /*virtual*/ void renderForSelect(); /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ LLColor3 getDebugColor() const; // For AGP debug display void renderReflection(LLFace* face); void shade(); + +protected: + void renderOpaqueLegacyWater(); }; void cgErrorCallback(); diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 41a299151e..eaa6aa7e37 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -260,7 +260,7 @@ void LLDrawPoolWLSky::render(S32 pass) LLGLDepthTest depth(GL_TRUE, GL_FALSE); LLGLDisable clip(GL_CLIP_PLANE0); - LLGLClampToFarClip far_clip(glh_get_current_projection()); + LLGLSquashToFarClip far_clip(glh_get_current_projection()); renderSkyHaze(camHeightLocal); diff --git a/indra/newview/lleventinfo.cpp b/indra/newview/lleventinfo.cpp deleted file mode 100644 index b7b4e10b17..0000000000 --- a/indra/newview/lleventinfo.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file lleventinfo.cpp - * @brief LLEventInfo class implementation - * - * $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 "lleventinfo.h" - -#include "lluuid.h" -#include "message.h" - -LLEventInfo::cat_map LLEventInfo::sCategories; - -void LLEventInfo::unpack(LLMessageSystem *msg) -{ - U32 event_id; - msg->getU32("EventData", "EventID", event_id); - mID = event_id; - - msg->getString("EventData", "Name", mName); - - msg->getString("EventData", "Category", mCategoryStr); - - msg->getString("EventData", "Date", mTimeStr); - - U32 duration; - msg->getU32("EventData","Duration",duration); - mDuration = duration; - - U32 date; - msg->getU32("EventData", "DateUTC", date); - mUnixTime = date; - - msg->getString("EventData", "Desc", mDesc); - - std::string buffer; - msg->getString("EventData", "Creator", buffer); - mRunByID = LLUUID(buffer); - - U32 foo; - msg->getU32("EventData", "Cover", foo); - - mHasCover = foo ? TRUE : FALSE; - if (mHasCover) - { - U32 cover; - msg->getU32("EventData", "Amount", cover); - mCover = cover; - } - - msg->getString("EventData", "SimName", mSimName); - - msg->getVector3d("EventData", "GlobalPos", mPosGlobal); - - // Mature content - U32 event_flags; - msg->getU32("EventData", "EventFlags", event_flags); - mEventFlags = event_flags; -} - -// static -void LLEventInfo::loadCategories(const LLSD& options) -{ - for(LLSD::array_const_iterator resp_it = options.beginArray(), - end = options.endArray(); resp_it != end; ++resp_it) - { - LLSD name = (*resp_it)["category_name"]; - if(name.isDefined()) - { - LLSD id = (*resp_it)["category_id"]; - if(id.isDefined()) - { - LLEventInfo::sCategories[id.asInteger()] = name.asString(); - } - } - } -} diff --git a/indra/newview/lleventnotifier.cpp b/indra/newview/lleventnotifier.cpp index 68559a4236..bedab75f98 100644 --- a/indra/newview/lleventnotifier.cpp +++ b/indra/newview/lleventnotifier.cpp @@ -31,10 +31,63 @@ #include "llnotificationsutil.h" #include "message.h" -#include "lleventinfo.h" #include "llfloaterreg.h" #include "llfloaterworldmap.h" +#include "llfloaterevent.h" #include "llagent.h" +#include "llcommandhandler.h" // secondlife:///app/... support + +class LLEventHandler : public LLCommandHandler +{ +public: + // requires trusted browser to trigger + LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { } + bool handle(const LLSD& params, const LLSD& query_map, + LLMediaCtrl* web) + { + if (params.size() < 2) + { + return false; + } + std::string event_command = params[1].asString(); + S32 event_id = params[0].asInteger(); + if(event_command == "details") + { + LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); + if (floater) + { + floater->setEventID(event_id); + LLFloaterReg::showTypedInstance<LLFloaterEvent>("event"); + return true; + } + } + else if(event_command == "notify") + { + // we're adding or removing a notification, so grab the date, name and notification bool + if (params.size() < 3) + { + return false; + } + if(params[2].asString() == "enable") + { + gEventNotifier.add(event_id); + // tell the server to modify the database as this was a slurl event notification command + gEventNotifier.serverPushRequest(event_id, true); + + } + else + { + gEventNotifier.remove(event_id); + } + return true; + } + + + return false; + } +}; +LLEventHandler gEventHandler; + LLEventNotifier gEventNotifier; @@ -63,31 +116,102 @@ void LLEventNotifier::update() // Check our notifications again and send out updates // if they happen. - time_t alert_time = time_corrected() + 5 * 60; + F64 alert_time = LLDate::now().secondsSinceEpoch() + 5 * 60; en_map::iterator iter; for (iter = mEventNotifications.begin(); iter != mEventNotifications.end();) { LLEventNotification *np = iter->second; - if (np->getEventDate() < (alert_time)) + iter++; + if (np->getEventDateEpoch() < alert_time) { LLSD args; args["NAME"] = np->getEventName(); + args["DATE"] = np->getEventDateStr(); LLNotificationsUtil::add("EventNotification", args, LLSD(), - boost::bind(&LLEventNotification::handleResponse, np, _1, _2)); - mEventNotifications.erase(iter++); + boost::bind(&LLEventNotifier::handleResponse, this, np->getEventID(), _1, _2)); + remove(np->getEventID()); + } - else + } + mNotificationTimer.reset(); + } +} + + + +bool LLEventNotifier::handleResponse(U32 eventId, const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + switch (option) + { + case 0: + { + LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); + if (floater) { - iter++; + floater->setEventID(eventId); + LLFloaterReg::showTypedInstance<LLFloaterEvent>("event"); } + break; } - mNotificationTimer.reset(); + case 1: + break; } + return true; } +bool LLEventNotifier::add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) +{ + LLEventNotification *new_enp = new LLEventNotification(eventId, eventEpoch, eventDateStr, eventName); + + llinfos << "Add event " << eventName << " id " << eventId << " date " << eventDateStr << llendl; + if(!new_enp->isValid()) + { + delete new_enp; + return false; + } + + mEventNotifications[new_enp->getEventID()] = new_enp; + return true; + +} + +void LLEventNotifier::add(U32 eventId) +{ + + gMessageSystem->newMessageFast(_PREHASH_EventInfoRequest); + gMessageSystem->nextBlockFast(_PREHASH_AgentData); + gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); + gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); + gMessageSystem->nextBlockFast(_PREHASH_EventData); + gMessageSystem->addU32Fast(_PREHASH_EventID, eventId); + gAgent.sendReliableMessage(); + +} + +//static +void LLEventNotifier::processEventInfoReply(LLMessageSystem *msg, void **) +{ + // extract the agent id + LLUUID agent_id; + U32 event_id; + std::string event_name; + std::string eventd_date; + U32 event_time_utc; + + msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); + msg->getU32("EventData", "EventID", event_id); + msg->getString("EventData", "Name", event_name); + msg->getString("EventData", "Date", eventd_date); + msg->getU32("EventData", "DateUTC", event_time_utc); + + gEventNotifier.add(event_id, (F64)event_time_utc, eventd_date, event_name); +} + + void LLEventNotifier::load(const LLSD& event_options) { for(LLSD::array_const_iterator resp_it = event_options.beginArray(), @@ -95,15 +219,7 @@ void LLEventNotifier::load(const LLSD& event_options) { LLSD response = *resp_it; - LLEventNotification *new_enp = new LLEventNotification(); - - if(!new_enp->load(response)) - { - delete new_enp; - continue; - } - - mEventNotifications[new_enp->getEventID()] = new_enp; + add(response["event_id"].asInteger(), response["event_date_ut"], response["event_date"].asString(), response["event_name"].asString()); } } @@ -117,32 +233,6 @@ BOOL LLEventNotifier::hasNotification(const U32 event_id) return FALSE; } - -void LLEventNotifier::add(LLEventInfo &event_info) -{ - // We need to tell the simulator that we want to pay attention to - // this event, as well as add it to our list. - - if (mEventNotifications.find(event_info.mID) != mEventNotifications.end()) - { - // We already have a notification for this event, don't bother. - return; - } - - // Push up a message to tell the server we have this notification. - gMessageSystem->newMessage("EventNotificationAddRequest"); - gMessageSystem->nextBlockFast(_PREHASH_AgentData); - gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - gMessageSystem->nextBlock("EventData"); - gMessageSystem->addU32("EventID", event_info.mID); - gAgent.sendReliableMessage(); - - LLEventNotification *enp = new LLEventNotification; - enp->load(event_info); - mEventNotifications[event_info.mID] = enp; -} - void LLEventNotifier::remove(const U32 event_id) { en_map::iterator iter; @@ -153,164 +243,36 @@ void LLEventNotifier::remove(const U32 event_id) return; } - // Push up a message to tell the server to remove this notification. - gMessageSystem->newMessage("EventNotificationRemoveRequest"); + serverPushRequest(event_id, false); + delete iter->second; + mEventNotifications.erase(iter); +} + + +void LLEventNotifier::serverPushRequest(U32 event_id, bool add) +{ + // Push up a message to tell the server we have this notification. + gMessageSystem->newMessage(add?"EventNotificationAddRequest":"EventNotificationRemoveRequest"); gMessageSystem->nextBlockFast(_PREHASH_AgentData); gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); gMessageSystem->nextBlock("EventData"); gMessageSystem->addU32("EventID", event_id); gAgent.sendReliableMessage(); - - delete iter->second; - mEventNotifications.erase(iter); -} - -LLEventNotification::LLEventNotification() : - mEventID(0), - mEventDate(0), - mEventName("") -{ } -LLEventNotification::~LLEventNotification() +LLEventNotification::LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName) : + mEventID(eventId), + mEventName(eventName), + mEventDateEpoch(eventEpoch), + mEventDateStr(eventDateStr) { + } -bool LLEventNotification::handleResponse(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - switch (option) - { - case 0: - { - gAgent.teleportViaLocation(getEventPosGlobal()); - LLFloaterWorldMap* floater_world_map = LLFloaterWorldMap::getInstance(); - if(floater_world_map) floater_world_map->trackLocation(getEventPosGlobal()); - break; - } - case 1: - LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", S32(getEventID()))); - break; - case 2: - break; - } - // We could clean up the notification on the server now if we really wanted to. - return false; -} -BOOL LLEventNotification::load(const LLSD& response) -{ - BOOL event_ok = TRUE; - LLSD option = response.get("event_id"); - if (option.isDefined()) - { - mEventID = option.asInteger(); - } - else - { - event_ok = FALSE; - } - option = response.get("event_name"); - if (option.isDefined()) - { - llinfos << "Event: " << option.asString() << llendl; - mEventName = option.asString(); - } - else - { - event_ok = FALSE; - } - option = response.get("event_date"); - if (option.isDefined()) - { - llinfos << "EventDate: " << option.asString() << llendl; - mEventDateStr = option.asString(); - } - else - { - event_ok = FALSE; - } - - option = response.get("event_date_ut"); - if (option.isDefined()) - { - llinfos << "EventDate: " << option.asString() << llendl; - mEventDate = strtoul(option.asString().c_str(), NULL, 10); - } - else - { - event_ok = FALSE; - } - - S32 grid_x = 0; - S32 grid_y = 0; - S32 x_region = 0; - S32 y_region = 0; - - option = response.get("grid_x"); - if (option.isDefined()) - { - llinfos << "GridX: " << option.asInteger() << llendl; - grid_x= option.asInteger(); - } - else - { - event_ok = FALSE; - } - - option = response.get("grid_y"); - if (option.isDefined()) - { - llinfos << "GridY: " << option.asInteger() << llendl; - grid_y = option.asInteger(); - } - else - { - event_ok = FALSE; - } - - option = response.get("x_region"); - if (option.isDefined()) - { - llinfos << "RegionX: " << option.asInteger() << llendl; - x_region = option.asInteger(); - } - else - { - event_ok = FALSE; - } - - option = response.get("y_region"); - if (option.isDefined()) - { - llinfos << "RegionY: " << option.asInteger() << llendl; - y_region = option.asInteger(); - } - else - { - event_ok = FALSE; - } - - mEventPosGlobal.mdV[VX] = grid_x * 256 + x_region; - mEventPosGlobal.mdV[VY] = grid_y * 256 + y_region; - mEventPosGlobal.mdV[VZ] = 0.f; - - return event_ok; -} - -BOOL LLEventNotification::load(const LLEventInfo &event_info) -{ - - mEventID = event_info.mID; - mEventName = event_info.mName; - mEventDateStr = event_info.mTimeStr; - mEventDate = event_info.mUnixTime; - mEventPosGlobal = event_info.mPosGlobal; - return TRUE; -} diff --git a/indra/newview/lleventnotifier.h b/indra/newview/lleventnotifier.h index 0367fc47b0..697a708762 100644 --- a/indra/newview/lleventnotifier.h +++ b/indra/newview/lleventnotifier.h @@ -30,7 +30,6 @@ #include "llframetimer.h" #include "v3dmath.h" -class LLEventInfo; class LLEventNotification; @@ -41,15 +40,21 @@ public: virtual ~LLEventNotifier(); void update(); // Notify the user of the event if it's coming up + bool add(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName); + void add(U32 eventId); + void load(const LLSD& event_options); // In the format that it comes in from login - void add(LLEventInfo &event_info); // Add a new notification for an event void remove(U32 event_id); BOOL hasNotification(const U32 event_id); + void serverPushRequest(U32 event_id, bool add); typedef std::map<U32, LLEventNotification *> en_map; + bool handleResponse(U32 eventId, const LLSD& notification, const LLSD& response); + static void processEventInfoReply(LLMessageSystem *msg, void **); + protected: en_map mEventNotifications; LLFrameTimer mNotificationTimer; @@ -59,25 +64,21 @@ protected: class LLEventNotification { public: - LLEventNotification(); - virtual ~LLEventNotification(); + LLEventNotification(U32 eventId, F64 eventEpoch, const std::string& eventDateStr, const std::string &eventName); + - BOOL load(const LLSD& en); // In the format it comes in from login - BOOL load(const LLEventInfo &event_info); // From existing event_info on the viewer. - //void setEventID(const U32 event_id); - //void setEventName(std::string &event_name); U32 getEventID() const { return mEventID; } const std::string &getEventName() const { return mEventName; } - time_t getEventDate() const { return mEventDate; } - const std::string &getEventDateStr() const { return mEventDateStr; } - LLVector3d getEventPosGlobal() const { return mEventPosGlobal; } - bool handleResponse(const LLSD& notification, const LLSD& payload); + bool isValid() const { return mEventID > 0 && mEventDateEpoch != 0 && mEventName.size() > 0; } + const F64 &getEventDateEpoch() const { return mEventDateEpoch; } + const std::string &getEventDateStr() const { return mEventDateStr; } + + protected: U32 mEventID; // EventID for this event std::string mEventName; + F64 mEventDateEpoch; std::string mEventDateStr; - time_t mEventDate; - LLVector3d mEventPosGlobal; }; extern LLEventNotifier gEventNotifier; diff --git a/indra/newview/llexternaleditor.cpp b/indra/newview/llexternaleditor.cpp new file mode 100644 index 0000000000..54968841ab --- /dev/null +++ b/indra/newview/llexternaleditor.cpp @@ -0,0 +1,192 @@ +/** + * @file llexternaleditor.cpp + * @brief A convenient class to run external editor. + * + * $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 "llexternaleditor.h" + +#include "llui.h" + +// static +const std::string LLExternalEditor::sFilenameMarker = "%s"; + +// static +const std::string LLExternalEditor::sSetting = "ExternalEditor"; + +bool LLExternalEditor::setCommand(const std::string& env_var, const std::string& override) +{ + std::string cmd = findCommand(env_var, override); + if (cmd.empty()) + { + llwarns << "Empty editor command" << llendl; + return false; + } + + // Add the filename marker if missing. + if (cmd.find(sFilenameMarker) == std::string::npos) + { + cmd += " \"" + sFilenameMarker + "\""; + llinfos << "Adding the filename marker (" << sFilenameMarker << ")" << llendl; + } + + string_vec_t tokens; + if (tokenize(tokens, cmd) < 2) // 2 = bin + at least one arg (%s) + { + llwarns << "Error parsing editor command" << llendl; + return false; + } + + // Check executable for existence. + std::string bin_path = tokens[0]; + if (!LLFile::isfile(bin_path)) + { + llwarns << "Editor binary [" << bin_path << "] not found" << llendl; + return false; + } + + // Save command. + mProcess.setExecutable(bin_path); + mArgs.clear(); + for (size_t i = 1; i < tokens.size(); ++i) + { + if (i > 1) mArgs += " "; + mArgs += "\"" + tokens[i] + "\""; + } + llinfos << "Setting command [" << bin_path << " " << mArgs << "]" << llendl; + + return true; +} + +bool LLExternalEditor::run(const std::string& file_path) +{ + std::string args = mArgs; + if (mProcess.getExecutable().empty() || args.empty()) + { + llwarns << "Editor command not set" << llendl; + return false; + } + + // Substitute the filename marker in the command with the actual passed file name. + LLStringUtil::replaceString(args, sFilenameMarker, file_path); + + // Split command into separate tokens. + string_vec_t tokens; + tokenize(tokens, args); + + // Set process arguments taken from the command. + mProcess.clearArguments(); + for (string_vec_t::const_iterator arg_it = tokens.begin(); arg_it != tokens.end(); ++arg_it) + { + mProcess.addArgument(*arg_it); + } + + // Run the editor. + llinfos << "Running editor command [" << mProcess.getExecutable() + " " + args << "]" << llendl; + int result = mProcess.launch(); + if (result == 0) + { + // Prevent killing the process in destructor (will add it to the zombies list). + mProcess.orphan(); + } + + return result == 0; +} + +// static +size_t LLExternalEditor::tokenize(string_vec_t& tokens, const std::string& str) +{ + tokens.clear(); + + // Split the argument string into separate strings for each argument + typedef boost::tokenizer< boost::char_separator<char> > tokenizer; + boost::char_separator<char> sep("", "\" ", boost::drop_empty_tokens); + + tokenizer tokens_list(str, sep); + tokenizer::iterator token_iter; + BOOL inside_quotes = FALSE; + BOOL last_was_space = FALSE; + for (token_iter = tokens_list.begin(); token_iter != tokens_list.end(); ++token_iter) + { + if (!strncmp("\"",(*token_iter).c_str(),2)) + { + inside_quotes = !inside_quotes; + } + else if (!strncmp(" ",(*token_iter).c_str(),2)) + { + if(inside_quotes) + { + tokens.back().append(std::string(" ")); + last_was_space = TRUE; + } + } + else + { + std::string to_push = *token_iter; + if (last_was_space) + { + tokens.back().append(to_push); + last_was_space = FALSE; + } + else + { + tokens.push_back(to_push); + } + } + } + + return tokens.size(); +} + +// static +std::string LLExternalEditor::findCommand( + const std::string& env_var, + const std::string& override) +{ + std::string cmd; + + // Get executable path. + if (!override.empty()) // try the supplied override first + { + cmd = override; + llinfos << "Using override" << llendl; + } + else if (!LLUI::sSettingGroups["config"]->getString(sSetting).empty()) + { + cmd = LLUI::sSettingGroups["config"]->getString(sSetting); + llinfos << "Using setting" << llendl; + } + else // otherwise use the path specified by the environment variable + { + char* env_var_val = getenv(env_var.c_str()); + if (env_var_val) + { + cmd = env_var_val; + llinfos << "Using env var " << env_var << llendl; + } + } + + llinfos << "Found command [" << cmd << "]" << llendl; + return cmd; +} diff --git a/indra/newview/llexternaleditor.h b/indra/newview/llexternaleditor.h new file mode 100644 index 0000000000..6ea210d5e2 --- /dev/null +++ b/indra/newview/llexternaleditor.h @@ -0,0 +1,91 @@ +/** + * @file llexternaleditor.h + * @brief A convenient class to run external editor. + * + * $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_LLEXTERNALEDITOR_H +#define LL_LLEXTERNALEDITOR_H + +#include <llprocesslauncher.h> + +/** + * Usage: + * LLExternalEditor ed; + * ed.setCommand("MY_EXTERNAL_EDITOR_VAR"); + * ed.run("/path/to/file1"); + * ed.run("/other/path/to/file2"); + */ +class LLExternalEditor +{ + typedef std::vector<std::string> string_vec_t; + +public: + + /** + * Set editor command. + * + * @param env_var Environment variable of the same purpose. + * @param override Optional override. + * + * First tries the override, then a predefined setting (sSetting), + * then the environment variable. + * + * @return Command if found, empty string otherwise. + * + * @see sSetting + */ + bool setCommand(const std::string& env_var, const std::string& override = LLStringUtil::null); + + /** + * Run the editor with the given file. + * + * @param file_path File to edit. + * @return true on success, false on error. + */ + bool run(const std::string& file_path); + +private: + + static std::string findCommand( + const std::string& env_var, + const std::string& override); + + static size_t tokenize(string_vec_t& tokens, const std::string& str); + + /** + * Filename placeholder that gets replaced with an actual file name. + */ + static const std::string sFilenameMarker; + + /** + * Setting that can specify the editor command. + */ + static const std::string sSetting; + + + std::string mArgs; + LLProcessLauncher mProcess; +}; + +#endif // LL_LLEXTERNALEDITOR_H diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index d22950cad3..2471da9da5 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -399,84 +399,6 @@ void LLFace::updateCenterAgent() } } -void LLFace::renderForSelect(U32 data_mask) -{ - if(mDrawablep.isNull() || mVertexBuffer.isNull()) - { - return; - } - - LLSpatialGroup* group = mDrawablep->getSpatialGroup(); - if (!group || group->isState(LLSpatialGroup::GEOM_DIRTY)) - { - return; - } - - if (mVObjp->mGLName) - { - S32 name = mVObjp->mGLName; - - LLColor4U color((U8)(name >> 16), (U8)(name >> 8), (U8)name); -#if 0 // *FIX: Postponing this fix until we have texcoord pick info... - if (mTEOffset != -1) - { - color.mV[VALPHA] = (U8)(getTextureEntry()->getColor().mV[VALPHA] * 255.f); - } -#endif - glColor4ubv(color.mV); - - if (!getPool()) - { - switch (getPoolType()) - { - case LLDrawPool::POOL_ALPHA: - gGL.getTexUnit(0)->bind(getTexture()); - break; - default: - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - break; - } - } - - mVertexBuffer->setBuffer(data_mask); -#if !LL_RELEASE_FOR_DOWNLOAD - LLGLState::checkClientArrays("", data_mask); -#endif - if (mTEOffset != -1) - { - // mask off high 4 bits (16 total possible faces) - color.mV[0] &= 0x0f; - color.mV[0] |= (mTEOffset & 0x0f) << 4; - glColor4ubv(color.mV); - } - - if (mIndicesCount) - { - if (isState(GLOBAL)) - { - if (mDrawablep->getVOVolume()) - { - glPushMatrix(); - glMultMatrixf((float*) mDrawablep->getRegion()->mRenderMatrix.mMatrix); - mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex); - glPopMatrix(); - } - else - { - mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex); - } - } - else - { - glPushMatrix(); - glMultMatrixf((float*)getRenderMatrix().mMatrix); - mVertexBuffer->draw(LLRender::TRIANGLES, mIndicesCount, mIndicesIndex); - glPopMatrix(); - } - } - } -} - void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) { if (mDrawablep->getSpatialGroup() == NULL) diff --git a/indra/newview/llface.h b/indra/newview/llface.h index 0166e45bee..6c941bd092 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -173,7 +173,6 @@ public: void updateCenterAgent(); // Update center when xform has changed. void renderSelectedUV(); - void renderForSelect(U32 data_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0); void renderSelected(LLViewerTexture *image, const LLColor4 &color); F32 getKey() const { return mDistance; } diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp index b715647143..92a3b9b2f5 100644 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -117,7 +117,7 @@ BOOL LLFastTimerView::handleRightMouseDown(S32 x, S32 y, MASK mask) { S32 bar_idx = MAX_VISIBLE_HISTORY - ((y - mBarRect.mBottom) * (MAX_VISIBLE_HISTORY + 2) / mBarRect.getHeight()); bar_idx = llclamp(bar_idx, 0, MAX_VISIBLE_HISTORY); - mPrintStats = bar_idx; + mPrintStats = LLFastTimer::NamedTimer::HISTORY_NUM - mScrollIndex - bar_idx; } return FALSE; } @@ -134,6 +134,17 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y) return NULL; } +BOOL LLFastTimerView::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + for(timer_tree_iterator_t it = begin_timer_tree(LLFastTimer::NamedTimer::getRootNamedTimer()); + it != end_timer_tree(); + ++it) + { + (*it)->setCollapsed(false); + } + return TRUE; +} + BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask) { @@ -947,7 +958,7 @@ void LLFastTimerView::draw() { legend_stat += ", "; } - first = true; + first = false; legend_stat += idp->getName(); if (idp->getCollapsed()) @@ -974,8 +985,7 @@ void LLFastTimerView::draw() U64 ticks; if (mPrintStats > 0) { - S32 hidx = (mPrintStats - 1) - mScrollIndex; - ticks = idp->getHistoricalCount(hidx); + ticks = idp->getHistoricalCount(mPrintStats); } else { @@ -1076,14 +1086,22 @@ LLSD LLFastTimerView::analyzePerformanceLogDefault(std::istream& is) //static void LLFastTimerView::doAnalysisDefault(std::string baseline, std::string target, std::string output) { + // Open baseline and current target, exit if one is inexistent + std::ifstream base_is(baseline.c_str()); + std::ifstream target_is(target.c_str()); + if (!base_is.is_open() || !target_is.is_open()) + { + llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl; + base_is.close(); + target_is.close(); + return; + } //analyze baseline - std::ifstream base_is(baseline.c_str()); LLSD base = analyzePerformanceLogDefault(base_is); base_is.close(); //analyze current - std::ifstream target_is(target.c_str()); LLSD current = analyzePerformanceLogDefault(target_is); target_is.close(); @@ -1144,15 +1162,15 @@ LLSD LLFastTimerView::analyzeMetricPerformanceLog(std::istream& is) { std::string label = iter->first; - LLMetricPerformanceTester* tester = LLMetricPerformanceTester::getTester(iter->second["Name"].asString()) ; + LLMetricPerformanceTesterBasic* tester = LLMetricPerformanceTesterBasic::getTester(iter->second["Name"].asString()) ; if(tester) { ret[label]["Name"] = iter->second["Name"] ; - S32 num_of_strings = tester->getNumOfMetricStrings() ; - for(S32 index = 0 ; index < num_of_strings ; index++) + S32 num_of_metrics = tester->getNumberOfMetrics() ; + for(S32 index = 0 ; index < num_of_metrics ; index++) { - ret[label][ tester->getMetricString(index) ] = iter->second[ tester->getMetricString(index) ] ; + ret[label][ tester->getMetricName(index) ] = iter->second[ tester->getMetricName(index) ] ; } } } @@ -1162,20 +1180,43 @@ LLSD LLFastTimerView::analyzeMetricPerformanceLog(std::istream& is) } //static +void LLFastTimerView::outputAllMetrics() +{ + if (LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters()) + { + for (LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin(); + iter != LLMetricPerformanceTesterBasic::sTesterMap.end(); ++iter) + { + LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second); + tester->outputTestResults(); + } + } +} + +//static void LLFastTimerView::doAnalysisMetrics(std::string baseline, std::string target, std::string output) { - if(!LLMetricPerformanceTester::hasMetricPerformanceTesters()) + if(!LLMetricPerformanceTesterBasic::hasMetricPerformanceTesters()) { return ; } - //analyze baseline + // Open baseline and current target, exit if one is inexistent std::ifstream base_is(baseline.c_str()); + std::ifstream target_is(target.c_str()); + if (!base_is.is_open() || !target_is.is_open()) + { + llwarns << "'-analyzeperformance' error : baseline or current target file inexistent" << llendl; + base_is.close(); + target_is.close(); + return; + } + + //analyze baseline LLSD base = analyzeMetricPerformanceLog(base_is); base_is.close(); //analyze current - std::ifstream target_is(target.c_str()); LLSD current = analyzeMetricPerformanceLog(target_is); target_is.close(); @@ -1183,10 +1224,10 @@ void LLFastTimerView::doAnalysisMetrics(std::string baseline, std::string target std::ofstream os(output.c_str()); os << "Label, Metric, Base(B), Target(T), Diff(T-B), Percentage(100*T/B)\n"; - for(LLMetricPerformanceTester::name_tester_map_t::iterator iter = LLMetricPerformanceTester::sTesterMap.begin() ; - iter != LLMetricPerformanceTester::sTesterMap.end() ; ++iter) + for(LLMetricPerformanceTesterBasic::name_tester_map_t::iterator iter = LLMetricPerformanceTesterBasic::sTesterMap.begin() ; + iter != LLMetricPerformanceTesterBasic::sTesterMap.end() ; ++iter) { - LLMetricPerformanceTester* tester = ((LLMetricPerformanceTester*)iter->second) ; + LLMetricPerformanceTesterBasic* tester = ((LLMetricPerformanceTesterBasic*)iter->second) ; tester->analyzePerformance(&os, &base, ¤t) ; } diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h index 961d03abf1..1a54a53f09 100644 --- a/indra/newview/llfasttimerview.h +++ b/indra/newview/llfasttimerview.h @@ -37,6 +37,7 @@ public: static BOOL sAnalyzePerformance; + static void outputAllMetrics(); static void doAnalysis(std::string baseline, std::string target, std::string output); private: @@ -48,6 +49,7 @@ private: public: virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask); virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleHover(S32 x, S32 y, MASK mask); diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 5796e67618..a1ba370c26 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -161,22 +161,13 @@ public: if (!region_name.empty()) { - LLToolTip::Params params; std::string extra_message = llformat("%s (%d, %d, %d)", region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ()); + LLToolTip::Params params; params.message = llformat("%s\n%s", getLabelSelected().c_str(), extra_message.c_str()); - - LLRect rect = calcScreenRect(); - LLFontGL* standart_font = LLFontGL::getFontSansSerif(); - if(standart_font) - { - S32 w = llmax((S32)(standart_font->getWidthF32(getLabelSelected())+0.5),(S32)(standart_font->getWidthF32(extra_message)+0.5)); - rect.mRight = rect.mLeft + w; - params.max_width = w; - } - - params.sticky_rect = rect; + params.max_width = 1000; + params.sticky_rect = calcScreenRect(); LLToolTipMgr::instance().show(params); } @@ -299,20 +290,6 @@ public: return TRUE; } - void setVisible(BOOL b) - { - // Overflow menu shouldn't hide when it still has focus. See EXT-4217. - if (!b && hasFocus()) - return; - LLToggleableMenu::setVisible(b); - setFocus(b); - } - - void onFocusLost() - { - setVisible(FALSE); - } - protected: LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p): LLToggleableMenu(p) @@ -437,6 +414,9 @@ BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, { *accept = ACCEPT_NO; + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); + if (LLToolDragAndDrop::SOURCE_AGENT != source && LLToolDragAndDrop::SOURCE_LIBRARY != source) return FALSE; + switch (cargo_type) { @@ -661,16 +641,23 @@ void LLFavoritesBarCtrl::draw() } } -LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode() +const LLButton::Params& LLFavoritesBarCtrl::getButtonParams() { - LLXMLNodePtr buttonXMLNode = NULL; - bool success = LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", buttonXMLNode); - if (!success) + static LLButton::Params button_params; + static bool params_initialized = false; + + if (!params_initialized) { - llwarns << "Failed to create Favorites Bar button from favorites_bar_button.xml" << llendl; - buttonXMLNode = NULL; + LLXMLNodePtr button_xml_node; + if(LLUICtrlFactory::getLayeredXMLNode("favorites_bar_button.xml", button_xml_node)) + { + LLXUIParser parser; + parser.readXUI(button_xml_node, button_params, "favorites_bar_button.xml"); + } + params_initialized = true; } - return buttonXMLNode; + + return button_params; } void LLFavoritesBarCtrl::updateButtons() @@ -682,11 +669,8 @@ void LLFavoritesBarCtrl::updateButtons() return; } - static LLXMLNodePtr buttonXMLNode = getButtonXMLNode(); - if (buttonXMLNode.isNull()) - { - return; - } + const LLButton::Params& button_params = getButtonParams(); + if(mItems.empty()) { mBarLabel->setVisible(TRUE); @@ -762,7 +746,7 @@ void LLFavoritesBarCtrl::updateButtons() int j = first_changed_item_index; for (; j < mItems.count(); j++) { - last_new_button = createButton(mItems[j], buttonXMLNode, last_right_edge); + last_new_button = createButton(mItems[j], button_params, last_right_edge); if (!last_new_button) { break; @@ -780,8 +764,7 @@ void LLFavoritesBarCtrl::updateButtons() //or there are some new favorites, or width had been changed // so if we need to display chevron button, we must update dropdown items too. mUpdateDropDownItems = true; - S32 buttonHGap = 2; // default value - buttonXMLNode->getAttributeS32("left", buttonHGap); + S32 buttonHGap = button_params.rect.left; // default value LLRect rect; // Chevron button should stay right aligned rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0, @@ -796,7 +779,6 @@ void LLFavoritesBarCtrl::updateButtons() LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get()); if (overflow_menu && overflow_menu->getVisible()) { - overflow_menu->setFocus(FALSE); overflow_menu->setVisible(FALSE); if (mUpdateDropDownItems) showDropDownMenu(); @@ -808,12 +790,10 @@ void LLFavoritesBarCtrl::updateButtons() } } -LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &buttonXMLNode, S32 x_offset) +LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, const LLButton::Params& button_params, S32 x_offset) { - S32 def_button_width = 120; - buttonXMLNode->getAttributeS32("width", def_button_width); - S32 button_x_delta = 2; // default value - buttonXMLNode->getAttributeS32("left", button_x_delta); + S32 def_button_width = button_params.rect.width; + S32 button_x_delta = button_params.rect.left; // default value S32 curr_x = x_offset; /** @@ -831,13 +811,16 @@ LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem { return NULL; } - fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL); + LLButton::Params fav_btn_params(button_params); + fav_btn = LLUICtrlFactory::create<LLFavoriteLandmarkButton>(fav_btn_params); if (NULL == fav_btn) { llwarns << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << llendl; return NULL; } + addChild(fav_btn); + LLRect butt_rect (fav_btn->getRect()); fav_btn->setLandmarkID(item->getUUID()); butt_rect.setOriginAndSize(curr_x + button_x_delta, fav_btn->getRect().mBottom, width, fav_btn->getRect().getHeight()); @@ -916,8 +899,6 @@ void LLFavoritesBarCtrl::showDropDownMenu() if (menu) { - // Release focus to allow changing of visibility. - menu->setFocus(FALSE); if (!menu->toggleVisibility()) return; @@ -1098,6 +1079,14 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) { gInventory.removeItem(mSelectedItemID); } + + // Pop-up the overflow menu again (it gets hidden whenever the user clicks a context menu item). + // See EXT-4217 and STORM-207. + LLToggleableMenu* menu = (LLToggleableMenu*) mPopupMenuHandle.get(); + if (menu && !menu->getVisible()) + { + showDropDownMenu(); + } } BOOL LLFavoritesBarCtrl::isClipboardPasteable() const diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index bdb1b8288f..37645523f6 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -71,8 +71,8 @@ public: protected: void updateButtons(); - LLButton* createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &root, S32 x_offset ); - LLXMLNodePtr getButtonXMLNode(); + LLButton* createButton(const LLPointer<LLViewerInventoryItem> item, const LLButton::Params& button_params, S32 x_offset ); + const LLButton::Params& getButtonParams(); BOOL collectFavoriteItems(LLInventoryModel::item_array_t &items); void onButtonClick(LLUUID id); diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index 4d5b08243a..b08c113923 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -30,7 +30,7 @@ // library includes #include "indra_constants.h" -#include "llnotificationsutil.h" +#include "llnotifications.h" // viewer includes #include "llagent.h" // for gAgent.inPrelude() @@ -39,7 +39,7 @@ #include "llappviewer.h" #include "lltracker.h" -/* + // static std::set<std::string> LLFirstUse::sConfigVariables; @@ -70,211 +70,115 @@ void LLFirstUse::resetFirstUse() gWarningSettings.setBOOL(*iter, TRUE); } } -*/ -/* - -// Called whenever the viewer detects that your balance went up -void LLFirstUse::useBalanceIncrease(S32 delta) -{ - if (gWarningSettings.getBOOL("FirstBalanceIncrease")) - { - gWarningSettings.setBOOL("FirstBalanceIncrease", FALSE); - - LLSD args; - args["AMOUNT"] = llformat("%d",delta); - LLNotificationsUtil::add("FirstBalanceIncrease", args); - } -} - -// Called whenever the viewer detects your balance went down -void LLFirstUse::useBalanceDecrease(S32 delta) +// static +void LLFirstUse::otherAvatarChatFirst(bool enable) { - if (gWarningSettings.getBOOL("FirstBalanceDecrease")) - { - gWarningSettings.setBOOL("FirstBalanceDecrease", FALSE); - - LLSD args; - args["AMOUNT"] = llformat("%d",-delta); - LLNotificationsUtil::add("FirstBalanceDecrease", args); - } + firstUseNotification("FirstOtherChatBeforeUser", enable, "HintChat", LLSD(), LLSD().with("target", "chat_bar").with("direction", "top_right").with("distance", 24)); } - // static -void LLFirstUse::useSit() +void LLFirstUse::sit(bool enable) { - // Our orientation island uses sitting to teach vehicle driving - // so just never show this message. JC - //if (gWarningSettings.getBOOL("FirstSit")) - //{ - // gWarningSettings.setBOOL("FirstSit", FALSE); - // - // LLNotificationsUtil::add("FirstSit"); - //} + firstUseNotification("FirstSit", enable, "HintSit", LLSD(), LLSD().with("target", "stand_btn").with("direction", "top")); } // static -void LLFirstUse::useMap() +void LLFirstUse::newInventory(bool enable) { - if (gWarningSettings.getBOOL("FirstMap")) - { - gWarningSettings.setBOOL("FirstMap", FALSE); - - LLNotificationsUtil::add("FirstMap"); - } + // turning this off until bug EXP-62 can be fixed (inventory hint appears for new users when their initial inventory is acquired) + // firstUseNotification("FirstInventoryOffer", enable, "HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left")); } // static -void LLFirstUse::useGoTo() +void LLFirstUse::useSandbox() { - // nothing for now JC + firstUseNotification("FirstSandbox", true, "FirstSandbox", LLSD().with("HOURS", SANDBOX_CLEAN_FREQ).with("TIME", SANDBOX_FIRST_CLEAN_HOUR)); } // static -void LLFirstUse::useBuild() +void LLFirstUse::notUsingDestinationGuide(bool enable) { - if (gWarningSettings.getBOOL("FirstBuild")) - { - gWarningSettings.setBOOL("FirstBuild", FALSE); - - LLNotificationsUtil::add("FirstBuild"); - } + // not doing this yet + //firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left")); } - - */ -/* -// static -void LLFirstUse::useLeftClickNoHit() -{ - if (gWarningSettings.getBOOL("FirstLeftClickNoHit")) - { - gWarningSettings.setBOOL("FirstLeftClickNoHit", FALSE); - LLNotificationsUtil::add("FirstLeftClickNoHit"); - } -} -*/ -/* // static -void LLFirstUse::useTeleport() +void LLFirstUse::notUsingSidePanel(bool enable) { - if (gWarningSettings.getBOOL("FirstTeleport")) - { - LLVector3d teleportDestination = LLTracker::getTrackedPositionGlobal(); - if(teleportDestination != LLVector3d::zero) - { - gWarningSettings.setBOOL("FirstTeleport", FALSE); - - LLNotificationsUtil::add("FirstTeleport"); - } - } + // not doing this yet + //firstUseNotification("FirstNotUseSidePanel", enable, "HintSidePanel", LLSD(), LLSD().with("target", "side_panel_btn").with("direction", "left")); } -*/ -// static -void LLFirstUse::useOverrideKeys() -{ - // Our orientation island uses key overrides to teach vehicle driving - // so don't show this message until you get off OI. JC - if (!gAgent.inPrelude()) - { - if (gWarningSettings.getBOOL("FirstOverrideKeys")) - { - gWarningSettings.setBOOL("FirstOverrideKeys", FALSE); - LLNotificationsUtil::add("FirstOverrideKeys"); - } - } -} -/* // static -void LLFirstUse::useAttach() +void LLFirstUse::notMoving(bool enable) { - // nothing for now + firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); } // static -void LLFirstUse::useAppearance() +void LLFirstUse::setDisplayName(bool enable) { - if (gWarningSettings.getBOOL("FirstAppearance")) - { - gWarningSettings.setBOOL("FirstAppearance", FALSE); - - LLNotificationsUtil::add("FirstAppearance"); - } + firstUseNotification("FirstDisplayName", enable, "HintDisplayName", LLSD(), LLSD().with("target", "set_display_name").with("direction", "left")); } // static -void LLFirstUse::useInventory() +void LLFirstUse::receiveLindens(bool enable) { - if (gWarningSettings.getBOOL("FirstInventory")) - { - gWarningSettings.setBOOL("FirstInventory", FALSE); - - LLNotificationsUtil::add("FirstInventory"); - } + firstUseNotification("FirstReceiveLindens", enable, "HintLindenDollar", LLSD(), LLSD().with("target", "linden_balance").with("direction", "bottom")); } -*/ -// static -void LLFirstUse::useSandbox() +//static +void LLFirstUse::firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args, LLSD payload) { - if (gWarningSettings.getBOOL("FirstSandbox")) - { - gWarningSettings.setBOOL("FirstSandbox", FALSE); + init(); - LLSD args; - args["HOURS"] = llformat("%d",SANDBOX_CLEAN_FREQ); - args["TIME"] = llformat("%d",SANDBOX_FIRST_CLEAN_HOUR); - LLNotificationsUtil::add("FirstSandbox", args); - } -} -/* -// static -void LLFirstUse::useFlexible() -{ - if (gWarningSettings.getBOOL("FirstFlexible")) + if (enable) { - gWarningSettings.setBOOL("FirstFlexible", FALSE); - - LLNotificationsUtil::add("FirstFlexible"); - } -} + if (gSavedSettings.getBOOL("EnableUIHints")) + { + LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL; -// static -void LLFirstUse::useDebugMenus() -{ - if (gWarningSettings.getBOOL("FirstDebugMenus")) + // if notification doesn't already exist and this notification hasn't been disabled... + if (gWarningSettings.getBOOL(control_var)) + { // create new notification + LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var))); + } + } + } + else { - gWarningSettings.setBOOL("FirstDebugMenus", FALSE); - - LLNotificationsUtil::add("FirstDebugMenus"); + LL_DEBUGS("LLFirstUse") << "Disabling first use notification " << notification_name << LL_ENDL; + LLNotifications::instance().cancelByName(notification_name); + // redundantly clear settings var here, in case there are no notifications to cancel + gWarningSettings.setBOOL(control_var, FALSE); } + } // static -void LLFirstUse::useSculptedPrim() +void LLFirstUse::init() { - if (gWarningSettings.getBOOL("FirstSculptedPrim")) + static bool initialized = false; + if (!initialized) { - gWarningSettings.setBOOL("FirstSculptedPrim", FALSE); - - LLNotificationsUtil::add("FirstSculptedPrim"); - + LLNotifications::instance().getChannel("Hints")->connectChanged(&processNotification); } + initialized = true; } -// static -void LLFirstUse::useMedia() +//static +bool LLFirstUse::processNotification(const LLSD& notify) { - if (gWarningSettings.getBOOL("FirstMedia")) + if (notify["sigtype"].asString() == "delete") { - gWarningSettings.setBOOL("FirstMedia", FALSE); - - // Popup removed as a short-term fix for EXT-1643. - // Ultimately, the plan is to kill all First Use dialogs - //LLNotificationsUtil::add("FirstMedia"); + LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + if (notification) + { + // disable any future notifications + gWarningSettings.setBOOL(notification->getPayload()["control_var"], FALSE); + } } + return false; } -*/ diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 771e38ed33..3b7ff6383b 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -70,10 +70,13 @@ object or from inventory. 14. First time you create/edit a sculpted prim. */ +class LLNotification; + + class LLFirstUse { public: -/* + // Add a config variable to be reset on resetFirstUse() static void addConfigVariable(const std::string& var); @@ -81,35 +84,22 @@ public: static void disableFirstUse(); static void resetFirstUse(); - // These methods are called each time the appropriate action is - // taken. The functions themselves handle only showing the dialog - // the first time, or subsequent times if the user wishes. - static void useBalanceIncrease(S32 delta); - static void useBalanceDecrease(S32 delta); - static void useSit(); - static void useMap(); - static void useGoTo(); - static void useBuild(); -// static void useLeftClickNoHit(); - static void useTeleport(); -*/ - static void useOverrideKeys(); -/* - static void useAttach(); - static void useAppearance(); - static void useInventory(); - */ + static void otherAvatarChatFirst(bool enable = true); + static void sit(bool enable = true); + static void notUsingDestinationGuide(bool enable = true); + static void notUsingSidePanel(bool enable = true); + static void notMoving(bool enable = true); + static void newInventory(bool enable = true); + static void receiveLindens(bool enable = true); + static void setDisplayName(bool enable = true); static void useSandbox(); -/* - static void useFlexible(); - static void useDebugMenus(); - static void useSculptedPrim(); - static void useMedia(); - protected: + static void firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args = LLSD(), LLSD payload = LLSD()); static std::set<std::string> sConfigVariables; -*/ + + static void init(); + static bool processNotification(const LLSD& notify); }; #endif diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 5ac006302e..135137069c 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -94,7 +94,6 @@ public: LLFloaterAbout::LLFloaterAbout(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about.xml"); } diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp index 5cab770c42..252c7b51ae 100644 --- a/indra/newview/llfloaterauction.cpp +++ b/indra/newview/llfloaterauction.cpp @@ -74,7 +74,6 @@ LLFloaterAuction::LLFloaterAuction(const LLSD& key) : LLFloater(key), mParcelID(-1) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_auction.xml"); mCommitCallbackRegistrar.add("ClickSnapshot", boost::bind(&LLFloaterAuction::onClickSnapshot, this)); mCommitCallbackRegistrar.add("ClickSellToAnyone", boost::bind(&LLFloaterAuction::onClickSellToAnyone, this)); mCommitCallbackRegistrar.add("ClickStartAuction", boost::bind(&LLFloaterAuction::onClickStartAuction, this)); diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp index 9391c761b7..aa66fcf9b8 100644 --- a/indra/newview/llfloateravatarpicker.cpp +++ b/indra/newview/llfloateravatarpicker.cpp @@ -35,10 +35,14 @@ #include "llimview.h" // for gIMMgr #include "lltooldraganddrop.h" // for LLToolDragAndDrop #include "llviewercontrol.h" +#include "llviewerregion.h" // getCapability() #include "llworld.h" // Linden libraries +#include "llavatarnamecache.h" // IDEVO #include "llbutton.h" +#include "llcachename.h" +#include "llhttpclient.h" // IDEVO #include "lllineeditor.h" #include "llscrolllistctrl.h" #include "llscrolllistitem.h" @@ -47,6 +51,11 @@ #include "lluictrlfactory.h" #include "message.h" +//#include "llsdserialize.h" + +//put it back as a member once the legacy path is out? +static std::map<LLUUID, LLAvatarName> sAvatarNameMap; + LLFloaterAvatarPicker* LLFloaterAvatarPicker::show(select_callback_t callback, BOOL allow_multiple, BOOL closeOnSelect) @@ -79,7 +88,6 @@ LLFloaterAvatarPicker::LLFloaterAvatarPicker(const LLSD& key) mNearMeListComplete(FALSE), mCloseOnSelect(FALSE) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_avatar_picker.xml"); mCommitCallbackRegistrar.add("Refresh.FriendList", boost::bind(&LLFloaterAvatarPicker::populateFriend, this)); } @@ -153,7 +161,7 @@ void LLFloaterAvatarPicker::onBtnFind() find(); } -static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, uuid_vec_t& avatar_ids) +static void getSelectedAvatarData(const LLScrollListCtrl* from, uuid_vec_t& avatar_ids, std::vector<LLAvatarName>& avatar_names) { std::vector<LLScrollListItem*> items = from->getAllSelected(); for (std::vector<LLScrollListItem*>::iterator iter = items.begin(); iter != items.end(); ++iter) @@ -161,8 +169,21 @@ static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std: LLScrollListItem* item = *iter; if (item->getUUID().notNull()) { - avatar_names.push_back(item->getColumn(0)->getValue().asString()); avatar_ids.push_back(item->getUUID()); + + std::map<LLUUID, LLAvatarName>::iterator iter = sAvatarNameMap.find(item->getUUID()); + if (iter != sAvatarNameMap.end()) + { + avatar_names.push_back(iter->second); + } + else + { + // the only case where it isn't in the name map is friends + // but it should be in the name cache + LLAvatarName av_name; + LLAvatarNameCache::get(item->getUUID(), &av_name); + avatar_names.push_back(av_name); + } } } } @@ -198,10 +219,10 @@ void LLFloaterAvatarPicker::onBtnSelect() if(list) { - std::vector<std::string> avatar_names; uuid_vec_t avatar_ids; - getSelectedAvatarData(list, avatar_names, avatar_ids); - mSelectionCallback(avatar_names, avatar_ids); + std::vector<LLAvatarName> avatar_names; + getSelectedAvatarData(list, avatar_ids, avatar_names); + mSelectionCallback(avatar_ids, avatar_names); } } getChild<LLScrollListCtrl>("SearchResults")->deselectAllItems(TRUE); @@ -251,15 +272,22 @@ void LLFloaterAvatarPicker::populateNearMe() if(av == gAgent.getID()) continue; LLSD element; element["id"] = av; // value - std::string fullname; - if(!gCacheName->getFullName(av, fullname)) + LLAvatarName av_name; + + if (!LLAvatarNameCache::get(av, &av_name)) { + element["columns"][0]["column"] = "name"; element["columns"][0]["value"] = LLCacheName::getDefaultName(); all_loaded = FALSE; } else { - element["columns"][0]["value"] = fullname; + element["columns"][0]["column"] = "name"; + element["columns"][0]["value"] = av_name.mDisplayName; + element["columns"][1]["column"] = "username"; + element["columns"][1]["value"] = av_name.mUsername; + + sAvatarNameMap[av] = av_name; } near_me_scroller->addElement(element); empty = FALSE; @@ -294,7 +322,6 @@ void LLFloaterAvatarPicker::populateFriend() LLAvatarTracker::instance().applyFunctor(collector); LLCollectAllBuddies::buddy_map_t::iterator it; - for(it = collector.mOnline.begin(); it!=collector.mOnline.end(); it++) { friends_scroller->addStringUUIDItem(it->first, it->second); @@ -346,23 +373,81 @@ BOOL LLFloaterAvatarPicker::visibleItemsSelected() const return FALSE; } +class LLAvatarPickerResponder : public LLHTTPClient::Responder +{ +public: + LLUUID mQueryID; + + LLAvatarPickerResponder(const LLUUID& id) : mQueryID(id) { } + + /*virtual*/ void completed(U32 status, const std::string& reason, const LLSD& content) + { + //std::ostringstream ss; + //LLSDSerialize::toPrettyXML(content, ss); + //llinfos << ss.str() << llendl; + + // in case of invalid characters, the avatar picker returns a 400 + // just set it to process so it displays 'not found' + if (isGoodStatus(status) || status == 400) + { + LLFloaterAvatarPicker* floater = + LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker"); + if (floater) + { + floater->processResponse(mQueryID, content); + } + } + else + { + llinfos << "avatar picker failed " << status + << " reason " << reason << llendl; + + } + } +}; + void LLFloaterAvatarPicker::find() { + //clear our stored LLAvatarNames + sAvatarNameMap.clear(); + std::string text = getChild<LLUICtrl>("Edit")->getValue().asString(); mQueryID.generate(); - LLMessageSystem* msg = gMessageSystem; - - msg->newMessage("AvatarPickerRequest"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->addUUID("QueryID", mQueryID); // not used right now - msg->nextBlock("Data"); - msg->addString("Name", text); + std::string url; + url.reserve(128); // avoid a memory allocation or two - gAgent.sendReliableMessage(); + LLViewerRegion* region = gAgent.getRegion(); + url = region->getCapability("AvatarPickerSearch"); + // Prefer use of capabilities to search on both SLID and display name + // but allow display name search to be manually turned off for test + if (!url.empty() + && LLAvatarNameCache::useDisplayNames()) + { + // capability urls don't end in '/', but we need one to parse + // query parameters correctly + if (url.size() > 0 && url[url.size()-1] != '/') + { + url += "/"; + } + url += "?page_size=100&names="; + url += LLURI::escape(text); + llinfos << "avatar picker " << url << llendl; + LLHTTPClient::get(url, new LLAvatarPickerResponder(mQueryID)); + } + else + { + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("AvatarPickerRequest"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->addUUID("QueryID", mQueryID); // not used right now + msg->nextBlock("Data"); + msg->addString("Name", text); + gAgent.sendReliableMessage(); + } getChild<LLScrollListCtrl>("SearchResults")->deleteAllItems(); getChild<LLScrollListCtrl>("SearchResults")->setCommentText(getString("searching")); @@ -503,12 +588,21 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* } else { - avatar_name = first_name + " " + last_name; + avatar_name = LLCacheName::buildFullName(first_name, last_name); search_results->setEnabled(TRUE); found_one = TRUE; + + LLAvatarName av_name; + av_name.mLegacyFirstName = first_name; + av_name.mLegacyLastName = last_name; + av_name.mDisplayName = avatar_name; + const LLUUID& agent_id = avatar_id; + sAvatarNameMap[agent_id] = av_name; + } LLSD element; element["id"] = avatar_id; // value + element["columns"][0]["column"] = "name"; element["columns"][0]["value"] = avatar_name; search_results->addElement(element); } @@ -522,10 +616,61 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void* } } +void LLFloaterAvatarPicker::processResponse(const LLUUID& query_id, const LLSD& content) +{ + // Check for out-of-date query + if (query_id != mQueryID) return; + + LLScrollListCtrl* search_results = getChild<LLScrollListCtrl>("SearchResults"); + + LLSD agents = content["agents"]; + if (agents.size() == 0) + { + LLStringUtil::format_map_t map; + map["[TEXT]"] = childGetText("Edit"); + LLSD item; + item["id"] = LLUUID::null; + item["columns"][0]["column"] = "name"; + item["columns"][0]["value"] = getString("not_found", map); + search_results->addElement(item); + search_results->setEnabled(false); + getChildView("ok_btn")->setEnabled(false); + return; + } + + // clear "Searching" label on first results + search_results->deleteAllItems(); + + LLSD item; + LLSD::array_const_iterator it = agents.beginArray(); + for ( ; it != agents.endArray(); ++it) + { + const LLSD& row = *it; + item["id"] = row["id"]; + LLSD& columns = item["columns"]; + columns[0]["column"] = "name"; + columns[0]["value"] = row["display_name"]; + columns[1]["column"] = "username"; + columns[1]["value"] = row["username"]; + search_results->addElement(item); + + // add the avatar name to our list + LLAvatarName avatar_name; + avatar_name.fromLLSD(row); + sAvatarNameMap[row["id"].asUUID()] = avatar_name; + } + + getChildView("ok_btn")->setEnabled(true); + search_results->setEnabled(true); + search_results->selectFirstItem(); + onList(); + search_results->setFocus(TRUE); +} + //static void LLFloaterAvatarPicker::editKeystroke(LLLineEditor* caller, void* user_data) { - getChildView("Find")->setEnabled(caller->getText().size() >= 3); + getChildView("Find")->setEnabled(caller->getText().size() > 0); } // virtual @@ -583,8 +728,8 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled() if(list) { uuid_vec_t avatar_ids; - std::vector<std::string> avatar_names; - getSelectedAvatarData(list, avatar_names, avatar_ids); + std::vector<LLAvatarName> avatar_names; + getSelectedAvatarData(list, avatar_ids, avatar_names); return mOkButtonValidateSignal(avatar_ids); } } diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h index b476e898e9..96c039443a 100644 --- a/indra/newview/llfloateravatarpicker.h +++ b/indra/newview/llfloateravatarpicker.h @@ -31,6 +31,7 @@ #include <vector> +class LLAvatarName; class LLScrollListCtrl; class LLFloaterAvatarPicker : public LLFloater @@ -40,7 +41,7 @@ public: typedef validate_signal_t::slot_type validate_callback_t; // The callback function will be called with an avatar name and UUID. - typedef boost::function<void (const std::vector<std::string>&, const uuid_vec_t&)> select_callback_t; + typedef boost::function<void (const uuid_vec_t&, const std::vector<LLAvatarName>&)> select_callback_t; // Call this to select an avatar. static LLFloaterAvatarPicker* show(select_callback_t callback, BOOL allow_multiple = FALSE, @@ -54,6 +55,7 @@ public: void setOkBtnEnableCb(validate_callback_t cb); static void processAvatarPickerReply(class LLMessageSystem* msg, void**); + void processResponse(const LLUUID& query_id, const LLSD& content); BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp index a6613968fb..4e10b4fc2c 100644 --- a/indra/newview/llfloateravatartextures.cpp +++ b/indra/newview/llfloateravatartextures.cpp @@ -27,6 +27,9 @@ #include "llviewerprecompiledheaders.h" #include "llfloateravatartextures.h" +// library headers +#include "llavatarnamecache.h" + #include "llagent.h" #include "llagentwearables.h" #include "lltexturectrl.h" @@ -40,7 +43,6 @@ LLFloaterAvatarTextures::LLFloaterAvatarTextures(const LLSD& id) : LLFloater(id), mID(id.asUUID()) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_avatar_textures.xml"); } LLFloaterAvatarTextures::~LLFloaterAvatarTextures() @@ -132,10 +134,10 @@ void LLFloaterAvatarTextures::refresh() LLVOAvatar *avatarp = find_avatar(mID); if (avatarp) { - std::string fullname; - if (gCacheName->getFullName(avatarp->getID(), fullname)) + LLAvatarName av_name; + if (LLAvatarNameCache::get(avatarp->getID(), &av_name)) { - setTitle(mTitle + ": " + fullname); + setTitle(mTitle + ": " + av_name.getCompleteName()); } for (U32 i=0; i < TEX_NUM_INDICES; i++) { diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp index 0b8605d041..e24df948c4 100644 --- a/indra/newview/llfloaterbeacons.cpp +++ b/indra/newview/llfloaterbeacons.cpp @@ -36,8 +36,6 @@ LLFloaterBeacons::LLFloaterBeacons(const LLSD& seed) : LLFloater(seed) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_beacons.xml"); - // Initialize pipeline states from saved settings. // OK to do at floater constructor time because beacons do not display unless the floater is open // therefore it is OK to not initialize the pipeline state before needed. diff --git a/indra/newview/llfloaterbuildoptions.cpp b/indra/newview/llfloaterbuildoptions.cpp index 7e939a537d..4b6fe4a115 100644 --- a/indra/newview/llfloaterbuildoptions.cpp +++ b/indra/newview/llfloaterbuildoptions.cpp @@ -40,7 +40,6 @@ LLFloaterBuildOptions::LLFloaterBuildOptions(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_build_options.xml"); } LLFloaterBuildOptions::~LLFloaterBuildOptions() diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp index 02c7a6da7e..90f40628a8 100644 --- a/indra/newview/llfloaterbulkpermission.cpp +++ b/indra/newview/llfloaterbulkpermission.cpp @@ -57,7 +57,6 @@ LLFloaterBulkPermission::LLFloaterBulkPermission(const LLSD& seed) mDone(FALSE) { mID.generate(); -// LLUICtrlFactory::getInstance()->buildFloater(this,"floater_bulk_perms.xml"); mCommitCallbackRegistrar.add("BulkPermission.Apply", boost::bind(&LLFloaterBulkPermission::onApplyBtn, this)); mCommitCallbackRegistrar.add("BulkPermission.Close", boost::bind(&LLFloaterBulkPermission::onCloseBtn, this)); mCommitCallbackRegistrar.add("BulkPermission.CheckAll", boost::bind(&LLFloaterBulkPermission::onCheckAll, this)); diff --git a/indra/newview/llfloaterbump.cpp b/indra/newview/llfloaterbump.cpp index af98453c3c..61cf4dad93 100644 --- a/indra/newview/llfloaterbump.cpp +++ b/indra/newview/llfloaterbump.cpp @@ -45,7 +45,6 @@ LLFloaterBump::LLFloaterBump(const LLSD& key) : LLFloater(key) { if(gNoRender) return; - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_bumps.xml"); } @@ -83,7 +82,7 @@ void LLFloaterBump::onOpen(const LLSD& key) void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd) { - if (mcd->mFirstName.empty() || list->getItemCount() >= 20) + if (mcd->mFullName.empty() || list->getItemCount() >= 20) { return; } @@ -121,8 +120,7 @@ void LLFloaterBump::add(LLScrollListCtrl* list, LLMeanCollisionData* mcd) // All above action strings are in XML file LLUIString text = getString(action); text.setArg("[TIME]", timeStr); - text.setArg("[FIRST]", mcd->mFirstName); - text.setArg("[LAST]", mcd->mLastName); + text.setArg("[NAME]", mcd->mFullName); LLSD row; row["id"] = mcd->mPerp; diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp index 32add57737..ee8487b160 100644 --- a/indra/newview/llfloaterbuy.cpp +++ b/indra/newview/llfloaterbuy.cpp @@ -51,7 +51,6 @@ LLFloaterBuy::LLFloaterBuy(const LLSD& key) : LLFloater(key) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_buy_object.xml"); } BOOL LLFloaterBuy::postBuild() @@ -178,7 +177,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info) object_list->addElement(row); floater->getChild<LLUICtrl>("buy_text")->setTextArg("[AMOUNT]", llformat("%d", sale_info.getSalePrice())); - floater->getChild<LLUICtrl>("buy_text")->setTextArg("[NAME]", owner_name); + floater->getChild<LLUICtrl>("buy_name_text")->setTextArg("[NAME]", owner_name); // Must do this after the floater is created, because // sometimes the inventory is already there and diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp index 77fb5590df..a7388d21a3 100644 --- a/indra/newview/llfloaterbuycontents.cpp +++ b/indra/newview/llfloaterbuycontents.cpp @@ -41,6 +41,7 @@ #include "llinventorydefines.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" // for gInventory +#include "llfirstuse.h" #include "llfloaterreg.h" #include "llfloaterinventory.h" // for LLInventoryIcon::getIcon #include "llnotificationsutil.h" @@ -54,7 +55,6 @@ LLFloaterBuyContents::LLFloaterBuyContents(const LLSD& key) : LLFloater(key) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_buy_contents.xml"); } BOOL LLFloaterBuyContents::postBuild() @@ -284,6 +284,10 @@ void LLFloaterBuyContents::onClickBuy() // it doesn't match region info then sale is canceled. LLSelectMgr::getInstance()->sendBuy(gAgent.getID(), category_id, mSaleInfo); + // NOTE: do this here instead of on receipt of object, since contents are transfered + // via a generic BulkUpdateInventory message with no way of distinguishing it from + // other inventory operations + LLFirstUse::newInventory(); closeFloater(); } diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp index a5c62495fe..83105ef27c 100644 --- a/indra/newview/llfloaterbuyland.cpp +++ b/indra/newview/llfloaterbuyland.cpp @@ -180,9 +180,8 @@ public: void updateNames(); // Name cache callback void updateGroupName(const LLUUID& id, - const std::string& first_name, - const std::string& last_name, - BOOL is_group); + const std::string& name, + bool is_group); void refreshUI(); @@ -294,7 +293,6 @@ LLFloaterBuyLandUI::LLFloaterBuyLandUI(const LLSD& key) { LLViewerParcelMgr::getInstance()->addObserver(&mParcelSelectionObserver); -// LLUICtrlFactory::getInstance()->buildFloater(sInstance, "floater_buy_land.xml"); } LLFloaterBuyLandUI::~LLFloaterBuyLandUI() @@ -820,28 +818,26 @@ void LLFloaterBuyLandUI::updateNames() } else if (parcelp->getIsGroupOwned()) { - gCacheName->get(parcelp->getGroupID(), TRUE, + gCacheName->getGroup(parcelp->getGroupID(), boost::bind(&LLFloaterBuyLandUI::updateGroupName, this, - _1, _2, _3, _4)); + _1, _2, _3)); } else { - mParcelSellerName = - LLSLURL("agent", parcelp->getOwnerID(), "inspect").getSLURLString(); + mParcelSellerName = LLSLURL("agent", parcelp->getOwnerID(), "completename").getSLURLString(); } } void LLFloaterBuyLandUI::updateGroupName(const LLUUID& id, - const std::string& first_name, - const std::string& last_name, - BOOL is_group) + const std::string& name, + bool is_group) { LLParcel* parcelp = mParcel->getParcel(); if (parcelp && parcelp->getGroupID() == id) { // request is current - mParcelSellerName = first_name; + mParcelSellerName = name; } } diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index d4067452b0..ad24c6534a 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -345,7 +345,7 @@ BOOL LLFloaterCamera::postBuild() setTitleVisible(TRUE); // restore title visibility after chrome applying mRotate = getChild<LLJoystickCameraRotate>(ORBIT); - mZoom = getChild<LLPanelCameraZoom>(ZOOM); + mZoom = findChild<LLPanelCameraZoom>(ZOOM); mTrack = getChild<LLJoystickCameraTrack>(PAN); assignButton2Mode(CAMERA_CTRL_MODE_MODES, "avatarview_btn"); diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 89e745f651..69f1774ff8 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -107,9 +107,8 @@ LLFloaterColorPicker::LLFloaterColorPicker (LLColorSwatchCtrl* swatch, BOOL show mCanApplyImmediately ( show_apply_immediate ), mContextConeOpacity ( 0.f ) { - // build the majority of the gui using the factory builder - LLUICtrlFactory::getInstance()->buildFloater ( this, "floater_color_picker.xml", NULL ); - + buildFromFile ( "floater_color_picker.xml"); + // create user interface for this picker createUI (); diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp index aacb543267..22816ee802 100644 --- a/indra/newview/llfloaterdaycycle.cpp +++ b/indra/newview/llfloaterdaycycle.cpp @@ -59,7 +59,6 @@ const F32 LLFloaterDayCycle::sHoursPerDay = 24.0f; LLFloaterDayCycle::LLFloaterDayCycle(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_day_cycle_options.xml"); } BOOL LLFloaterDayCycle::postBuild() diff --git a/indra/newview/llfloaterdisplayname.cpp b/indra/newview/llfloaterdisplayname.cpp new file mode 100644 index 0000000000..ac8f107928 --- /dev/null +++ b/indra/newview/llfloaterdisplayname.cpp @@ -0,0 +1,223 @@ +/** + * @file llfloaterdisplayname.cpp + * @author Leyla Farazha + * @brief Implementation of the LLFloaterDisplayName class. + * + * $LicenseInfo:firstyear=2002&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 "llfloaterreg.h" +#include "llfloater.h" + +#include "llnotificationsutil.h" +#include "llviewerdisplayname.h" + +#include "llnotifications.h" +#include "llfloaterdisplayname.h" +#include "llavatarnamecache.h" + +#include "llagent.h" + + +class LLFloaterDisplayName : public LLFloater +{ +public: + LLFloaterDisplayName(const LLSD& key); + virtual ~LLFloaterDisplayName() {}; + /*virtual*/ BOOL postBuild(); + void onSave(); + void onReset(); + void onCancel(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + + void onCacheSetName(bool success, + const std::string& reason, + const LLSD& content); +}; + +LLFloaterDisplayName::LLFloaterDisplayName(const LLSD& key) + : LLFloater(key) +{ +} + +void LLFloaterDisplayName::onOpen(const LLSD& key) +{ + getChild<LLUICtrl>("display_name_editor")->clear(); + getChild<LLUICtrl>("display_name_confirm")->clear(); + + LLAvatarName av_name; + LLAvatarNameCache::get(gAgent.getID(), &av_name); + + F64 now_secs = LLDate::now().secondsSinceEpoch(); + + if (now_secs < av_name.mNextUpdate) + { + // ...can't update until some time in the future + F64 next_update_local_secs = + av_name.mNextUpdate - LLStringOps::getLocalTimeOffset(); + LLDate next_update_local(next_update_local_secs); + // display as "July 18 12:17 PM" + std::string next_update_string = + next_update_local.toHTTPDateString("%B %d %I:%M %p"); + getChild<LLUICtrl>("lockout_text")->setTextArg("[TIME]", next_update_string); + getChild<LLUICtrl>("lockout_text")->setVisible(true); + getChild<LLUICtrl>("save_btn")->setEnabled(false); + getChild<LLUICtrl>("display_name_editor")->setEnabled(false); + getChild<LLUICtrl>("display_name_confirm")->setEnabled(false); + getChild<LLUICtrl>("cancel_btn")->setFocus(TRUE); + + } + else + { + getChild<LLUICtrl>("lockout_text")->setVisible(false); + getChild<LLUICtrl>("save_btn")->setEnabled(true); + getChild<LLUICtrl>("display_name_editor")->setEnabled(true); + getChild<LLUICtrl>("display_name_confirm")->setEnabled(true); + + } +} + +BOOL LLFloaterDisplayName::postBuild() +{ + getChild<LLUICtrl>("reset_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onReset, this)); + getChild<LLUICtrl>("cancel_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onCancel, this)); + getChild<LLUICtrl>("save_btn")->setCommitCallback(boost::bind(&LLFloaterDisplayName::onSave, this)); + + center(); + + return TRUE; +} + +void LLFloaterDisplayName::onCacheSetName(bool success, + const std::string& reason, + const LLSD& content) +{ + if (success) + { + // Inform the user that the change took place, but will take a while + // to percolate. + LLSD args; + args["DISPLAY_NAME"] = content["display_name"]; + LLNotificationsUtil::add("SetDisplayNameSuccess", args); + + // Re-fetch my name, as it may have been sanitized by the service + //LLAvatarNameCache::get(getAvatarId(), + // boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2)); + return; + } + + // Request failed, notify the user + std::string error_tag = content["error_tag"].asString(); + llinfos << "set name failure error_tag " << error_tag << llendl; + + // We might have a localized string for this message + // error_args will usually be empty from the server. + if (!error_tag.empty() + && LLNotifications::getInstance()->templateExists(error_tag)) + { + LLNotificationsUtil::add(error_tag); + return; + } + + // The server error might have a localized message for us + std::string lang_code = LLUI::getLanguage(); + LLSD error_desc = content["error_description"]; + if (error_desc.has( lang_code )) + { + LLSD args; + args["MESSAGE"] = error_desc[lang_code].asString(); + LLNotificationsUtil::add("GenericAlert", args); + return; + } + + // No specific error, throw a generic one + LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); +} + +void LLFloaterDisplayName::onCancel() +{ + setVisible(false); +} + +void LLFloaterDisplayName::onReset() +{ + if (LLAvatarNameCache::useDisplayNames()) + { + LLViewerDisplayName::set("", + boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3)); + } + else + { + LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); + } + + setVisible(false); +} + + +void LLFloaterDisplayName::onSave() +{ + std::string display_name_utf8 = getChild<LLUICtrl>("display_name_editor")->getValue().asString(); + std::string display_name_confirm = getChild<LLUICtrl>("display_name_confirm")->getValue().asString(); + + if (display_name_utf8.compare(display_name_confirm)) + { + LLNotificationsUtil::add("SetDisplayNameMismatch"); + return; + } + + const U32 DISPLAY_NAME_MAX_LENGTH = 31; // characters, not bytes + LLWString display_name_wstr = utf8string_to_wstring(display_name_utf8); + if (display_name_wstr.size() > DISPLAY_NAME_MAX_LENGTH) + { + LLSD args; + args["LENGTH"] = llformat("%d", DISPLAY_NAME_MAX_LENGTH); + LLNotificationsUtil::add("SetDisplayNameFailedLength", args); + return; + } + + if (LLAvatarNameCache::useDisplayNames()) + { + LLViewerDisplayName::set(display_name_utf8, + boost::bind(&LLFloaterDisplayName::onCacheSetName, this, _1, _2, _3)); + } + else + { + LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); + } + + setVisible(false); +} + + +////////////////////////////////////////////////////////////////////////////// +// LLInspectObjectUtil +////////////////////////////////////////////////////////////////////////////// +void LLFloaterDisplayNameUtil::registerFloater() +{ + LLFloaterReg::add("display_name", "floater_display_name.xml", + &LLFloaterReg::build<LLFloaterDisplayName>); +} diff --git a/indra/newview/llfloaterdisplayname.h b/indra/newview/llfloaterdisplayname.h new file mode 100644 index 0000000000..a00bf56712 --- /dev/null +++ b/indra/newview/llfloaterdisplayname.h @@ -0,0 +1,38 @@ +/** + * @file llfloaterdisplayname.h + * + * $LicenseInfo:firstyear=2009&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 LLFLOATERDISPLAYNAME_H +#define LLFLOATERDISPLAYNAME_H + + +namespace LLFloaterDisplayNameUtil +{ + // Register with LLFloaterReg + void registerFloater(); +} + + + +#endif diff --git a/indra/newview/llfloaterenvsettings.cpp b/indra/newview/llfloaterenvsettings.cpp index 337d4934e1..fcaef1f34b 100644 --- a/indra/newview/llfloaterenvsettings.cpp +++ b/indra/newview/llfloaterenvsettings.cpp @@ -50,7 +50,6 @@ LLFloaterEnvSettings::LLFloaterEnvSettings(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_env_settings.xml"); } // virtual LLFloaterEnvSettings::~LLFloaterEnvSettings() diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp index ee2ba2ba54..0b5ac8e798 100644 --- a/indra/newview/llfloaterevent.cpp +++ b/indra/newview/llfloaterevent.cpp @@ -38,10 +38,11 @@ #include "llcachename.h" #include "llcommandhandler.h" // secondlife:///app/chat/ support #include "lleventflags.h" -#include "lleventnotifier.h" +#include "llmediactrl.h" #include "llexpandabletextbox.h" #include "llfloater.h" #include "llfloaterreg.h" +#include "llmediactrl.h" #include "llfloaterworldmap.h" #include "llinventorymodel.h" #include "llsecondlifeurls.h" @@ -57,35 +58,10 @@ #include "lltrans.h" -class LLEventHandler : public LLCommandHandler -{ -public: - // requires trusted browser to trigger - LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { } - bool handle(const LLSD& params, const LLSD& query_map, - LLMediaCtrl* web) - { - if (params.size() < 1) - { - return false; - } - - LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); - if (floater) - { - floater->setEventID(params[0].asInteger()); - LLFloaterReg::showTypedInstance<LLFloaterEvent>("event"); - return true; - } - - return false; - } -}; -LLEventHandler gEventHandler; - LLFloaterEvent::LLFloaterEvent(const LLSD& key) : LLFloater(key), - + LLViewerMediaObserver(), + mBrowser(NULL), mEventID(0) { } @@ -98,253 +74,51 @@ LLFloaterEvent::~LLFloaterEvent() BOOL LLFloaterEvent::postBuild() { - mTBName = getChild<LLTextBox>("event_name"); - - mTBCategory = getChild<LLTextBox>("event_category"); - - mTBDate = getChild<LLTextBox>("event_date"); - - mTBDuration = getChild<LLTextBox>("event_duration"); - - mTBDesc = getChild<LLExpandableTextBox>("event_desc"); - - mTBRunBy = getChild<LLTextBox>("event_runby"); - mTBLocation = getChild<LLTextBox>("event_location"); - mTBCover = getChild<LLTextBox>("event_cover"); - - mTeleportBtn = getChild<LLButton>( "teleport_btn"); - mTeleportBtn->setClickedCallback(onClickTeleport, this); - - mMapBtn = getChild<LLButton>( "map_btn"); - mMapBtn->setClickedCallback(onClickMap, this); - - mNotifyBtn = getChild<LLButton>( "notify_btn"); - mNotifyBtn->setClickedCallback(onClickNotify, this); - - mCreateEventBtn = getChild<LLButton>( "create_event_btn"); - mCreateEventBtn->setClickedCallback(onClickCreateEvent, this); - - mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn"); - mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this)); - - return TRUE; -} - -void LLFloaterEvent::setEventID(const U32 event_id) -{ - mEventID = event_id; - // Should reset all of the panel state here - resetInfo(); - - if (event_id != 0) + mBrowser = getChild<LLMediaCtrl>("browser"); + if (mBrowser) { - sendEventInfoRequest(); + mBrowser->addObserver(this); } -} - -void LLFloaterEvent::onClickDeleteEvent() -{ - LLMessageSystem* msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_EventGodDelete); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - - msg->nextBlockFast(_PREHASH_EventData); - msg->addU32Fast(_PREHASH_EventID, mEventID); - gAgent.sendReliableMessage(); -} - -void LLFloaterEvent::sendEventInfoRequest() -{ - LLMessageSystem *msg = gMessageSystem; - - msg->newMessageFast(_PREHASH_EventInfoRequest); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() ); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() ); - msg->nextBlockFast(_PREHASH_EventData); - msg->addU32Fast(_PREHASH_EventID, mEventID); - gAgent.sendReliableMessage(); + return TRUE; } -//static -void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **) +void LLFloaterEvent::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event) { - // extract the agent id - LLUUID agent_id; - msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id ); - - LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); - - if(floater) + switch (event) { - floater->mEventInfo.unpack(msg); - floater->mTBName->setText(floater->mEventInfo.mName); - floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr); - floater->mTBDate->setText(floater->mEventInfo.mTimeStr); - floater->mTBDesc->setText(floater->mEventInfo.mDesc); - floater->mTBRunBy->setText(LLSLURL("agent", floater->mEventInfo.mRunByID, "inspect").getSLURLString()); - - floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60)); - - if (!floater->mEventInfo.mHasCover) - { - floater->mTBCover->setText(floater->getString("none")); - } - else - { - floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover)); - } - - F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX]; - F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY]; - - S32 region_x = llround(global_x) % REGION_WIDTH_UNITS; - S32 region_y = llround(global_y) % REGION_WIDTH_UNITS; - S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]); - - std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z); - floater->mTBLocation->setText(desc); - - floater->getChildView("rating_icon_m")->setVisible( FALSE); - floater->getChildView("rating_icon_r")->setVisible( FALSE); - floater->getChildView("rating_icon_pg")->setVisible( FALSE); - floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("unknown")); - - //for some reason there's not adult flags for now, so see if region is adult and then - //set flags - LLWorldMapMessage::url_callback_t cb = boost::bind( ®ionInfoCallback, floater->mEventInfo.mID, _1); - LLWorldMapMessage::getInstance()->sendNamedRegionRequest(floater->mEventInfo.mSimName, cb, std::string("unused"), false); - - if (floater->mEventInfo.mUnixTime < time_corrected()) - { - floater->mNotifyBtn->setEnabled(FALSE); - } - else - { - floater->mNotifyBtn->setEnabled(TRUE); - } - - if (gEventNotifier.hasNotification(floater->mEventInfo.mID)) - { - floater->mNotifyBtn->setLabel(floater->getString("dont_notify")); - } - else - { - floater->mNotifyBtn->setLabel(floater->getString("notify")); - } - - floater->mMapBtn->setEnabled(TRUE); - floater->mTeleportBtn->setEnabled(TRUE); + case MEDIA_EVENT_NAVIGATE_BEGIN: + getChild<LLUICtrl>("status_text")->setValue(getString("loading_text")); + break; + + case MEDIA_EVENT_NAVIGATE_COMPLETE: + getChild<LLUICtrl>("status_text")->setValue(getString("done_text")); + break; + + default: + break; } } -//static -void LLFloaterEvent::regionInfoCallback(U32 event_id, U64 region_handle) +void LLFloaterEvent::setEventID(const U32 event_id) { - LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(region_handle); - LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event"); + mEventID = event_id; - if (sim_info && floater && (event_id == floater->getEventID())) + if (event_id != 0) { - // update the event with the maturity info - if (sim_info->isAdult()) - { - floater->getChildView("rating_icon_m")->setVisible( FALSE); - floater->getChildView("rating_icon_r")->setVisible( TRUE); - floater->getChildView("rating_icon_pg")->setVisible( FALSE); - floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("adult")); - - } - else if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE) - { - floater->getChildView("rating_icon_m")->setVisible( TRUE); - floater->getChildView("rating_icon_r")->setVisible( FALSE); - floater->getChildView("rating_icon_pg")->setVisible( FALSE); - floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("moderate")); - } - else - { - floater->getChildView("rating_icon_m")->setVisible( FALSE); - floater->getChildView("rating_icon_r")->setVisible( FALSE); - floater->getChildView("rating_icon_pg")->setVisible( TRUE); - floater->getChild<LLUICtrl>("rating_value")->setValue(floater->getString("general")); - } + LLSD subs; + subs["EVENT_ID"] = (S32)event_id; + // get the search URL and expand all of the substitutions + // (also adds things like [LANGUAGE], [VERSION], [OS], etc.) + std::ostringstream url; + url << gSavedSettings.getString("EventURL") << event_id << "/" << std::endl; + // and load the URL in the web view + mBrowser->navigateTo(url.str()); + } } void LLFloaterEvent::draw() { - mGodDeleteEventBtn->setVisible(gAgent.isGodlike()); - LLPanel::draw(); } - -void LLFloaterEvent::resetInfo() -{ - mTBName->setText(LLStringUtil::null); - mTBCategory->setText(LLStringUtil::null); - mTBDate->setText(LLStringUtil::null); - mTBDesc->setText(LLStringUtil::null); - mTBDuration->setText(LLStringUtil::null); - mTBCover->setText(LLStringUtil::null); - mTBLocation->setText(LLStringUtil::null); - mTBRunBy->setText(LLStringUtil::null); - mNotifyBtn->setEnabled(FALSE); - mMapBtn->setEnabled(FALSE); - mTeleportBtn->setEnabled(FALSE); -} - -// static -void LLFloaterEvent::onClickTeleport(void* data) -{ - LLFloaterEvent* self = (LLFloaterEvent*)data; - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance) - { - gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal); - worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal); - } -} - - -// static -void LLFloaterEvent::onClickMap(void* data) -{ - LLFloaterEvent* self = (LLFloaterEvent*)data; - LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance(); - - if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance) - { - worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal); - LLFloaterReg::showInstance("world_map", "center"); - } -} - - -// static -void LLFloaterEvent::onClickCreateEvent(void* data) -{ - LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage); -} - - -// static -void LLFloaterEvent::onClickNotify(void *data) -{ - LLFloaterEvent* self = (LLFloaterEvent*)data; - - if (!gEventNotifier.hasNotification(self->mEventID)) - { - gEventNotifier.add(self->mEventInfo); - self->mNotifyBtn->setLabel(self->getString("dont_notify")); - } - else - { - gEventNotifier.remove(self->mEventInfo.mID); - self->mNotifyBtn->setLabel(self->getString("notify")); - } -} diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h index bfed2f259b..b1963309da 100644 --- a/indra/newview/llfloaterevent.h +++ b/indra/newview/llfloaterevent.h @@ -28,17 +28,15 @@ #define LL_LLFLOATEREVENT_H #include "llfloater.h" -#include "lleventinfo.h" -#include "lluuid.h" -#include "v3dmath.h" +#include "llviewermediaobserver.h" -class LLTextBox; -class LLTextEditor; + +class LLMediaCtrl; class LLButton; -class LLExpandableTextBox; -class LLMessageSystem; -class LLFloaterEvent : public LLFloater +class LLFloaterEvent : public LLFloater, + public LLViewerMediaObserver + { public: LLFloaterEvent(const LLSD& key); @@ -48,44 +46,18 @@ public: /*virtual*/ void draw(); void setEventID(const U32 event_id); - void sendEventInfoRequest(); - - static void processEventInfoReply(LLMessageSystem *msg, void **); U32 getEventID() { return mEventID; } -protected: - void resetInfo(); - - static void onClickTeleport(void*); - static void onClickMap(void*); - //static void onClickLandmark(void*); - static void onClickCreateEvent(void*); - static void onClickNotify(void*); - void onClickDeleteEvent(); - - static void regionInfoCallback(U32 event_id, U64 region_handle); protected: + /*virtual*/ void handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event); + U32 mEventID; - LLEventInfo mEventInfo; - - LLTextBox* mTBName; - LLTextBox* mTBCategory; - LLTextBox* mTBDate; - LLTextBox* mTBDuration; - LLExpandableTextBox* mTBDesc; - LLTextBox* mTBRunBy; - LLTextBox* mTBLocation; - LLTextBox* mTBCover; + LLMediaCtrl* mBrowser; - LLButton* mTeleportBtn; - LLButton* mMapBtn; - LLButton* mCreateEventBtn; - LLButton* mGodDeleteEventBtn; - LLButton* mNotifyBtn; }; #endif // LL_LLFLOATEREVENT_H diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp index f95112a8ab..a34e0353ec 100644 --- a/indra/newview/llfloatergodtools.cpp +++ b/indra/newview/llfloatergodtools.cpp @@ -28,6 +28,7 @@ #include "llfloatergodtools.h" +#include "llavatarnamecache.h" #include "llcoord.h" #include "llfontgl.h" #include "llframetimer.h" @@ -121,8 +122,6 @@ LLFloaterGodTools::LLFloaterGodTools(const LLSD& key) mFactoryMap["region"] = LLCallbackMap(createPanelRegion, this); mFactoryMap["objects"] = LLCallbackMap(createPanelObjects, this); mFactoryMap["request"] = LLCallbackMap(createPanelRequest, this); -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_god_tools.xml"); - } BOOL LLFloaterGodTools::postBuild() @@ -210,13 +209,6 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) llassert(msg); if (!msg) return; - LLHost host = msg->getSender(); - if (host != gAgent.getRegionHost()) - { - // update is for a different region than the one we're in - return; - } - //const S32 SIM_NAME_BUF = 256; U32 region_flags; U8 sim_access; @@ -234,6 +226,8 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) S32 redirect_grid_y; LLUUID cache_id; + LLHost host = msg->getSender(); + msg->getStringFast(_PREHASH_RegionInfo, _PREHASH_SimName, sim_name); msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_EstateID, estate_id); msg->getU32Fast(_PREHASH_RegionInfo, _PREHASH_ParentEstateID, parent_estate_id); @@ -243,6 +237,15 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg) msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_ObjectBonusFactor, object_bonus_factor); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_BillableFactor, billable_factor); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_WaterHeight, water_height); + + if (host != gAgent.getRegionHost()) + { + // Update is for a different region than the one we're in. + // Just check for a waterheight change. + LLWorld::getInstance()->waterHeightRegionInfo(sim_name, water_height); + return; + } + msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainRaiseLimit, terrain_raise_limit); msg->getF32Fast(_PREHASH_RegionInfo, _PREHASH_TerrainLowerLimit, terrain_lower_limit); msg->getS32Fast(_PREHASH_RegionInfo, _PREHASH_PricePerMeter, price_per_meter); @@ -1145,11 +1148,11 @@ void LLPanelObjectTools::onClickSetBySelection(void* data) panelp->getChild<LLUICtrl>("target_avatar_name")->setValue(name); } -void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelObjectTools::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) { if (ids.empty() || names.empty()) return; mTargetAvatar = ids[0]; - getChild<LLUICtrl>("target_avatar_name")->setValue(names[0]); + getChild<LLUICtrl>("target_avatar_name")->setValue(names[0].getCompleteName()); refresh(); } diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h index 60fc95580f..1aa8b838fb 100644 --- a/indra/newview/llfloatergodtools.h +++ b/indra/newview/llfloatergodtools.h @@ -35,6 +35,7 @@ #include "llpanel.h" #include <vector> +class LLAvatarName; class LLButton; class LLCheckBoxCtrl; class LLComboBox; @@ -225,7 +226,7 @@ public: void onChangeAnything(); void onApplyChanges(); void onClickSet(); - void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids); + void callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names); void onClickDeletePublicOwnedBy(); void onClickDeleteAllScriptedOwnedBy(); void onClickDeleteAllOwnedBy(); diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 679c932995..d84364a68a 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -339,11 +339,10 @@ void LLPanelGroups::onGroupList(LLUICtrl* ctrl, void* userdata) if(self) self->enableButtons(); } -void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 powers_mask) +void init_group_list(LLScrollListCtrl* group_list, const LLUUID& highlight_id, U64 powers_mask) { S32 count = gAgent.mGroups.count(); LLUUID id; - LLCtrlListInterface *group_list = ctrl->getListInterface(); if (!group_list) return; group_list->operateOnAll(LLCtrlListInterface::OP_DELETE); @@ -367,10 +366,12 @@ void init_group_list(LLScrollListCtrl* ctrl, const LLUUID& highlight_id, U64 pow element["columns"][0]["font"]["name"] = "SANSSERIF"; element["columns"][0]["font"]["style"] = style; - group_list->addElement(element, ADD_SORTED); + group_list->addElement(element); } } + group_list->sortOnce(0, TRUE); + // add "none" to list at top { std::string style = "NORMAL"; diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index c6e5126ab1..1e91710552 100644 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -57,7 +57,6 @@ LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key) mFogRatio(0.0), mProbeHardwareOnStartup(FALSE) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hardware_settings.xml"); } LLFloaterHardwareSettings::~LLFloaterHardwareSettings() @@ -105,6 +104,8 @@ void LLFloaterHardwareSettings::refreshEnabledState() getChildView("(brightness, lower is brighter)")->setEnabled(!gPipeline.canUseWindLightShaders()); getChildView("fog")->setEnabled(!gPipeline.canUseWindLightShaders()); getChildView("fsaa")->setEnabled(gPipeline.canUseAntiAliasing()); + getChildView("antialiasing restart")->setVisible(!gSavedSettings.getBOOL("RenderUseFBO")); + /* Enable to reset fsaa value to disabled when feature is not available. if (!gPipeline.canUseAntiAliasing()) { @@ -130,30 +131,6 @@ BOOL LLFloaterHardwareSettings::postBuild() void LLFloaterHardwareSettings::apply() { - // Anisotropic rendering - BOOL old_anisotropic = LLImageGL::sGlobalUseAnisotropic; - LLImageGL::sGlobalUseAnisotropic = getChild<LLUICtrl>("ani")->getValue(); - - U32 fsaa = (U32) getChild<LLUICtrl>("fsaa")->getValue().asInteger(); - U32 old_fsaa = gSavedSettings.getU32("RenderFSAASamples"); - - BOOL logged_in = (LLStartUp::getStartupState() >= STATE_STARTED); - - if (old_fsaa != fsaa) - { - gSavedSettings.setU32("RenderFSAASamples", fsaa); - LLWindow* window = gViewerWindow->getWindow(); - LLCoordScreen size; - window->getSize(&size); - gViewerWindow->changeDisplaySettings(size, - gSavedSettings.getBOOL("DisableVerticalSync"), - logged_in); - } - else if (old_anisotropic != LLImageGL::sGlobalUseAnisotropic) - { - gViewerWindow->restartDisplay(logged_in); - } - refresh(); } diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp index 8fc0598248..4181d1906e 100644 --- a/indra/newview/llfloaterhud.cpp +++ b/indra/newview/llfloaterhud.cpp @@ -54,8 +54,6 @@ LLFloaterHUD::LLFloaterHUD(const LLSD& key) return; } - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_hud.xml"); - // Don't grab the focus as it will impede performing in-world actions // while using the HUD setIsChrome(TRUE); diff --git a/indra/newview/llfloaterinspect.cpp b/indra/newview/llfloaterinspect.cpp index 8e7f7e083c..a09b9ea235 100644 --- a/indra/newview/llfloaterinspect.cpp +++ b/indra/newview/llfloaterinspect.cpp @@ -31,7 +31,7 @@ #include "llfloaterreg.h" #include "llfloatertools.h" #include "llavataractions.h" -#include "llcachename.h" +#include "llavatarnamecache.h" #include "llscrolllistctrl.h" #include "llscrolllistitem.h" #include "llselectmgr.h" @@ -47,7 +47,6 @@ LLFloaterInspect::LLFloaterInspect(const LLSD& key) : LLFloater(key), mDirty(FALSE) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inspect.xml"); mCommitCallbackRegistrar.add("Inspect.OwnerProfile", boost::bind(&LLFloaterInspect::onClickOwnerProfile, this)); mCommitCallbackRegistrar.add("Inspect.CreatorProfile", boost::bind(&LLFloaterInspect::onClickCreatorProfile, this)); mCommitCallbackRegistrar.add("Inspect.SelectObject", boost::bind(&LLFloaterInspect::onSelectObject, this)); @@ -206,8 +205,12 @@ void LLFloaterInspect::refresh() substitution["datetime"] = (S32) timestamp; LLStringUtil::format (timeStr, substitution); - gCacheName->getFullName(obj->mPermissions->getOwner(), owner_name); - gCacheName->getFullName(obj->mPermissions->getCreator(), creator_name); + LLAvatarName av_name; + LLAvatarNameCache::get(obj->mPermissions->getOwner(), &av_name); + owner_name = av_name.getCompleteName(); + LLAvatarNameCache::get(obj->mPermissions->getCreator(), &av_name); + creator_name = av_name.getCompleteName(); + row["id"] = obj->getObject()->getID(); row["columns"][0]["column"] = "object_name"; row["columns"][0]["type"] = "text"; diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp index 0891023a6d..df769bdd88 100644 --- a/indra/newview/llfloaterinventory.cpp +++ b/indra/newview/llfloaterinventory.cpp @@ -54,7 +54,7 @@ LLFloaterInventory::~LLFloaterInventory() BOOL LLFloaterInventory::postBuild() { - mPanelMainInventory = getChild<LLPanelMainInventory>("Inventory Panel"); + mPanelMainInventory = findChild<LLPanelMainInventory>("Inventory Panel"); return TRUE; } diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp index e1994bb8bc..c37798c330 100644 --- a/indra/newview/llfloaterjoystick.cpp +++ b/indra/newview/llfloaterjoystick.cpp @@ -44,8 +44,6 @@ LLFloaterJoystick::LLFloaterJoystick(const LLSD& data) : LLFloater(data) { - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_joystick.xml"); - initFromSettings(); } diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp index a92273521f..68b1770bb2 100644 --- a/indra/newview/llfloaterlagmeter.cpp +++ b/indra/newview/llfloaterlagmeter.cpp @@ -47,7 +47,6 @@ const std::string LAG_GOOD_IMAGE_NAME = "lag_status_good.tga"; LLFloaterLagMeter::LLFloaterLagMeter(const LLSD& key) : LLFloater(key) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_lagmeter.xml"); mCommitCallbackRegistrar.add("LagMeter.ClickShrink", boost::bind(&LLFloaterLagMeter::onClickShrink, this)); } diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 2f080ab334..a6025661b7 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -31,7 +31,7 @@ #include "llfloaterland.h" -#include "llcachename.h" +#include "llavatarnamecache.h" #include "llfocusmgr.h" #include "llnotificationsutil.h" #include "llparcel.h" @@ -248,8 +248,6 @@ LLFloaterLand::LLFloaterLand(const LLSD& seed) mFactoryMap["land_media_panel"] = LLCallbackMap(createPanelLandMedia, this); mFactoryMap["land_access_panel"] = LLCallbackMap(createPanelLandAccess, this); - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_about_land.xml", false); - sObserver = new LLParcelSelectionObserver(); LLViewerParcelMgr::getInstance()->addObserver( sObserver ); } @@ -567,7 +565,10 @@ void LLPanelLandGeneral::refresh() if (regionp) { insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY); - mLandType->setText(LLTrans::getString(regionp->getSimProductName())); + + std::string land_type; + bool is_land_type_localized = LLTrans::findString(land_type, regionp->getSimProductName()); + mLandType->setText(is_land_type_localized ? land_type : regionp->getSimProductName()); } // estate owner/manager cannot edit other parts of the parcel @@ -1377,10 +1378,7 @@ bool LLPanelLandObjects::callbackReturnOwnerObjects(const LLSD& notification, co } else { - std::string first, last; - gCacheName->getName(owner_id, first, last); - args["FIRST"] = first; - args["LAST"] = last; + args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString(); LLNotificationsUtil::add("OtherObjectsReturned", args); } send_return_objects_message(parcel->getLocalID(), RT_OWNER); @@ -1598,9 +1596,9 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo } // Placeholder for name. - std::string name; - gCacheName->getFullName(owner_id, name); - item_params.columns.add().value(name).font(FONT).column("name"); + LLAvatarName av_name; + LLAvatarNameCache::get(owner_id, &av_name); + item_params.columns.add().value(av_name.getCompleteName()).font(FONT).column("name"); object_count_str = llformat("%d", object_count); item_params.columns.add().value(object_count_str).font(FONT).column("count"); @@ -1709,9 +1707,7 @@ void LLPanelLandObjects::onClickReturnOwnerObjects(void* userdata) } else { - std::string name; - gCacheName->getFullName(owner_id, name); - args["NAME"] = name; + args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString(); LLNotificationsUtil::add("ReturnObjectsOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOwnerObjects, panelp, _1, _2)); } } @@ -1770,10 +1766,7 @@ void LLPanelLandObjects::onClickReturnOtherObjects(void* userdata) } else { - std::string name; - gCacheName->getFullName(owner_id, name); - args["NAME"] = name; - + args["NAME"] = LLSLURL("agent", owner_id, "completename").getSLURLString(); LLNotificationsUtil::add("ReturnObjectsNotOwnedByUser", args, LLSD(), boost::bind(&LLPanelLandObjects::callbackReturnOtherObjects, panelp, _1, _2)); } } @@ -2434,7 +2427,7 @@ void LLPanelLandAccess::refresh() suffix.append(" " + parent_floater->getString("Remaining") + ")"); } if (mListAccess) - mListAccess->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); + mListAccess->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix); } } @@ -2475,7 +2468,7 @@ void LLPanelLandAccess::refresh() } suffix.append(" " + parent_floater->getString("Remaining") + ")"); } - mListBanned->addNameItem(entry.mID, ADD_SORTED, TRUE, suffix); + mListBanned->addNameItem(entry.mID, ADD_DEFAULT, TRUE, suffix); } } @@ -2764,12 +2757,12 @@ void LLPanelLandAccess::onCommitAny(LLUICtrl *ctrl, void *userdata) void LLPanelLandAccess::onClickAddAccess() { - gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1,_2)) ); + gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1)) ); } -void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids) { - if (!names.empty() && !ids.empty()) + if (!ids.empty()) { LLUUID id = ids[0]; LLParcel* parcel = mParcel->getParcel(); @@ -2808,13 +2801,13 @@ void LLPanelLandAccess::onClickRemoveAccess(void* data) // static void LLPanelLandAccess::onClickAddBanned() { - gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1,_2))); + gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBBanned, this, _1))); } // static -void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids) { - if (!names.empty() && !ids.empty()) + if (!ids.empty()) { LLUUID id = ids[0]; LLParcel* parcel = mParcel->getParcel(); diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h index 309e0ee4e1..a096fb64cd 100644 --- a/indra/newview/llfloaterland.h +++ b/indra/newview/llfloaterland.h @@ -372,8 +372,8 @@ public: void onClickAddAccess(); void onClickAddBanned(); - void callbackAvatarCBBanned(const std::vector<std::string>& names, const uuid_vec_t& ids); - void callbackAvatarCBAccess(const std::vector<std::string>& names, const uuid_vec_t& ids); + void callbackAvatarCBBanned(const uuid_vec_t& ids); + void callbackAvatarCBAccess(const uuid_vec_t& ids); protected: LLNameListCtrl* mListAccess; diff --git a/indra/newview/llfloaterlandholdings.cpp b/indra/newview/llfloaterlandholdings.cpp index 31f20fbd29..98e9b74278 100644 --- a/indra/newview/llfloaterlandholdings.cpp +++ b/indra/newview/llfloaterlandholdings.cpp @@ -60,7 +60,6 @@ LLFloaterLandHoldings::LLFloaterLandHoldings(const LLSD& key) mSortColumn(""), mSortAscending(TRUE) { -// LLUICtrlFactory::getInstance()->buildFloater(floater, "floater_land_holdings.xml"); } BOOL LLFloaterLandHoldings::postBuild() @@ -69,10 +68,9 @@ BOOL LLFloaterLandHoldings::postBuild() childSetAction("Show on Map", onClickMap, this); // Grant list - getChild<LLScrollListCtrl>("grant list")->setDoubleClickCallback(onGrantList, this); - - LLCtrlListInterface *list = childGetListInterface("grant list"); - if (!list) return TRUE; + LLScrollListCtrl* grant_list = getChild<LLScrollListCtrl>("grant list"); + grant_list->sortByColumnIndex(0, TRUE); + grant_list->setDoubleClickCallback(onGrantList, this); S32 count = gAgent.mGroups.count(); for(S32 i = 0; i < count; ++i) @@ -91,7 +89,7 @@ BOOL LLFloaterLandHoldings::postBuild() element["columns"][1]["value"] = areastr; element["columns"][1]["font"] = "SANSSERIF"; - list->addElement(element, ADD_SORTED); + grant_list->addElement(element); } center(); diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp index c9d7eff02b..351b9ac5da 100644 --- a/indra/newview/llfloatermap.cpp +++ b/indra/newview/llfloatermap.cpp @@ -43,6 +43,8 @@ #include "lldraghandle.h" #include "lltextbox.h" #include "llviewermenu.h" +#include "llfloaterworldmap.h" +#include "llagent.h" // // Constants @@ -72,7 +74,6 @@ LLFloaterMap::LLFloaterMap(const LLSD& key) mTextBoxSouthWest(NULL), mMap(NULL) { - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_map.xml", FALSE); } LLFloaterMap::~LLFloaterMap() @@ -96,7 +97,7 @@ BOOL LLFloaterMap::postBuild() mTextBoxNorthWest = getChild<LLTextBox> ("floater_map_northwest"); LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; - + registrar.add("Minimap.Zoom", boost::bind(&LLFloaterMap::handleZoom, this, _2)); registrar.add("Minimap.Tracker", boost::bind(&LLFloaterMap::handleStopTracking, this, _2)); @@ -123,9 +124,36 @@ BOOL LLFloaterMap::postBuild() return TRUE; } -BOOL LLFloaterMap::handleDoubleClick( S32 x, S32 y, MASK mask ) +BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask) { - LLFloaterReg::showInstance("world_map"); + // If floater is minimized, minimap should be shown on doubleclick (STORM-299) + if (isMinimized()) + { + setMinimized(FALSE); + return TRUE; + } + + LLVector3d pos_global = mMap->viewPosToGlobal(x, y); + + // If we're not tracking a beacon already, double-click will set one + if (!LLTracker::isTracking(NULL)) + { + LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance(); + if (world_map) + { + world_map->trackLocation(pos_global); + } + } + + if (gSavedSettings.getBOOL("DoubleClickTeleport")) + { + // If DoubleClickTeleport is on, double clicking the minimap will teleport there + gAgent.teleportViaLocationLookAt(pos_global); + } + else + { + LLFloaterReg::showInstance("world_map"); + } return TRUE; } @@ -258,7 +286,7 @@ void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent) void LLFloaterMap::handleZoom(const LLSD& userdata) { std::string level = userdata.asString(); - + F32 scale = 0.0f; if (level == std::string("close")) scale = LLNetMap::MAP_SCALE_MAX; diff --git a/indra/newview/llfloatermediabrowser.cpp b/indra/newview/llfloatermediabrowser.cpp index 434d0681ab..d20092e344 100644 --- a/indra/newview/llfloatermediabrowser.cpp +++ b/indra/newview/llfloatermediabrowser.cpp @@ -45,7 +45,11 @@ #include "llviewermedia.h" #include "llviewerparcelmedia.h" #include "llcombobox.h" +#include "llwindow.h" +#include "lllayoutstack.h" +#include "llcheckboxctrl.h" +#include "llnotifications.h" // TEMP #include "llsdutil.h" @@ -53,10 +57,124 @@ LLFloaterMediaBrowser::LLFloaterMediaBrowser(const LLSD& key) : LLFloater(key) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_browser.xml"); +} +//static +void LLFloaterMediaBrowser::create(const std::string &url, const std::string& target, const std::string& uuid) +{ + lldebugs << "url = " << url << ", target = " << target << ", uuid = " << uuid << llendl; + + std::string tag = target; + + if(target.empty() || target == "_blank") + { + if(!uuid.empty()) + { + tag = uuid; + } + else + { + // create a unique tag for this instance + LLUUID id; + id.generate(); + tag = id.asString(); + } + } + + S32 browser_window_limit = gSavedSettings.getS32("MediaBrowserWindowLimit"); + + if(LLFloaterReg::findInstance("media_browser", tag) != NULL) + { + // There's already a media browser for this tag, so we won't be opening a new window. + } + else if(browser_window_limit != 0) + { + // showInstance will open a new window. Figure out how many media browsers are already open, + // and close the least recently opened one if this will put us over the limit. + + LLFloaterReg::const_instance_list_t &instances = LLFloaterReg::getFloaterList("media_browser"); + lldebugs << "total instance count is " << instances.size() << llendl; + + for(LLFloaterReg::const_instance_list_t::const_iterator iter = instances.begin(); iter != instances.end(); iter++) + { + lldebugs << " " << (*iter)->getKey() << llendl; + } + + if(instances.size() >= (size_t)browser_window_limit) + { + // Destroy the least recently opened instance + (*instances.begin())->closeFloater(); + } + } + + LLFloaterMediaBrowser *browser = dynamic_cast<LLFloaterMediaBrowser*> (LLFloaterReg::showInstance("media_browser", tag)); + llassert(browser); + if(browser) + { + browser->mUUID = uuid; + + // tell the browser instance to load the specified URL + browser->openMedia(url, target); + LLViewerMedia::proxyWindowOpened(target, uuid); + } } +//static +void LLFloaterMediaBrowser::closeRequest(const std::string &uuid) +{ + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser"); + lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) + { + LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter); + lldebugs << " " << i->mUUID << llendl; + if (i && i->mUUID == uuid) + { + i->closeFloater(false); + return; + } + } +} + +//static +void LLFloaterMediaBrowser::geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height) +{ + LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("media_browser"); + lldebugs << "instance list size is " << inst_list.size() << ", incoming uuid is " << uuid << llendl; + for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter) + { + LLFloaterMediaBrowser* i = dynamic_cast<LLFloaterMediaBrowser*>(*iter); + lldebugs << " " << i->mUUID << llendl; + if (i && i->mUUID == uuid) + { + i->geometryChanged(x, y, width, height); + return; + } +} +} + +void LLFloaterMediaBrowser::geometryChanged(S32 x, S32 y, S32 width, S32 height) +{ + // Make sure the layout of the browser control is updated, so this calculation is correct. + LLLayoutStack::updateClass(); + + // TODO: need to adjust size and constrain position to make sure floaters aren't moved outside the window view, etc. + LLCoordWindow window_size; + getWindow()->getSize(&window_size); + + // Adjust width and height for the size of the chrome on the Media Browser window. + width += getRect().getWidth() - mBrowser->getRect().getWidth(); + height += getRect().getHeight() - mBrowser->getRect().getHeight(); + + LLRect geom; + geom.setOriginAndSize(x, window_size.mY - (y + height), width, height); + + lldebugs << "geometry change: " << geom << llendl; + + handleReshape(geom,false); +} + + void LLFloaterMediaBrowser::draw() { getChildView("go")->setEnabled(!mAddressCombo->getValue().asString().empty()); @@ -99,6 +217,7 @@ BOOL LLFloaterMediaBrowser::postBuild() mAddressCombo = getChild<LLComboBox>("address"); mAddressCombo->setCommitCallback(onEnterAddress, this); + mAddressCombo->sortByName(); childSetAction("back", onClickBack, this); childSetAction("forward", onClickForward, this); @@ -114,6 +233,7 @@ BOOL LLFloaterMediaBrowser::postBuild() childSetAction("assign", onClickAssign, this); buildURLHistory(); + return TRUE; } @@ -154,6 +274,7 @@ std::string LLFloaterMediaBrowser::getSupportURL() //virtual void LLFloaterMediaBrowser::onClose(bool app_quitting) { + LLViewerMedia::proxyWindowClosed(mUUID); //setVisible(FALSE); destroy(); } @@ -170,7 +291,17 @@ void LLFloaterMediaBrowser::handleMediaEvent(LLPluginClassMedia* self, EMediaEve getChildView("back")->setEnabled(self->getHistoryBackAvailable()); getChildView("forward")->setEnabled(self->getHistoryForwardAvailable()); } + else if(event == MEDIA_EVENT_CLOSE_REQUEST) + { + // The browser instance wants its window closed. + closeFloater(); + } + else if(event == MEDIA_EVENT_GEOMETRY_CHANGE) + { + geometryChanged(self->getGeometryX(), self->getGeometryY(), self->getGeometryWidth(), self->getGeometryHeight()); + } } + void LLFloaterMediaBrowser::setCurrentURL(const std::string& url) { mCurrentURL = url; @@ -179,7 +310,7 @@ void LLFloaterMediaBrowser::setCurrentURL(const std::string& url) if (mCurrentURL != "about:blank") { mAddressCombo->remove(mCurrentURL); - mAddressCombo->add(mCurrentURL, ADD_SORTED); + mAddressCombo->add(mCurrentURL); mAddressCombo->selectByValue(mCurrentURL); // Serialize url history @@ -191,12 +322,6 @@ void LLFloaterMediaBrowser::setCurrentURL(const std::string& url) getChildView("reload")->setEnabled(TRUE); } -void LLFloaterMediaBrowser::onOpen(const LLSD& media_url) -{ - LLFloater::onOpen(media_url); - openMedia(media_url.asString()); -} - //static void LLFloaterMediaBrowser::onEnterAddress(LLUICtrl* ctrl, void* user_data) { @@ -322,9 +447,12 @@ void LLFloaterMediaBrowser::onClickSeek(void* user_data) if(self->mBrowser->getMediaPlugin()) self->mBrowser->getMediaPlugin()->start(2.0f); } -void LLFloaterMediaBrowser::openMedia(const std::string& media_url) +void LLFloaterMediaBrowser::openMedia(const std::string& media_url, const std::string& target) { mBrowser->setHomePageUrl(media_url); + mBrowser->setTarget(target); mBrowser->navigateTo(media_url); setCurrentURL(media_url); } + + diff --git a/indra/newview/llfloatermediabrowser.h b/indra/newview/llfloatermediabrowser.h index ffd8be4461..152d221a01 100644 --- a/indra/newview/llfloatermediabrowser.h +++ b/indra/newview/llfloatermediabrowser.h @@ -33,23 +33,30 @@ class LLComboBox; class LLMediaCtrl; +class LLNotification; class LLFloaterMediaBrowser : public LLFloater, public LLViewerMediaObserver { public: + LOG_CLASS(LLFloaterMediaBrowser); LLFloaterMediaBrowser(const LLSD& key); + static void create(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); + + static void closeRequest(const std::string &uuid); + static void geometryChanged(const std::string &uuid, S32 x, S32 y, S32 width, S32 height); + void geometryChanged(S32 x, S32 y, S32 width, S32 height); + /*virtual*/ BOOL postBuild(); /*virtual*/ void onClose(bool app_quitting); /*virtual*/ void draw(); - /*virtual*/ void onOpen(const LLSD& key); // inherited from LLViewerMediaObserver /*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event); - void openMedia(const std::string& media_url); + void openMedia(const std::string& media_url, const std::string& target); void buildURLHistory(); std::string getSupportURL(); void setCurrentURL(const std::string& url); @@ -71,6 +78,8 @@ private: LLMediaCtrl* mBrowser; LLComboBox* mAddressCombo; std::string mCurrentURL; + boost::shared_ptr<LLNotification> mCurNotification; + std::string mUUID; }; #endif // LL_LLFLOATERMEDIABROWSER_H diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 08475b1e55..42dc60f9e0 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -37,10 +37,10 @@ const S32 NOTIFICATION_PANEL_HEADER_HEIGHT = 20; const S32 HEADER_PADDING = 38; -class LLNotificationChannelPanel : public LLPanel +class LLNotificationChannelPanel : public LLLayoutPanel { public: - LLNotificationChannelPanel(const std::string& channel_name); + LLNotificationChannelPanel(const Params& p); BOOL postBuild(); private: @@ -52,14 +52,14 @@ private: LLNotificationChannelPtr mChannelRejectsPtr; }; -LLNotificationChannelPanel::LLNotificationChannelPanel(const std::string& channel_name) - : LLPanel() +LLNotificationChannelPanel::LLNotificationChannelPanel(const LLNotificationChannelPanel::Params& p) +: LLLayoutPanel(p) { - mChannelPtr = LLNotifications::instance().getChannel(channel_name); + mChannelPtr = LLNotifications::instance().getChannel(p.name); mChannelRejectsPtr = LLNotificationChannelPtr( - LLNotificationChannel::buildChannel(channel_name + "rejects", mChannelPtr->getParentChannelName(), + LLNotificationChannel::buildChannel(p.name() + "rejects", mChannelPtr->getParentChannelName(), !boost::bind(mChannelPtr->getFilter(), _1))); - LLUICtrlFactory::instance().buildPanel(this, "panel_notifications_channel.xml"); + buildFromFile( "panel_notifications_channel.xml"); } BOOL LLNotificationChannelPanel::postBuild() @@ -167,8 +167,6 @@ LLFloaterNotificationConsole::LLFloaterNotificationConsole(const LLSD& key) : LLFloater(key) { mCommitCallbackRegistrar.add("ClickAdd", boost::bind(&LLFloaterNotificationConsole::onClickAdd, this)); - - //LLUICtrlFactory::instance().buildFloater(this, "floater_notifications_console.xml"); } BOOL LLFloaterNotificationConsole::postBuild() @@ -203,8 +201,13 @@ BOOL LLFloaterNotificationConsole::postBuild() void LLFloaterNotificationConsole::addChannel(const std::string& name, bool open) { LLLayoutStack& stack = getChildRef<LLLayoutStack>("notification_channels"); - LLNotificationChannelPanel* panelp = new LLNotificationChannelPanel(name); - stack.addPanel(panelp, 0, NOTIFICATION_PANEL_HEADER_HEIGHT, S32_MAX, S32_MAX, TRUE, TRUE, LLLayoutStack::ANIMATE); + LLNotificationChannelPanel::Params p; + p.min_dim = NOTIFICATION_PANEL_HEADER_HEIGHT; + p.auto_resize = true; + p.user_resize = true; + p.name = name; + LLNotificationChannelPanel* panelp = new LLNotificationChannelPanel(p); + stack.addPanel(panelp, LLLayoutStack::ANIMATE); LLButton& header_button = panelp->getChildRef<LLButton>("header"); header_button.setToggleState(!open); @@ -248,7 +251,7 @@ LLFloaterNotification::LLFloaterNotification(LLNotification* note) : LLFloater(LLSD()), mNote(note) { - LLUICtrlFactory::instance().buildFloater(this, "floater_notification.xml", NULL); + buildFromFile("floater_notification.xml"); } BOOL LLFloaterNotification::postBuild() diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index d6f6ba9e5b..8b6619def2 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -56,7 +56,6 @@ LLFloaterOpenObject::LLFloaterOpenObject(const LLSD& key) mPanelInventoryObject(NULL), mDirty(TRUE) { -// LLUICtrlFactory::getInstance()->buildFloater(this,"floater_openobject.xml"); mCommitCallbackRegistrar.add("OpenObject.MoveToInventory", boost::bind(&LLFloaterOpenObject::onClickMoveToInventory, this)); mCommitCallbackRegistrar.add("OpenObject.MoveAndWear", boost::bind(&LLFloaterOpenObject::onClickMoveAndWear, this)); } diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp index 151a76285b..b0009fd94f 100644 --- a/indra/newview/llfloaterpay.cpp +++ b/indra/newview/llfloaterpay.cpp @@ -41,6 +41,7 @@ #include "lllineeditor.h" #include "llmutelist.h" #include "llfloaterreporter.h" +#include "llslurl.h" #include "llviewerobject.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" @@ -96,10 +97,6 @@ private: static void onGive(void* data); void give(S32 amount); static void processPayPriceReply(LLMessageSystem* msg, void **userdata); - void onCacheOwnerName(const LLUUID& owner_id, - const std::string& firstname, - const std::string& lastname, - BOOL is_group); void finishPayUI(const LLUUID& target_id, BOOL is_group); protected: @@ -152,7 +149,7 @@ BOOL LLFloaterPay::postBuild() mCallbackData.push_back(info); childSetAction("fastpay 1",&LLFloaterPay::onGive,info); - getChildView("fastpay 1")->setVisible( FALSE); + getChildView("fastpay 1")->setVisible(FALSE); mQuickPayButton[i] = getChild<LLButton>("fastpay 1"); mQuickPayInfo[i] = info; @@ -162,7 +159,7 @@ BOOL LLFloaterPay::postBuild() mCallbackData.push_back(info); childSetAction("fastpay 5",&LLFloaterPay::onGive,info); - getChildView("fastpay 5")->setVisible( FALSE); + getChildView("fastpay 5")->setVisible(FALSE); mQuickPayButton[i] = getChild<LLButton>("fastpay 5"); mQuickPayInfo[i] = info; @@ -172,7 +169,7 @@ BOOL LLFloaterPay::postBuild() mCallbackData.push_back(info); childSetAction("fastpay 10",&LLFloaterPay::onGive,info); - getChildView("fastpay 10")->setVisible( FALSE); + getChildView("fastpay 10")->setVisible(FALSE); mQuickPayButton[i] = getChild<LLButton>("fastpay 10"); mQuickPayInfo[i] = info; @@ -182,14 +179,14 @@ BOOL LLFloaterPay::postBuild() mCallbackData.push_back(info); childSetAction("fastpay 20",&LLFloaterPay::onGive,info); - getChildView("fastpay 20")->setVisible( FALSE); + getChildView("fastpay 20")->setVisible(FALSE); mQuickPayButton[i] = getChild<LLButton>("fastpay 20"); mQuickPayInfo[i] = info; ++i; - getChildView("amount text")->setVisible( FALSE); + getChildView("amount text")->setVisible(FALSE); std::string last_amount; if(sLastAmount > 0) @@ -197,7 +194,7 @@ BOOL LLFloaterPay::postBuild() last_amount = llformat("%d", sLastAmount); } - getChildView("amount")->setVisible( FALSE); + getChildView("amount")->setVisible(FALSE); getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this); getChild<LLUICtrl>("amount")->setValue(last_amount); @@ -208,7 +205,7 @@ BOOL LLFloaterPay::postBuild() childSetAction("pay btn",&LLFloaterPay::onGive,info); setDefaultBtn("pay btn"); - getChildView("pay btn")->setVisible( FALSE); + getChildView("pay btn")->setVisible(FALSE); getChildView("pay btn")->setEnabled((sLastAmount > 0)); childSetAction("cancel btn",&LLFloaterPay::onCancel,this); @@ -243,25 +240,25 @@ void LLFloaterPay::processPayPriceReply(LLMessageSystem* msg, void **userdata) if (PAY_PRICE_HIDE == price) { - self->getChildView("amount")->setVisible( FALSE); - self->getChildView("pay btn")->setVisible( FALSE); - self->getChildView("amount text")->setVisible( FALSE); + self->getChildView("amount")->setVisible(FALSE); + self->getChildView("pay btn")->setVisible(FALSE); + self->getChildView("amount text")->setVisible(FALSE); } else if (PAY_PRICE_DEFAULT == price) { - self->getChildView("amount")->setVisible( TRUE); - self->getChildView("pay btn")->setVisible( TRUE); - self->getChildView("amount text")->setVisible( TRUE); + self->getChildView("amount")->setVisible(TRUE); + self->getChildView("pay btn")->setVisible(TRUE); + self->getChildView("amount text")->setVisible(TRUE); } else { // PAY_PRICE_HIDE and PAY_PRICE_DEFAULT are negative values // So we take the absolute value here after we have checked for those cases - self->getChildView("amount")->setVisible( TRUE); - self->getChildView("pay btn")->setVisible( TRUE); + self->getChildView("amount")->setVisible(TRUE); + self->getChildView("pay btn")->setVisible(TRUE); self->getChildView("pay btn")->setEnabled(TRUE); - self->getChildView("amount text")->setVisible( TRUE); + self->getChildView("amount text")->setVisible(TRUE); self->getChild<LLUICtrl>("amount")->setValue(llformat("%d", llabs(price))); } @@ -409,9 +406,9 @@ void LLFloaterPay::payDirectly(money_callback callback, floater->setCallback(callback); floater->mObjectSelection = NULL; - floater->getChildView("amount")->setVisible( TRUE); - floater->getChildView("pay btn")->setVisible( TRUE); - floater->getChildView("amount text")->setVisible( TRUE); + floater->getChildView("amount")->setVisible(TRUE); + floater->getChildView("pay btn")->setVisible(TRUE); + floater->getChildView("amount text")->setVisible(TRUE); floater->getChildView("fastpay text")->setVisible(TRUE); for(S32 i=0;i<MAX_PAY_BUTTONS;++i) @@ -424,33 +421,26 @@ void LLFloaterPay::payDirectly(money_callback callback, void LLFloaterPay::finishPayUI(const LLUUID& target_id, BOOL is_group) { - gCacheName->get(target_id, is_group, boost::bind(&LLFloaterPay::onCacheOwnerName, this, _1, _2, _3, _4)); - - // Make sure the amount field has focus - - getChild<LLUICtrl>("amount")->setFocus( TRUE); - - LLLineEditor* amount = getChild<LLLineEditor>("amount"); - amount->selectAll(); - mTargetIsGroup = is_group; -} - -void LLFloaterPay::onCacheOwnerName(const LLUUID& owner_id, - const std::string& firstname, - const std::string& lastname, - BOOL is_group) -{ + std::string slurl; if (is_group) { setTitle(getString("payee_group")); + slurl = LLSLURL("group", target_id, "inspect").getSLURLString(); } else { setTitle(getString("payee_resident")); + slurl = LLSLURL("agent", target_id, "inspect").getSLURLString(); } + getChild<LLTextBox>("payee_name")->setText(slurl); - getChild<LLUICtrl>("payee_name")->setTextArg("[FIRST]", firstname); - getChild<LLUICtrl>("payee_name")->setTextArg("[LAST]", lastname); + // Make sure the amount field has focus + + LLLineEditor* amount = getChild<LLLineEditor>("amount"); + amount->setFocus(TRUE); + amount->selectAll(); + + mTargetIsGroup = is_group; } // static diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index 74dfede23e..80b55c3cbb 100644 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -37,7 +37,6 @@ LLFloaterPerms::LLFloaterPerms(const LLSD& seed) : LLFloater(seed) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_perm_prefs.xml"); mCommitCallbackRegistrar.add("Perms.Copy", boost::bind(&LLFloaterPerms::onCommitCopy, this)); mCommitCallbackRegistrar.add("Perms.OK", boost::bind(&LLFloaterPerms::onClickOK, this)); mCommitCallbackRegistrar.add("Perms.Cancel", boost::bind(&LLFloaterPerms::onClickCancel, this)); diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index bcdcd50288..e8e9f76912 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -76,7 +76,6 @@ LLFloaterPostcard::LLFloaterPostcard(const LLSD& key) mViewerImage(NULL), mHasFirstMsgFocus(false) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_postcard.xml"); } // Destroys the object diff --git a/indra/newview/llfloaterpostprocess.cpp b/indra/newview/llfloaterpostprocess.cpp index 7f27caf68f..2d61109e17 100644 --- a/indra/newview/llfloaterpostprocess.cpp +++ b/indra/newview/llfloaterpostprocess.cpp @@ -42,7 +42,6 @@ LLFloaterPostProcess::LLFloaterPostProcess(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_post_process.xml"); } LLFloaterPostProcess::~LLFloaterPostProcess() diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 3804a1b858..ac940f4f77 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -49,7 +49,6 @@ #include "llfloaterreg.h" #include "llfloaterabout.h" #include "llfloaterhardwaresettings.h" -#include "llfloatervoicedevicesettings.h" #include "llimfloater.h" #include "llkeyboard.h" #include "llmodaldialog.h" @@ -57,7 +56,9 @@ #include "llnearbychat.h" #include "llnotifications.h" #include "llnotificationsutil.h" +#include "llnotificationtemplate.h" #include "llpanellogin.h" +#include "llpanelvoicedevicesettings.h" #include "llradiogroup.h" #include "llsearchcombobox.h" #include "llsky.h" @@ -76,6 +77,7 @@ #include "llvosky.h" // linden library includes +#include "llavatarnamecache.h" #include "llerror.h" #include "llfontgl.h" #include "llrect.h" @@ -131,7 +133,6 @@ LLVoiceSetKeyDialog::LLVoiceSetKeyDialog(const LLSD& key) : LLModalDialog(key), mParent(NULL) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_select_key.xml", NULL); } //virtual @@ -179,6 +180,8 @@ void LLVoiceSetKeyDialog::onCancel(void* user_data) // if creating/destroying these is too slow, we'll need to create // a static member and update all our static callbacks +void handleNameTagOptionChanged(const LLSD& newvalue); +void handleDisplayNamesOptionChanged(const LLSD& newvalue); bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response); //bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater); @@ -214,6 +217,18 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response return false; } +void handleNameTagOptionChanged(const LLSD& newvalue) +{ + LLVOAvatar::invalidateNameTags(); +} + +void handleDisplayNamesOptionChanged(const LLSD& newvalue) +{ + LLAvatarNameCache::setUseDisplayNames(newvalue.asBoolean()); + LLVOAvatar::invalidateNameTags(); +} + + /*bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -267,7 +282,8 @@ std::string LLFloaterPreference::sSkin = ""; LLFloaterPreference::LLFloaterPreference(const LLSD& key) : LLFloater(key), mGotPersonalInfo(false), - mOriginalIMViaEmail(false) + mOriginalIMViaEmail(false), + mDoubleClickActionDirty(false) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -305,8 +321,14 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2)); mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this)); mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this)); + mCommitCallbackRegistrar.add("Pref.CommitDoubleClickChekbox", boost::bind(&LLFloaterPreference::onDoubleClickCheckBox, this, _1)); + mCommitCallbackRegistrar.add("Pref.CommitRadioDoubleClick", boost::bind(&LLFloaterPreference::onDoubleClickRadio, this)); sSkin = gSavedSettings.getString("SkinCurrent"); + + gSavedSettings.getControl("NameTagShowUsernames")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); + gSavedSettings.getControl("NameTagShowFriends")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2)); + gSavedSettings.getControl("UseDisplayNames")->getCommitSignal()->connect(boost::bind(&handleDisplayNamesOptionChanged, _2)); } BOOL LLFloaterPreference::postBuild() @@ -323,8 +345,11 @@ BOOL LLFloaterPreference::postBuild() if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab"))) tabcontainer->selectFirstTab(); + updateDoubleClickControls(); + + getChild<LLUICtrl>("cache_location")->setEnabled(FALSE); // make it read-only but selectable (STORM-227) std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); - getChild<LLUICtrl>("cache_location")->setValue(cache_location); + setCacheLocation(cache_location); // if floater is opened before login set default localized busy message if (LLStartUp::getStartupState() < STATE_STARTED) @@ -407,12 +432,6 @@ void LLFloaterPreference::apply() hardware_settings->apply(); } - LLFloaterVoiceDeviceSettings* voice_device_settings = LLFloaterReg::findTypedInstance<LLFloaterVoiceDeviceSettings>("pref_voicedevicesettings"); - if(voice_device_settings) - { - voice_device_settings->apply(); - } - gViewerWindow->requestResolutionUpdate(); // for UIScaleFactor LLSliderCtrl* fov_slider = getChild<LLSliderCtrl>("camera_fov"); @@ -420,7 +439,7 @@ void LLFloaterPreference::apply() fov_slider->setMaxValue(LLViewerCamera::getInstance()->getMaxView()); std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, ""); - getChild<LLUICtrl>("cache_location")->setValue(cache_location); + setCacheLocation(cache_location); LLViewerMedia::setCookiesEnabled(getChild<LLUICtrl>("cookies_enabled")->getValue()); @@ -461,6 +480,12 @@ void LLFloaterPreference::apply() gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility); } } + + if (mDoubleClickActionDirty) + { + updateDoubleClickSettings(); + mDoubleClickActionDirty = false; + } } void LLFloaterPreference::cancel() @@ -487,15 +512,12 @@ void LLFloaterPreference::cancel() // reverts any changes to current skin gSavedSettings.setString("SkinCurrent", sSkin); - - LLFloaterVoiceDeviceSettings* voice_device_settings = LLFloaterReg::findTypedInstance<LLFloaterVoiceDeviceSettings>("pref_voicedevicesettings"); - if (voice_device_settings) + + if (mDoubleClickActionDirty) { - voice_device_settings ->cancel(); + updateDoubleClickControls(); + mDoubleClickActionDirty = false; } - - LLFloaterReg::hideInstance("pref_voicedevicesettings"); - } void LLFloaterPreference::onOpen(const LLSD& key) @@ -798,7 +820,7 @@ void LLFloaterPreference::buildPopupLists() LLScrollListItem* item = NULL; - bool show_popup = LLUI::sSettingGroups["ignores"]->getBOOL(templatep->mName); + bool show_popup = !formp->getIgnored(); if (!show_popup) { if (ignore == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE) @@ -820,13 +842,11 @@ void LLFloaterPreference::buildPopupLists() row["columns"][1]["font"] = "SANSSERIF_SMALL"; row["columns"][1]["width"] = 360; } - item = disabled_popups.addElement(row, - ADD_SORTED); + item = disabled_popups.addElement(row); } else { - item = enabled_popups.addElement(row, - ADD_SORTED); + item = enabled_popups.addElement(row); } if (item) @@ -1152,9 +1172,7 @@ void LLFloaterPreference::onClickDisablePopup() for (itor = items.begin(); itor != items.end(); ++itor) { LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate(*(std::string*)((*itor)->getUserdata())); - //gSavedSettings.setWarning(templatep->mName, TRUE); - std::string notification_name = templatep->mName; - LLUI::sSettingGroups["ignores"]->setBOOL(notification_name, FALSE); + templatep->mForm->setIgnored(true); } buildPopupLists(); @@ -1168,7 +1186,7 @@ void LLFloaterPreference::resetAllIgnored() { if (iter->second->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) { - LLUI::sSettingGroups["ignores"]->setBOOL(iter->first, TRUE); + iter->second->mForm->setIgnored(false); } } } @@ -1181,7 +1199,7 @@ void LLFloaterPreference::setAllIgnored() { if (iter->second->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) { - LLUI::sSettingGroups["ignores"]->setBOOL(iter->first, FALSE); + iter->second->mForm->setIgnored(true); } } } @@ -1245,7 +1263,7 @@ void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im getChildView("show_timestamps_check_im")->setEnabled(TRUE); getChildView("log_path_string")->setEnabled(FALSE);// LineEditor becomes readonly in this case. getChildView("log_path_button")->setEnabled(TRUE); - + childEnable("logfile_name_datestamp"); std::string display_email(email); getChild<LLUICtrl>("email_address")->setValue(display_email); @@ -1317,6 +1335,68 @@ void LLFloaterPreference::onClickBlockList() } } +void LLFloaterPreference::onDoubleClickCheckBox(LLUICtrl* ctrl) +{ + if (!ctrl) return; + mDoubleClickActionDirty = true; + LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action"); + if (!radio_double_click_action) return; + // select default value("teleport") in radio-group. + radio_double_click_action->setSelectedIndex(0); + // set radio-group enabled depending on state of checkbox + radio_double_click_action->setEnabled(ctrl->getValue()); +} + +void LLFloaterPreference::onDoubleClickRadio() +{ + mDoubleClickActionDirty = true; +} + +void LLFloaterPreference::updateDoubleClickSettings() +{ + LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox"); + if (!double_click_action_cb) return; + bool enable = double_click_action_cb->getValue().asBoolean(); + + LLRadioGroup* radio_double_click_action = getChild<LLRadioGroup>("double_click_action"); + if (!radio_double_click_action) return; + + // enable double click radio-group depending on state of checkbox + radio_double_click_action->setEnabled(enable); + + if (!enable) + { + // set double click action settings values to false if checkbox was unchecked + gSavedSettings.setBOOL("DoubleClickAutoPilot", false); + gSavedSettings.setBOOL("DoubleClickTeleport", false); + } + else + { + std::string selected = radio_double_click_action->getValue().asString(); + bool teleport_selected = selected == "radio_teleport"; + // set double click action settings values depending on chosen radio-button + gSavedSettings.setBOOL( "DoubleClickTeleport", teleport_selected ); + gSavedSettings.setBOOL( "DoubleClickAutoPilot", !teleport_selected ); + } +} + +void LLFloaterPreference::updateDoubleClickControls() +{ + // check is one of double-click actions settings enabled + bool double_click_action_enabled = gSavedSettings.getBOOL("DoubleClickAutoPilot") || gSavedSettings.getBOOL("DoubleClickTeleport"); + LLCheckBoxCtrl* double_click_action_cb = getChild<LLCheckBoxCtrl>("double_click_chkbox"); + if (double_click_action_cb) + { + // check checkbox if one of double-click actions settings enabled, uncheck otherwise + double_click_action_cb->setValue(double_click_action_enabled); + } + LLRadioGroup* double_click_action_radio = getChild<LLRadioGroup>("double_click_action"); + if (!double_click_action_radio) return; + // set radio-group enabled if one of double-click actions settings enabled + double_click_action_radio->setEnabled(double_click_action_enabled); + // select button in radio-group depending on setting + double_click_action_radio->setSelectedIndex(gSavedSettings.getBOOL("DoubleClickAutoPilot")); +} void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param) { @@ -1329,6 +1409,12 @@ void LLFloaterPreference::getUIColor(LLUICtrl* ctrl, const LLSD& param) color_swatch->setOriginal(LLUIColorTable::instance().getColor(param.asString())); } +void LLFloaterPreference::setCacheLocation(const LLStringExplicit& location) +{ + LLUICtrl* cache_location_editor = getChild<LLUICtrl>("cache_location"); + cache_location_editor->setValue(location); + cache_location_editor->setToolTip(location); +} //---------------------------------------------------------------------------- static LLRegisterPanelClassWrapper<LLPanelPreference> t_places("panel_preference"); diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index d1e15d5ab8..46f50d9a4d 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -95,6 +95,14 @@ protected: void setHardwareDefaults(); // callback for when client turns on shaders void onVertexShaderEnable(); + // callback for changing double click action checkbox + void onDoubleClickCheckBox(LLUICtrl* ctrl); + // callback for selecting double click action radio-button + void onDoubleClickRadio(); + // updates double-click action settings depending on controls from preferences + void updateDoubleClickSettings(); + // updates double-click action controls depending on values from settings.xml + void updateDoubleClickControls(); // This function squirrels away the current values of the controls so that // cancel() can restore them. @@ -103,6 +111,8 @@ protected: public: + void setCacheLocation(const LLStringExplicit& location); + void onClickSetCache(); void onClickResetCache(); void onClickSkin(LLUICtrl* ctrl,const LLSD& userdata); @@ -143,6 +153,9 @@ public: static void refreshSkin(void* data); private: static std::string sSkin; + // set true if state of double-click action checkbox or radio-group was changed by user + // (reset back to false on apply or cancel) + bool mDoubleClickActionDirty; bool mGotPersonalInfo; bool mOriginalIMViaEmail; diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp index e4e4713dbc..dd12fa64d3 100644 --- a/indra/newview/llfloaterproperties.cpp +++ b/indra/newview/llfloaterproperties.cpp @@ -108,8 +108,6 @@ LLFloaterProperties::LLFloaterProperties(const LLUUID& item_id) mDirty(TRUE) { mPropertiesObserver = new LLPropertiesObserver(this); - - //LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml"); } // Destroys the object diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp new file mode 100644 index 0000000000..b3b7645dd4 --- /dev/null +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -0,0 +1,227 @@ +/** + * @file llfloaterregiondebugconsole.h + * @author Brad Kittenbrink <brad@lindenlab.com> + * @brief Quick and dirty console for region debug settings + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010-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 "llfloaterregiondebugconsole.h" + +#include "llagent.h" +#include "llhttpclient.h" +#include "llhttpnode.h" +#include "lllineeditor.h" +#include "lltexteditor.h" +#include "llviewerregion.h" + +// Two versions of the sim console API are supported. +// +// SimConsole capability (deprecated): +// This is the initial implementation that is supported by some versions of the +// simulator. It is simple and straight forward, just POST a command and the +// body of the response has the result. This API is deprecated because it +// doesn't allow the sim to use any asynchronous API. +// +// SimConsoleAsync capability: +// This capability replaces the original SimConsole capability. It is similar +// in that the command is POSTed to the SimConsoleAsync cap, but the response +// comes in through the event poll, which gives the simulator more flexibility +// and allows it to perform complex operations without blocking any frames. +// +// We will assume the SimConsoleAsync capability is available, and fall back to +// the SimConsole cap if it is not. The simulator will only support one or the +// other. + +namespace +{ + // Signal used to notify the floater of responses from the asynchronous + // API. + typedef boost::signals2::signal< + void (const std::string& output)> console_reply_signal_t; + console_reply_signal_t sConsoleReplySignal; + + const std::string PROMPT("\n\n> "); + const std::string UNABLE_TO_SEND_COMMAND( + "ERROR: The last command was not received by the server."); + const std::string CONSOLE_UNAVAILABLE( + "ERROR: No console available for this region/simulator."); + const std::string CONSOLE_NOT_SUPPORTED( + "This region does not support the simulator console."); + + // This responder handles the initial response. Unless error() is called + // we assume that the simulator has received our request. Error will be + // called if this request times out. + class AsyncConsoleResponder : public LLHTTPClient::Responder + { + public: + /* virtual */ + void error(U32 status, const std::string& reason) + { + sConsoleReplySignal(UNABLE_TO_SEND_COMMAND); + } + }; + + class ConsoleResponder : public LLHTTPClient::Responder + { + public: + ConsoleResponder(LLTextEditor *output) : mOutput(output) + { + } + + /*virtual*/ + void error(U32 status, const std::string& reason) + { + if (mOutput) + { + mOutput->appendText( + UNABLE_TO_SEND_COMMAND + PROMPT, + false); + } + } + + /*virtual*/ + void result(const LLSD& content) + { + if (mOutput) + { + mOutput->appendText( + content.asString() + PROMPT, false); + } + } + + LLTextEditor * mOutput; + }; + + // This handles responses for console commands sent via the asynchronous + // API. + class ConsoleResponseNode : public LLHTTPNode + { + public: + /* virtual */ + void post( + LLHTTPNode::ResponsePtr reponse, + const LLSD& context, + const LLSD& input) const + { + llinfos << "Received response from the debug console: " + << input << llendl; + sConsoleReplySignal(input["body"].asString()); + } + }; +} + +LLFloaterRegionDebugConsole::LLFloaterRegionDebugConsole(LLSD const & key) +: LLFloater(key), mOutput(NULL) +{ + mReplySignalConnection = sConsoleReplySignal.connect( + boost::bind( + &LLFloaterRegionDebugConsole::onReplyReceived, + this, + _1)); +} + +LLFloaterRegionDebugConsole::~LLFloaterRegionDebugConsole() +{ + mReplySignalConnection.disconnect(); +} + +BOOL LLFloaterRegionDebugConsole::postBuild() +{ + LLLineEditor* input = getChild<LLLineEditor>("region_debug_console_input"); + input->setEnableLineHistory(true); + input->setCommitCallback(boost::bind(&LLFloaterRegionDebugConsole::onInput, this, _1, _2)); + input->setFocus(true); + input->setCommitOnFocusLost(false); + + mOutput = getChild<LLTextEditor>("region_debug_console_output"); + + std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + if (url.empty()) + { + // Fall back to see if the old API is supported. + url = gAgent.getRegion()->getCapability("SimConsole"); + if (url.empty()) + { + mOutput->appendText( + CONSOLE_NOT_SUPPORTED + PROMPT, + false); + return TRUE; + } + } + + mOutput->appendText("> ", false); + return TRUE; +} + +void LLFloaterRegionDebugConsole::onInput(LLUICtrl* ctrl, const LLSD& param) +{ + LLLineEditor* input = static_cast<LLLineEditor*>(ctrl); + std::string text = input->getText() + "\n"; + + std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + if (url.empty()) + { + // Fall back to the old API + url = gAgent.getRegion()->getCapability("SimConsole"); + if (url.empty()) + { + text += CONSOLE_UNAVAILABLE + PROMPT; + } + else + { + // Using SimConsole (deprecated) + LLHTTPClient::post( + url, + LLSD(input->getText()), + new ConsoleResponder(mOutput)); + } + } + else + { + // Using SimConsoleAsync + LLHTTPClient::post( + url, + LLSD(input->getText()), + new AsyncConsoleResponder); + } + + mOutput->appendText(text, false); + input->clear(); +} + +void LLFloaterRegionDebugConsole::onReplyReceived(const std::string& output) +{ + mOutput->appendText(output + PROMPT, false); +} + +LLHTTPRegistration<ConsoleResponseNode> + gHTTPRegistrationMessageDebugConsoleResponse( + "/message/SimConsoleResponse"); diff --git a/indra/newview/llfloaterregiondebugconsole.h b/indra/newview/llfloaterregiondebugconsole.h new file mode 100644 index 0000000000..4171a4da6b --- /dev/null +++ b/indra/newview/llfloaterregiondebugconsole.h @@ -0,0 +1,63 @@ +/** + * @file llfloaterregiondebugconsole.h + * @author Brad Kittenbrink <brad@lindenlab.com> + * @brief Quick and dirty console for region debug settings + * + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010-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_LLFLOATERREGIONDEBUGCONSOLE_H +#define LL_LLFLOATERREGIONDEBUGCONSOLE_H + +#include <boost/signals2.hpp> + +#include "llfloater.h" +#include "llhttpclient.h" + +class LLTextEditor; + +class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Responder +{ +public: + LLFloaterRegionDebugConsole(LLSD const & key); + virtual ~LLFloaterRegionDebugConsole(); + + // virtual + BOOL postBuild(); + + void onInput(LLUICtrl* ctrl, const LLSD& param); + + LLTextEditor * mOutput; + + private: + void onReplyReceived(const std::string& output); + + boost::signals2::connection mReplySignalConnection; +}; + +#endif // LL_LLFLOATERREGIONDEBUGCONSOLE_H diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 29ad0f3b9c..7792b3fb40 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -43,6 +43,7 @@ #include "llagent.h" #include "llappviewer.h" +#include "llavatarname.h" #include "llfloateravatarpicker.h" #include "llbutton.h" #include "llcheckboxctrl.h" @@ -161,7 +162,6 @@ LLUUID LLFloaterRegionInfo::sRequestInvoice; LLFloaterRegionInfo::LLFloaterRegionInfo(const LLSD& seed) : LLFloater(seed) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_region_info.xml", FALSE); } BOOL LLFloaterRegionInfo::postBuild() @@ -174,32 +174,32 @@ BOOL LLFloaterRegionInfo::postBuild() mInfoPanels.push_back(panel); panel->getCommitCallbackRegistrar().add("RegionInfo.ManageTelehub", boost::bind(&LLPanelRegionInfo::onClickManageTelehub, panel)); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_general.xml"); + panel->buildFromFile("panel_region_general.xml"); mTab->addTabPanel(LLTabContainer::TabPanelParams().panel(panel).select_tab(true)); panel = new LLPanelRegionDebugInfo; mInfoPanels.push_back(panel); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_debug.xml"); + panel->buildFromFile("panel_region_debug.xml"); mTab->addTabPanel(panel); panel = new LLPanelRegionTextureInfo; mInfoPanels.push_back(panel); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_texture.xml"); + panel->buildFromFile("panel_region_texture.xml"); mTab->addTabPanel(panel); panel = new LLPanelRegionTerrainInfo; mInfoPanels.push_back(panel); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_terrain.xml"); + panel->buildFromFile("panel_region_terrain.xml"); mTab->addTabPanel(panel); panel = new LLPanelEstateInfo; mInfoPanels.push_back(panel); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_estate.xml"); + panel->buildFromFile("panel_region_estate.xml"); mTab->addTabPanel(panel); panel = new LLPanelEstateCovenant; mInfoPanels.push_back(panel); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_region_covenant.xml"); + panel->buildFromFile("panel_region_covenant.xml"); mTab->addTabPanel(panel); gMessageSystem->setHandlerFunc( @@ -600,13 +600,13 @@ void LLPanelRegionGeneralInfo::onClickKick() // this depends on the grandparent view being a floater // in order to set up floater dependency LLFloater* parent_floater = gFloaterView->getParentFloater(this); - LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1,_2), FALSE, TRUE); + LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelRegionGeneralInfo::onKickCommit, this, _1), FALSE, TRUE); parent_floater->addDependentFloater(child_floater); } -void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelRegionGeneralInfo::onKickCommit(const uuid_vec_t& ids) { - if (names.empty() || ids.empty()) return; + if (ids.empty()) return; if(ids[0].notNull()) { strings_t strings; @@ -842,11 +842,11 @@ void LLPanelRegionDebugInfo::onClickChooseAvatar() } -void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelRegionDebugInfo::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) { if (ids.empty() || names.empty()) return; mTargetAvatar = ids[0]; - getChild<LLUICtrl>("target_avatar_name")->setValue(LLSD(names[0])); + getChild<LLUICtrl>("target_avatar_name")->setValue(LLSD(names[0].getCompleteName())); refreshFromRegion( gAgent.getRegion() ); } @@ -1513,24 +1513,17 @@ void LLPanelEstateInfo::onClickKickUser() // this depends on the grandparent view being a floater // in order to set up floater dependency LLFloater* parent_floater = gFloaterView->getParentFloater(this); - LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1, _2), FALSE, TRUE); + LLFloater* child_floater = LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::onKickUserCommit, this, _1), FALSE, TRUE); parent_floater->addDependentFloater(child_floater); } -void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelEstateInfo::onKickUserCommit(const uuid_vec_t& ids) { - if (names.empty() || ids.empty()) return; + if (ids.empty()) return; - //check to make sure there is one valid user and id - if( (ids[0].isNull()) || - (names[0].length() == 0) ) - { - return; - } - //Bring up a confirmation dialog LLSD args; - args["EVIL_USER"] = names[0]; + args["EVIL_USER"] = LLSLURL("agent", ids[0], "completename").getSLURLString(); LLSD payload; payload["agent_id"] = ids[0]; LLNotificationsUtil::add("EstateKickUser", args, payload, boost::bind(&LLPanelEstateInfo::kickUserConfirm, this, _1, _2)); @@ -1696,12 +1689,12 @@ bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& res LLEstateAccessChangeInfo* change_info = new LLEstateAccessChangeInfo(notification["payload"]); // avatar picker yes multi-select, yes close-on-select - LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, _2, (void*)change_info), TRUE, TRUE); + LLFloaterAvatarPicker::show(boost::bind(&LLPanelEstateInfo::accessAddCore3, _1, (void*)change_info), TRUE, TRUE); return false; } // static -void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data) +void LLPanelEstateInfo::accessAddCore3(const uuid_vec_t& ids, void* data) { LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data; if (!change_info) return; @@ -1957,8 +1950,15 @@ void LLPanelEstateInfo::updateControls(LLViewerRegion* region) getChildView("remove_allowed_avatar_btn")->setEnabled(god || owner || manager); getChildView("add_allowed_group_btn")->setEnabled(god || owner || manager); getChildView("remove_allowed_group_btn")->setEnabled(god || owner || manager); - getChildView("add_banned_avatar_btn")->setEnabled(god || owner || manager); - getChildView("remove_banned_avatar_btn")->setEnabled(god || owner || manager); + + // Can't ban people from mainland, orientation islands, etc. because this + // creates much network traffic and server load. + // Disable their accounts in CSR tool instead. + bool linden_estate = (getEstateID() <= ESTATE_LAST_LINDEN); + bool enable_ban = (god || owner || manager) && !linden_estate; + getChildView("add_banned_avatar_btn")->setEnabled(enable_ban); + getChildView("remove_banned_avatar_btn")->setEnabled(enable_ban); + getChildView("message_estate_btn")->setEnabled(god || owner || manager); getChildView("kick_user_from_estate_btn")->setEnabled(god || owner || manager); diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h index 2393c74c45..c0758fa92d 100644 --- a/indra/newview/llfloaterregioninfo.h +++ b/indra/newview/llfloaterregioninfo.h @@ -34,6 +34,7 @@ #include "llhost.h" #include "llpanel.h" +class LLAvatarName; class LLDispatcher; class LLLineEditor; class LLMessageSystem; @@ -162,7 +163,7 @@ public: protected: virtual BOOL sendUpdate(); void onClickKick(); - void onKickCommit(const std::vector<std::string>& names, const uuid_vec_t& ids); + void onKickCommit(const uuid_vec_t& ids); static void onClickKickAll(void* userdata); bool onKickAllCommit(const LLSD& notification, const LLSD& response); static void onClickMessage(void* userdata); @@ -187,7 +188,7 @@ protected: virtual BOOL sendUpdate(); void onClickChooseAvatar(); - void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids); + void callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names); static void onClickReturn(void *); bool callbackReturn(const LLSD& notification, const LLSD& response); static void onClickTopColliders(void*); @@ -278,7 +279,7 @@ public: // Core methods for all above add/remove button clicks static void accessAddCore(U32 operation_flag, const std::string& dialog_name); static bool accessAddCore2(const LLSD& notification, const LLSD& response); - static void accessAddCore3(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data); + static void accessAddCore3(const uuid_vec_t& ids, void* data); static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name); static bool accessRemoveCore2(const LLSD& notification, const LLSD& response); @@ -290,7 +291,7 @@ public: // Send the actual EstateOwnerRequest "estateaccessdelta" message static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id); - void onKickUserCommit(const std::vector<std::string>& names, const uuid_vec_t& ids); + void onKickUserCommit(const uuid_vec_t& ids); static void onClickMessageEstate(void* data); bool onMessageCommit(const LLSD& notification, const LLSD& response); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 97f192a708..c08848b1ea 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -33,6 +33,8 @@ // linden library includes #include "llassetstorage.h" +#include "llavatarnamecache.h" +#include "llcachename.h" #include "llfontgl.h" #include "llimagej2c.h" #include "llinventory.h" @@ -103,7 +105,6 @@ LLFloaterReporter::LLFloaterReporter(const LLSD& key) mCopyrightWarningSeen( FALSE ), mResourceDatap(new LLResourceData()) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_report_abuse.xml"); } // static @@ -176,9 +177,8 @@ BOOL LLFloaterReporter::postBuild() childSetAction("cancel_btn", onClickCancel, this); // grab the user's name - std::string fullname; - LLAgentUI::buildFullname(fullname); - getChild<LLUICtrl>("reporter_field")->setValue(fullname); + std::string reporter = LLSLURL("agent", gAgent.getID(), "inspect").getSLURLString(); + getChild<LLUICtrl>("reporter_field")->setValue(reporter); center(); @@ -261,22 +261,7 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id) if (objectp->isAvatar()) { - // we have the information we need - std::string object_owner; - - LLNameValue* firstname = objectp->getNVPair("FirstName"); - LLNameValue* lastname = objectp->getNVPair("LastName"); - if (firstname && lastname) - { - object_owner.append(firstname->getString()); - object_owner.append(1, ' '); - object_owner.append(lastname->getString()); - } - else - { - object_owner.append("Unknown"); - } - setFromAvatar(mObjectID, object_owner); + setFromAvatarID(mObjectID); } else { @@ -303,11 +288,11 @@ void LLFloaterReporter::onClickSelectAbuser() gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE )); } -void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLFloaterReporter::callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) { if (ids.empty() || names.empty()) return; - getChild<LLUICtrl>("abuser_name_edit")->setValue(names[0] ); + getChild<LLUICtrl>("abuser_name_edit")->setValue(names[0].getCompleteName()); mAbuserID = ids[0]; @@ -315,18 +300,27 @@ void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, } -void LLFloaterReporter::setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name) +void LLFloaterReporter::setFromAvatarID(const LLUUID& avatar_id) { mAbuserID = mObjectID = avatar_id; - mOwnerName = avatar_name; - - std::string avatar_link = - LLSLURL("agent", mObjectID, "inspect").getSLURLString(); + std::string avatar_link = LLSLURL("agent", mObjectID, "inspect").getSLURLString(); getChild<LLUICtrl>("owner_name")->setValue(avatar_link); - getChild<LLUICtrl>("object_name")->setValue(avatar_name); - getChild<LLUICtrl>("abuser_name_edit")->setValue(avatar_name); + + LLAvatarNameCache::get(avatar_id, boost::bind(&LLFloaterReporter::onAvatarNameCache, this, _1, _2)); } +void LLFloaterReporter::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name) +{ + if (mObjectID == avatar_id) + { + mOwnerName = av_name.getCompleteName(); + getChild<LLUICtrl>("object_name")->setValue(av_name.getCompleteName()); + getChild<LLUICtrl>("object_name")->setToolTip(av_name.getCompleteName()); + getChild<LLUICtrl>("abuser_name_edit")->setValue(av_name.getCompleteName()); + } +} + + // static void LLFloaterReporter::onClickSend(void *userdata) { @@ -466,16 +460,15 @@ void LLFloaterReporter::show(const LLUUID& object_id, const std::string& avatar_ { LLFloaterReporter* f = LLFloaterReg::showTypedInstance<LLFloaterReporter>("reporter"); - // grab the user's name - std::string fullname; - LLAgentUI::buildFullname(fullname); - f->getChild<LLUICtrl>("reporter_field")->setValue(fullname); - if (avatar_name.empty()) + { // Request info for this object f->getObjectInfo(object_id); + } else - f->setFromAvatar(object_id, avatar_name); + { + f->setFromAvatarID(object_id); + } // Need to deselect on close f->mDeselectOnClose = TRUE; diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h index 92e842d318..cd98f7be57 100644 --- a/indra/newview/llfloaterreporter.h +++ b/indra/newview/llfloaterreporter.h @@ -32,6 +32,7 @@ #include "lluuid.h" #include "v3math.h" +class LLAvatarName; class LLMessageSystem; class LLViewerTexture; class LLInventoryItem; @@ -117,8 +118,9 @@ private: void setPosBox(const LLVector3d &pos); void enableControls(BOOL own_avatar); void getObjectInfo(const LLUUID& object_id); - void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids); - void setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name = LLStringUtil::null); + void callbackAvatarID(const uuid_vec_t& ids, const std::vector<LLAvatarName> names); + void setFromAvatarID(const LLUUID& avatar_id); + void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name); private: EReportType mReportType; diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp index 118dea2c74..a0d1a32e12 100644 --- a/indra/newview/llfloaterscriptdebug.cpp +++ b/indra/newview/llfloaterscriptdebug.cpp @@ -52,8 +52,6 @@ LLFloaterScriptDebug::LLFloaterScriptDebug(const LLSD& key) : LLMultiFloater(key) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_script_debug.xml"); - // avoid resizing of the window to match // the initial size of the tabbed-childs, whenever a tab is opened or closed mAutoResize = FALSE; @@ -141,8 +139,6 @@ LLFloaterScriptDebugOutput::LLFloaterScriptDebugOutput(const LLSD& object_id) : LLFloater(LLSD(object_id)), mObjectID(object_id.asUUID()) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_script_debug_panel.xml"); - // enabled autocous blocks controling focus via LLFloaterReg::showInstance setAutoFocus(FALSE); } diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp index 571f26e09f..a50907601c 100644 --- a/indra/newview/llfloaterscriptlimits.cpp +++ b/indra/newview/llfloaterscriptlimits.cpp @@ -28,6 +28,8 @@ #include "llviewerprecompiledheaders.h" #include "llfloaterscriptlimits.h" +// library includes +#include "llavatarnamecache.h" #include "llsdutil.h" #include "llsdutil_math.h" #include "message.h" @@ -115,7 +117,7 @@ BOOL LLFloaterScriptLimits::postBuild() LLPanelScriptLimitsRegionMemory* panel_memory; panel_memory = new LLPanelScriptLimitsRegionMemory; mInfoPanels.push_back(panel_memory); - LLUICtrlFactory::getInstance()->buildPanel(panel_memory, "panel_script_limits_region_memory.xml"); + panel_memory->buildFromFile( "panel_script_limits_region_memory.xml"); mTab->addTabPanel(panel_memory); } @@ -124,7 +126,7 @@ BOOL LLFloaterScriptLimits::postBuild() { LLPanelScriptLimitsAttachment* panel_attachments = new LLPanelScriptLimitsAttachment; mInfoPanels.push_back(panel_attachments); - LLUICtrlFactory::getInstance()->buildPanel(panel_attachments, "panel_script_limits_my_avatar.xml"); + panel_attachments->buildFromFile("panel_script_limits_my_avatar.xml"); mTab->addTabPanel(panel_attachments); } @@ -289,7 +291,7 @@ void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels"); if(tab) { - LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); + LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel"); if(panel_memory) { panel_memory->getChild<LLUICtrl>("loading_text")->setValue(LLSD(std::string(""))); @@ -300,9 +302,9 @@ void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref) btn->setEnabled(true); } - panel_memory->setRegionSummary(content); - } - } + panel_memory->setRegionSummary(content); + } +} } } @@ -592,17 +594,24 @@ void LLPanelScriptLimitsRegionMemory::setErrorStatus(U32 status, const std::stri // callback from the name cache with an owner name to add to the list void LLPanelScriptLimitsRegionMemory::onNameCache( const LLUUID& id, - const std::string& first_name, - const std::string& last_name) + const std::string& full_name) { - std::string name = first_name + " " + last_name; - LLScrollListCtrl *list = getChild<LLScrollListCtrl>("scripts_list"); if(!list) { return; } + std::string name; + if (LLAvatarNameCache::useDisplayNames()) + { + name = LLCacheName::buildUsername(full_name); + } + else + { + name = full_name; + } + std::vector<LLSD>::iterator id_itor; for (id_itor = mObjectListItems.begin(); id_itor != mObjectListItems.end(); ++id_itor) { @@ -668,6 +677,9 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) std::string name_buf = content["parcels"][i]["objects"][j]["name"].asString(); LLUUID task_id = content["parcels"][i]["objects"][j]["id"].asUUID(); LLUUID owner_id = content["parcels"][i]["objects"][j]["owner_id"].asUUID(); + // This field may not be sent by all server versions, but it's OK if + // it uses the LLSD default of false + bool is_group_owned = content["parcels"][i]["objects"][j]["is_group_owned"].asBoolean(); F32 location_x = 0.0f; F32 location_y = 0.0f; @@ -693,51 +705,69 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content) // ...and if not use the slightly more painful method of disovery: else { - BOOL name_is_cached = gCacheName->getFullName(owner_id, owner_buf); + BOOL name_is_cached; + if (is_group_owned) + { + name_is_cached = gCacheName->getGroupName(owner_id, owner_buf); + } + else + { + name_is_cached = gCacheName->getFullName(owner_id, owner_buf); // username + if (LLAvatarNameCache::useDisplayNames()) + { + owner_buf = LLCacheName::buildUsername(owner_buf); + } + } if(!name_is_cached) { if(std::find(names_requested.begin(), names_requested.end(), owner_id) == names_requested.end()) { names_requested.push_back(owner_id); - gCacheName->get(owner_id, TRUE, - boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache, - this, _1, _2, _3)); + gCacheName->get(owner_id, is_group_owned, // username + boost::bind(&LLPanelScriptLimitsRegionMemory::onNameCache, + this, _1, _2)); } } } - LLSD element; + LLScrollListItem::Params item_params; + item_params.value = task_id; - element["id"] = task_id; - element["columns"][0]["column"] = "size"; - element["columns"][0]["value"] = llformat("%d", size); - element["columns"][0]["font"] = "SANSSERIF"; - element["columns"][1]["column"] = "urls"; - element["columns"][1]["value"] = llformat("%d", urls); - element["columns"][1]["font"] = "SANSSERIF"; - element["columns"][2]["column"] = "name"; - element["columns"][2]["value"] = name_buf; - element["columns"][2]["font"] = "SANSSERIF"; - element["columns"][3]["column"] = "owner"; - element["columns"][3]["value"] = owner_buf; - element["columns"][3]["font"] = "SANSSERIF"; - element["columns"][4]["column"] = "parcel"; - element["columns"][4]["value"] = parcel_name; - element["columns"][4]["font"] = "SANSSERIF"; - element["columns"][5]["column"] = "location"; - if(has_locations) - { - element["columns"][5]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z); - } - else - { - element["columns"][5]["value"] = ""; - } - element["columns"][5]["font"] = "SANSSERIF"; + LLScrollListCell::Params cell_params; + cell_params.font = LLFontGL::getFontSansSerif(); - list->addElement(element, ADD_SORTED); + cell_params.column = "size"; + cell_params.value = size; + item_params.columns.add(cell_params); + + cell_params.column = "urls"; + cell_params.value = urls; + item_params.columns.add(cell_params); + + cell_params.column = "name"; + cell_params.value = name_buf; + item_params.columns.add(cell_params); + + cell_params.column = "owner"; + cell_params.value = owner_buf; + item_params.columns.add(cell_params); + + cell_params.column = "parcel"; + cell_params.value = parcel_name; + item_params.columns.add(cell_params); + + cell_params.column = "location"; + cell_params.value = has_locations + ? llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z) + : ""; + item_params.columns.add(cell_params); + + list->addRow(item_params); + LLSD element; element["owner_id"] = owner_id; + + element["id"] = task_id; element["local_id"] = local_id; mObjectListItems.push_back(element); } @@ -1303,7 +1333,7 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content) // static void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata) -{ +{ LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits"); if(instance) { diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h index 46e2e6f0e2..9bcfa5fe14 100644 --- a/indra/newview/llfloaterscriptlimits.h +++ b/indra/newview/llfloaterscriptlimits.h @@ -164,10 +164,8 @@ public: void returnObjects(); private: - void onNameCache(const LLUUID& id, - const std::string& first_name, - const std::string& last_name); + const std::string& name); LLSD mContent; LLUUID mParcelId; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index 7661e50eba..3ed4aec89a 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -96,11 +96,7 @@ LLFloaterSearch::LLFloaterSearch(const LLSD& key) : BOOL LLFloaterSearch::postBuild() { mBrowser = getChild<LLMediaCtrl>("browser"); - if (mBrowser) - { - mBrowser->addObserver(this); - mBrowser->setTrusted(true); - } + mBrowser->addObserver(this); return TRUE; } diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp index 3d87904dbe..8558a1277c 100644 --- a/indra/newview/llfloatersellland.cpp +++ b/indra/newview/llfloatersellland.cpp @@ -27,6 +27,7 @@ #include "llfloatersellland.h" +#include "llavatarnamecache.h" #include "llfloateravatarpicker.h" #include "llfloaterreg.h" #include "llfloaterland.h" @@ -41,6 +42,8 @@ #include "lluictrlfactory.h" #include "llviewerwindow.h" +class LLAvatarName; + // defined in llfloaterland.cpp void send_parcel_select_objects(S32 parcel_local_id, U32 return_type, uuid_list_t* return_ids = NULL); @@ -89,7 +92,9 @@ private: bool onConfirmSale(const LLSD& notification, const LLSD& response); static void doShowObjects(void *userdata); - void callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids); + void callbackAvatarPick(const uuid_vec_t& ids, const std::vector<LLAvatarName> names); + + void onBuyerNameCache(const LLAvatarName& av_name); public: virtual BOOL postBuild(); @@ -224,12 +229,17 @@ void LLFloaterSellLandUI::updateParcelInfo() if(mSellToBuyer) { - std::string name; - gCacheName->getFullName(mAuthorizedBuyer, name); - getChild<LLUICtrl>("sell_to_agent")->setValue(name); + LLAvatarNameCache::get(mAuthorizedBuyer, + boost::bind(&LLFloaterSellLandUI::onBuyerNameCache, this, _2)); } } +void LLFloaterSellLandUI::onBuyerNameCache(const LLAvatarName& av_name) +{ + getChild<LLUICtrl>("sell_to_agent")->setValue(av_name.getCompleteName()); + getChild<LLUICtrl>("sell_to_agent")->setToolTip(av_name.mUsername); +} + void LLFloaterSellLandUI::setBadge(const char* id, Badge badge) { static std::string badgeOK("badge_ok.j2c"); @@ -385,7 +395,7 @@ void LLFloaterSellLandUI::doSelectAgent() addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE)); } -void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLFloaterSellLandUI::callbackAvatarPick(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) { LLParcel* parcel = mParcelSelection->getParcel(); @@ -396,7 +406,7 @@ void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& nam mAuthorizedBuyer = ids[0]; - getChild<LLUICtrl>("sell_to_agent")->setValue(names[0]); + getChild<LLUICtrl>("sell_to_agent")->setValue(names[0].getCompleteName()); refreshUI(); } diff --git a/indra/newview/llfloatersettingsdebug.cpp b/indra/newview/llfloatersettingsdebug.cpp index 41a05055fe..71882fbb83 100644 --- a/indra/newview/llfloatersettingsdebug.cpp +++ b/indra/newview/llfloatersettingsdebug.cpp @@ -39,7 +39,6 @@ LLFloaterSettingsDebug::LLFloaterSettingsDebug(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_settings_debug.xml"); mCommitCallbackRegistrar.add("SettingSelect", boost::bind(&LLFloaterSettingsDebug::onSettingSelect, this,_1)); mCommitCallbackRegistrar.add("CommitSettings", boost::bind(&LLFloaterSettingsDebug::onCommitSettings, this)); mCommitCallbackRegistrar.add("ClickDefault", boost::bind(&LLFloaterSettingsDebug::onClickDefault, this)); diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 278fee799a..51ee38bd65 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1212,8 +1212,6 @@ LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSna type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; else if (id == "depth") type = LLViewerWindow::SNAPSHOT_TYPE_DEPTH; - else if (id == "objects") - type = LLViewerWindow::SNAPSHOT_TYPE_OBJECT_ID; return type; } @@ -2071,7 +2069,6 @@ LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key) : LLFloater(key), impl (*(new Impl)) { - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_snapshot.xml", FALSE); } // Destroys the object diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp index d945f1a2de..b845fd132d 100644 --- a/indra/newview/llfloatertelehub.cpp +++ b/indra/newview/llfloatertelehub.cpp @@ -51,7 +51,6 @@ LLFloaterTelehub::LLFloaterTelehub(const LLSD& key) mTelehubRot(), mNumSpawn(0) { - //LLUICtrlFactory::getInstance()->buildFloater(sInstance, "floater_telehub.xml"); } BOOL LLFloaterTelehub::postBuild() diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index 58a0d08c7d..370bf05bf7 100644 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -350,7 +350,6 @@ LLFloaterTools::LLFloaterTools(const LLSD& key) mFactoryMap["Contents"] = LLCallbackMap(createPanelContents, this);//LLPanelContents mFactoryMap["land info panel"] = LLCallbackMap(createPanelLandInfo, this);//LLPanelLandInfo - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_tools.xml",FALSE); mCommitCallbackRegistrar.add("BuildTool.setTool", boost::bind(&LLFloaterTools::setTool,this, _2)); mCommitCallbackRegistrar.add("BuildTool.commitZoom", boost::bind(&commit_slider_zoom, _1)); mCommitCallbackRegistrar.add("BuildTool.commitRadioFocus", boost::bind(&commit_radio_group_focus, _1)); diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp index a984dd1d51..2aaf403d5f 100644 --- a/indra/newview/llfloatertopobjects.cpp +++ b/indra/newview/llfloatertopobjects.cpp @@ -28,7 +28,9 @@ #include "llfloatertopobjects.h" +// library includes #include "message.h" +#include "llavatarnamecache.h" #include "llfontgl.h" #include "llagent.h" @@ -64,7 +66,6 @@ void LLFloaterTopObjects::show() } sInstance = new LLFloaterTopObjects(); -// LLUICtrlFactory::getInstance()->buildFloater(sInstance, "floater_top_objects.xml"); sInstance->center(); } */ @@ -190,37 +191,53 @@ void LLFloaterTopObjects::handleReply(LLMessageSystem *msg, void** data) LLSD element; element["id"] = task_id; - element["object_name"] = name_buf; - element["owner_name"] = owner_buf; - element["columns"][0]["column"] = "score"; - element["columns"][0]["value"] = llformat("%0.3f", score); - element["columns"][0]["font"] = "SANSSERIF"; + + LLSD columns; + columns[0]["column"] = "score"; + columns[0]["value"] = llformat("%0.3f", score); + columns[0]["font"] = "SANSSERIF"; + + columns[1]["column"] = "name"; + columns[1]["value"] = name_buf; + columns[1]["font"] = "SANSSERIF"; + + // Owner names can have trailing spaces sent from server + LLStringUtil::trim(owner_buf); - element["columns"][1]["column"] = "name"; - element["columns"][1]["value"] = name_buf; - element["columns"][1]["font"] = "SANSSERIF"; - element["columns"][2]["column"] = "owner"; - element["columns"][2]["value"] = owner_buf; - element["columns"][2]["font"] = "SANSSERIF"; - element["columns"][3]["column"] = "location"; - element["columns"][3]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z); - element["columns"][3]["font"] = "SANSSERIF"; - element["columns"][4]["column"] = "time"; - element["columns"][4]["value"] = formatted_time((time_t)time_stamp); - element["columns"][4]["font"] = "SANSSERIF"; + if (LLAvatarNameCache::useDisplayNames()) + { + // ...convert hard-coded name from server to a username + // *TODO: Send owner_id from server and look up display name + owner_buf = LLCacheName::buildUsername(owner_buf); + } + else + { + // ...just strip out legacy "Resident" name + owner_buf = LLCacheName::cleanFullName(owner_buf); + } + columns[2]["column"] = "owner"; + columns[2]["value"] = owner_buf; + columns[2]["font"] = "SANSSERIF"; + + columns[3]["column"] = "location"; + columns[3]["value"] = llformat("<%0.1f,%0.1f,%0.1f>", location_x, location_y, location_z); + columns[3]["font"] = "SANSSERIF"; + columns[4]["column"] = "time"; + columns[4]["value"] = formatted_time((time_t)time_stamp); + columns[4]["font"] = "SANSSERIF"; if (mCurrentMode == STAT_REPORT_TOP_SCRIPTS && have_extended_data) { - element["columns"][5]["column"] = "mono_time"; - element["columns"][5]["value"] = llformat("%0.3f", mono_score); - element["columns"][5]["font"] = "SANSSERIF"; + columns[5]["column"] = "mono_time"; + columns[5]["value"] = llformat("%0.3f", mono_score); + columns[5]["font"] = "SANSSERIF"; - element["columns"][6]["column"] = "URLs"; - element["columns"][6]["value"] = llformat("%d", public_urls); - element["columns"][6]["font"] = "SANSSERIF"; + columns[6]["column"] = "URLs"; + columns[6]["value"] = llformat("%d", public_urls); + columns[6]["font"] = "SANSSERIF"; } - + element["columns"] = columns; list->addElement(element); mObjectListData.append(element); diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 333e44e077..11b3379814 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -36,6 +36,7 @@ // Internal utility #include "lleventtimer.h" +#include "llexternaleditor.h" #include "llrender.h" #include "llsdutil.h" #include "llxmltree.h" @@ -160,6 +161,8 @@ public: DiffMap mDiffsMap; // map, of filename to pair of list of changed element paths and list of errors private: + LLExternalEditor mExternalEditor; + // XUI elements for this floater LLScrollListCtrl* mFileList; // scroll list control for file list LLLineEditor* mEditorPathTextBox; // text field for path to editor executable @@ -185,7 +188,7 @@ private: std::string mSavedDiffPath; // stored diff file path so closing this floater doesn't reset it // Internal functionality - static void popupAndPrintWarning(std::string& warning); // pop up a warning + static void popupAndPrintWarning(const std::string& warning); // pop up a warning std::string getLocalizedDirectory(); // build and return the path to the XUI directory for the currently-selected localization void scanDiffFile(LLXmlTreeNode* file_node); // scan a given XML node for diff entries and highlight them in its associated file void highlightChangedElements(); // look up the list of elements to highlight and highlight them in the current floater @@ -394,7 +397,6 @@ LLFloaterUIPreview::LLFloaterUIPreview(const LLSD& key) mLastDisplayedX(0), mLastDisplayedY(0) { - // called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_ui_preview.xml"); } // Destructor @@ -481,7 +483,7 @@ BOOL LLFloaterUIPreview::postBuild() mLanguageSelection->removeall(); // clear out anything temporarily in list from XML while(found) // for every directory { - if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory, FALSE))) // get next directory + if((found = gDirUtilp->getNextFileInDir(xui_dir, "*", language_directory))) // get next directory { std::string full_path = xui_dir + language_directory; if(LLFile::isfile(full_path.c_str())) // if it's not a directory, skip it @@ -598,7 +600,7 @@ void LLFloaterUIPreview::onClose(bool app_quitting) // Error handling (to avoid code repetition) // *TODO: this is currently unlocalized. Add to alerts/notifications.xml, someday, maybe. -void LLFloaterUIPreview::popupAndPrintWarning(std::string& warning) +void LLFloaterUIPreview::popupAndPrintWarning(const std::string& warning) { llwarns << warning << llendl; LLSD args; @@ -635,7 +637,7 @@ void LLFloaterUIPreview::refreshList() BOOL found = TRUE; while(found) // for every floater file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name, FALSE))) // get next file matching pattern + if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "floater_*.xml", name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } @@ -643,7 +645,7 @@ void LLFloaterUIPreview::refreshList() found = TRUE; while(found) // for every inspector file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name, FALSE))) // get next file matching pattern + if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "inspect_*.xml", name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } @@ -651,7 +653,7 @@ void LLFloaterUIPreview::refreshList() found = TRUE; while(found) // for every menu file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name, FALSE))) // get next file matching pattern + if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "menu_*.xml", name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } @@ -659,7 +661,7 @@ void LLFloaterUIPreview::refreshList() found = TRUE; while(found) // for every panel file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name, FALSE))) // get next file matching pattern + if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "panel_*.xml", name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } @@ -668,7 +670,7 @@ void LLFloaterUIPreview::refreshList() found = TRUE; while(found) // for every sidepanel file that matches the pattern { - if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name, FALSE))) // get next file matching pattern + if((found = gDirUtilp->getNextFileInDir(getLocalizedDirectory(), "sidepanel_*.xml", name))) // get next file matching pattern { addFloaterEntry(name.c_str()); // and add it to the list (file name only; localization code takes care of rest of path) } @@ -832,7 +834,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) if (save) { LLXMLNodePtr floater_write = new LLXMLNode(); - LLUICtrlFactory::getInstance()->buildFloater(*floaterp, path, floater_write); // just build it + (*floaterp)->buildFromFile(path, floater_write); // just build it if (!floater_write->isNull()) { @@ -846,7 +848,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) } else { - LLUICtrlFactory::getInstance()->buildFloater(*floaterp, path, NULL); // just build it + (*floaterp)->buildFromFile(path); // just build it (*floaterp)->openFloater((*floaterp)->getKey()); (*floaterp)->setCanResize((*floaterp)->isResizable()); } @@ -885,7 +887,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) if (save) { LLXMLNodePtr panel_write = new LLXMLNode(); - LLUICtrlFactory::getInstance()->buildPanel(panel, path, panel_write); // build it + panel->buildFromFile(path, panel_write); // build it if (!panel_write->isNull()) { @@ -899,7 +901,7 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) } else { - LLUICtrlFactory::getInstance()->buildPanel(panel, path); // build it + panel->buildFromFile(path); // build it LLRect new_size = panel->getRect(); // get its rectangle panel->setOrigin(0,0); // reset its origin point so it's not offset by -left or other XUI attributes (*floaterp)->setTitle(path); // use the file name as its title, since panels have no guaranteed meaningful name attribute @@ -999,190 +1001,55 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save) // Respond to button click to edit currently-selected floater void LLFloaterUIPreview::onClickEditFloater() { - std::string file_name = mFileList->getSelectedItemLabel(1); // get the file name of the currently-selected floater - if(std::string("") == file_name) // if no item is selected - { - return; // ignore click - } - std::string path = getLocalizedDirectory() + file_name; - - // stat file to see if it exists (some localized versions may not have it there are no diffs, and then we try to open an nonexistent file) - llstat dummy; - if(LLFile::stat(path.c_str(), &dummy)) // if the file does not exist - { - std::string warning = "No file for this floater exists in the selected localization. Opening the EN version instead."; - popupAndPrintWarning(warning); - - path = get_xui_dir() + mDelim + "en" + mDelim + file_name; // open the en version instead, by default - } - - // get executable path - const char* exe_path_char; - std::string path_in_textfield = mEditorPathTextBox->getText(); - if(std::string("") != path_in_textfield) // if the text field is not emtpy, use its path - { - exe_path_char = path_in_textfield.c_str(); - } - else if (!LLUI::sSettingGroups["config"]->getString("XUIEditor").empty()) - { - exe_path_char = LLUI::sSettingGroups["config"]->getString("XUIEditor").c_str(); - } - else // otherwise use the path specified by the environment variable + // Determine file to edit. + std::string file_path; { - exe_path_char = getenv("LL_XUI_EDITOR"); - } - - // error check executable path - if(NULL == exe_path_char) - { - std::string warning = "Select an editor by setting the environment variable LL_XUI_EDITOR or specifying its path in the \"Editor Path\" field."; - popupAndPrintWarning(warning); - return; - } - std::string exe_path = exe_path_char; // do this after error check, otherwise internal strlen call fails on bad char* - - // remove any quotes; they're added back in later where necessary - int found_at; - while((found_at = exe_path.find("\"")) != -1 || (found_at = exe_path.find("'")) != -1) - { - exe_path.erase(found_at,1); - } - - llstat s; - if(!LLFile::stat(exe_path.c_str(), &s)) // If the executable exists - { - // build paths and arguments - std::string quote = std::string("\""); - std::string args; - std::string custom_args = mEditorArgsTextBox->getText(); - int position_of_file = custom_args.find(std::string("%FILE%"), 0); // prepare to replace %FILE% with actual file path - std::string first_part_of_args = ""; - std::string second_part_of_args = ""; - if(-1 == position_of_file) // default: Executable.exe File.xml - { - args = quote + path + quote; // execute the command Program.exe "File.xml" - } - else // use advanced command-line arguments, e.g. "Program.exe -safe File.xml" -windowed for "-safe %FILE% -windowed" + std::string file_name = mFileList->getSelectedItemLabel(1); // get the file name of the currently-selected floater + if (file_name.empty()) // if no item is selected { - first_part_of_args = custom_args.substr(0,position_of_file); // get part of args before file name - second_part_of_args = custom_args.substr(position_of_file+6,custom_args.length()); // get part of args after file name - custom_args = first_part_of_args + std::string("\"") + path + std::string("\"") + second_part_of_args; // replace %FILE% with "<file path>" and put back together - args = custom_args; // and save in the variable that is actually used + llwarns << "No file selected" << llendl; + return; // ignore click } + file_path = getLocalizedDirectory() + file_name; - // find directory in which executable resides by taking everything after last slash - int last_slash_position = exe_path.find_last_of(mDelim); - if(-1 == last_slash_position) - { - std::string warning = std::string("Unable to find a valid path to the specified executable for XUI XML editing: ") + exe_path; - popupAndPrintWarning(warning); - return; - } - std::string exe_dir = exe_path.substr(0,last_slash_position); // strip executable off, e.g. get "C:\Program Files\TextPad 5" (with or without trailing slash) - -#if LL_WINDOWS - PROCESS_INFORMATION pinfo; - STARTUPINFOA sinfo; - memset(&sinfo, 0, sizeof(sinfo)); - memset(&pinfo, 0, sizeof(pinfo)); - - std::string exe_name = exe_path.substr(last_slash_position+1); - args = quote + exe_name + quote + std::string(" ") + args; // and prepend the executable name, so we get 'Program.exe "Arg1"' - - char *args2 = new char[args.size() + 1]; // Windows requires that the second parameter to CreateProcessA be a writable (non-const) string... - strcpy(args2, args.c_str()); - - // we don't want the current directory to be the executable directory, since the file path is now relative. By using - // NULL for the current directory instead of exe_dir.c_str(), the path to the target file will work. - if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) - { - // DWORD dwErr = GetLastError(); - std::string warning = "Creating editor process failed!"; - popupAndPrintWarning(warning); - } - else + // stat file to see if it exists (some localized versions may not have it there are no diffs, and then we try to open an nonexistent file) + llstat dummy; + if(LLFile::stat(file_path.c_str(), &dummy)) // if the file does not exist { - // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on - // sGatewayHandle = pinfo.hProcess; - CloseHandle(pinfo.hThread); // stops leaks - nothing else + popupAndPrintWarning("No file for this floater exists in the selected localization. Opening the EN version instead."); + file_path = get_xui_dir() + mDelim + "en" + mDelim + file_name; // open the en version instead, by default } + } - delete[] args2; -#else // if !LL_WINDOWS - // This code was copied from the code to run SLVoice, with some modification; should work in UNIX (Mac/Darwin or Linux) + // Set the editor command. + std::string cmd_override; + { + std::string bin = mEditorPathTextBox->getText(); + if (!bin.empty()) { - std::vector<std::string> arglist; - arglist.push_back(exe_path.c_str()); - - // Split the argument string into separate strings for each argument - typedef boost::tokenizer< boost::char_separator<char> > tokenizer; - boost::char_separator<char> sep("","\" ", boost::drop_empty_tokens); - - tokenizer tokens(args, sep); - tokenizer::iterator token_iter; - BOOL inside_quotes = FALSE; - BOOL last_was_space = FALSE; - for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) - { - if(!strncmp("\"",(*token_iter).c_str(),2)) - { - inside_quotes = !inside_quotes; - } - else if(!strncmp(" ",(*token_iter).c_str(),2)) - { - if(inside_quotes) - { - arglist.back().append(std::string(" ")); - last_was_space = TRUE; - } - } - else - { - std::string to_push = *token_iter; - if(last_was_space) - { - arglist.back().append(to_push); - last_was_space = FALSE; - } - else - { - arglist.push_back(to_push); - } - } - } - - // create an argv vector for the child process - char **fakeargv = new char*[arglist.size() + 1]; - int i; - for(i=0; i < arglist.size(); i++) - fakeargv[i] = const_cast<char*>(arglist[i].c_str()); - - fakeargv[i] = NULL; - - fflush(NULL); // flush all buffers before the child inherits them - pid_t id = vfork(); - if(id == 0) + // surround command with double quotes for the case if the path contains spaces + if (bin.find("\"") == std::string::npos) { - // child - execv(exe_path.c_str(), fakeargv); - - // If we reach this point, the exec failed. - // Use _exit() instead of exit() per the vfork man page. - std::string warning = "Creating editor process failed (vfork/execv)!"; - popupAndPrintWarning(warning); - _exit(0); + bin = "\"" + bin + "\""; } - // parent - delete[] fakeargv; - // sGatewayPID = id; + std::string args = mEditorArgsTextBox->getText(); + cmd_override = bin + " " + args; } -#endif // LL_WINDOWS } - else + if (!mExternalEditor.setCommand("LL_XUI_EDITOR", cmd_override)) { - std::string warning = "Unable to find path to external XML editor for XUI preview tool"; + std::string warning = "Select an editor by setting the environment variable LL_XUI_EDITOR " + "or the ExternalEditor setting or specifying its path in the \"Editor Path\" field."; popupAndPrintWarning(warning); + return; + } + + // Run the editor. + if (!mExternalEditor.run(file_path)) + { + popupAndPrintWarning("Failed to run editor"); + return; } } diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index 40f6d07286..151cd2a1cd 100644 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -82,7 +82,7 @@ LLFloaterURLEntry::LLFloaterURLEntry(LLHandle<LLPanel> parent) : LLFloater(LLSD()), mPanelLandMediaHandle(parent) { - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_url_entry.xml", NULL); + buildFromFile("floater_url_entry.xml"); } //----------------------------------------------------------------------------- diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp index 9c3f943013..be4b144f41 100644 --- a/indra/newview/llfloaterwater.cpp +++ b/indra/newview/llfloaterwater.cpp @@ -63,7 +63,6 @@ std::set<std::string> LLFloaterWater::sDefaultPresets; LLFloaterWater::LLFloaterWater(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_water.xml"); } LLFloaterWater::~LLFloaterWater() diff --git a/indra/newview/llfloaterwhitelistentry.cpp b/indra/newview/llfloaterwhitelistentry.cpp index 7c618e788f..2a499f681b 100644 --- a/indra/newview/llfloaterwhitelistentry.cpp +++ b/indra/newview/llfloaterwhitelistentry.cpp @@ -41,7 +41,6 @@ LLFloaterWhiteListEntry::LLFloaterWhiteListEntry( const LLSD& key ) : LLFloater(key) { -// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_whitelist_entry.xml"); } /////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp index 7131cb5de3..ae98b2cf99 100644 --- a/indra/newview/llfloaterwindlight.cpp +++ b/indra/newview/llfloaterwindlight.cpp @@ -66,7 +66,6 @@ static const F32 WL_SUN_AMBIENT_SLIDER_SCALE = 3.0f; LLFloaterWindLight::LLFloaterWindLight(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_windlight_options.xml"); } LLFloaterWindLight::~LLFloaterWindLight() diff --git a/indra/newview/llfloaterwindowsize.cpp b/indra/newview/llfloaterwindowsize.cpp index 105efae032..a70f2af11a 100644 --- a/indra/newview/llfloaterwindowsize.cpp +++ b/indra/newview/llfloaterwindowsize.cpp @@ -80,7 +80,6 @@ public: LLFloaterWindowSize::LLFloaterWindowSize(const LLSD& key) : LLFloater(key) { - //LLUICtrlFactory::getInstance()->buildFloater(this, "floater_window_size.xml"); } LLFloaterWindowSize::~LLFloaterWindowSize() diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp index 3afa31b873..ba0eb8a711 100644 --- a/indra/newview/llfloaterworldmap.cpp +++ b/indra/newview/llfloaterworldmap.cpp @@ -199,7 +199,6 @@ LLFloaterWorldMap::LLFloaterWorldMap(const LLSD& key) mFactoryMap["objects_mapview"] = LLCallbackMap(createWorldMapView, NULL); - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_world_map.xml", FALSE); mCommitCallbackRegistrar.add("WMap.Coordinates", boost::bind(&LLFloaterWorldMap::onCoordinatesCommit, this)); mCommitCallbackRegistrar.add("WMap.Location", boost::bind(&LLFloaterWorldMap::onLocationCommit, this)); mCommitCallbackRegistrar.add("WMap.AvatarCombo", boost::bind(&LLFloaterWorldMap::onAvatarComboCommit, this)); @@ -636,7 +635,7 @@ void LLFloaterWorldMap::updateTeleportCoordsDisplay( const LLVector3d& pos ) // convert global specified position to a local one F32 region_local_x = (F32)fmod( pos.mdV[VX], (F64)REGION_WIDTH_METERS ); F32 region_local_y = (F32)fmod( pos.mdV[VY], (F64)REGION_WIDTH_METERS ); - F32 region_local_z = (F32)fmod( pos.mdV[VZ], (F64)REGION_WIDTH_METERS ); + F32 region_local_z = (F32)llclamp( pos.mdV[VZ], 0.0, (F64)REGION_HEIGHT_METERS ); // write in the values childSetValue("teleport_coordinate_x", region_local_x ); diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h index 6327039b7f..1628a421ec 100644 --- a/indra/newview/llfloaterworldmap.h +++ b/indra/newview/llfloaterworldmap.h @@ -39,7 +39,6 @@ #include "lltracker.h" #include "llslurl.h" -class LLEventInfo; class LLFriendObserver; class LLInventoryModel; class LLInventoryObserver; diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp index 5d8e3f9ab9..62ba746a02 100644 --- a/indra/newview/llfolderview.cpp +++ b/indra/newview/llfolderview.cpp @@ -224,7 +224,7 @@ LLFolderView::LLFolderView(const Params& p) params.name("ren"); params.rect(rect); params.font(getLabelFontForStyle(LLFontGL::NORMAL)); - params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN); + params.max_length.bytes(DB_INV_ITEM_NAME_STR_LEN); params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2)); params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe); params.commit_on_focus_lost(true); @@ -350,6 +350,10 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder) { mFolders.insert(mFolders.begin(), folder); } + if (folder->numSelected()) + { + recursiveIncrementNumDescendantsSelected(folder->numSelected()); + } folder->setShowLoadStatus(true); folder->setOrigin(0, 0); folder->reshape(getRect().getWidth(), 0); @@ -692,29 +696,24 @@ BOOL LLFolderView::changeSelection(LLFolderViewItem* selection, BOOL selected) return rv; } -S32 LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) +void LLFolderView::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) { - S32 rv = 0; - // now store resulting selection if (mAllowMultiSelect) { LLFolderViewItem *cur_selection = getCurSelectedItem(); - rv = LLFolderViewFolder::extendSelection(selection, cur_selection, items); + LLFolderViewFolder::extendSelection(selection, cur_selection, items); for (S32 i = 0; i < items.count(); i++) { addToSelectionList(items[i]); - rv++; } } else { setSelection(selection, FALSE, FALSE); - rv++; } mSignalSelectCallback = SIGNAL_KEYBOARD_FOCUS; - return rv; } void LLFolderView::sanitizeSelection() @@ -1972,7 +1971,11 @@ void LLFolderView::scrollToShowSelection() { // If items are filtered while background fetch is in progress // scrollbar resets to the first filtered item. See EXT-3981. - if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && mSelectedItems.size()) + // However we allow scrolling for folder views with mAutoSelectOverride + // (used in Places SP) as an exception because the selection in them + // is not reset during items filtering. See STORM-133. + if ( (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mAutoSelectOverride) + && mSelectedItems.size() ) { mNeedsScroll = TRUE; } @@ -2426,6 +2429,7 @@ S32 LLFolderView::notify(const LLSD& info) { setFocus(true); selectFirstItem(); + scrollToShowSelection(); return 1; } @@ -2433,6 +2437,7 @@ S32 LLFolderView::notify(const LLSD& info) { setFocus(true); selectLastItem(); + scrollToShowSelection(); return 1; } } diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h index 980f9a34a6..afaac86b04 100644 --- a/indra/newview/llfolderview.h +++ b/indra/newview/llfolderview.h @@ -74,7 +74,6 @@ public: virtual void doItem(LLFolderViewItem* item) = 0; }; - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLFolderView // @@ -115,7 +114,7 @@ public: const std::string getFilterSubString(BOOL trim = FALSE); U32 getFilterObjectTypes() const; PermissionMask getFilterPermissions() const; - // JAMESDEBUG use getFilter()->getShowFolderState(); + // *NOTE: use getFilter()->getShowFolderState(); //LLInventoryFilter::EFolderShow getShowFolderState(); U32 getSortOrder() const; BOOL isFilterModified(); @@ -146,18 +145,18 @@ public: // Record the selected item and pass it down the hierachy. virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus); - + // Used by menu callbacks void setSelectionByID(const LLUUID& obj_id, BOOL take_keyboard_focus); - + // Called once a frame to update the selection if mSelectThisID has been set - void updateSelection(); - + void updateSelection(); + // This method is used to toggle the selection of an item. Walks // children, and keeps track of selected objects. virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected); - virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items); + virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items); virtual std::set<LLUUID> getSelectionList() const; diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h index ade30d9266..3bfbf36110 100644 --- a/indra/newview/llfoldervieweventlistener.h +++ b/indra/newview/llfoldervieweventlistener.h @@ -25,7 +25,7 @@ #ifndef LLFOLDERVIEWEVENTLISTENER_H #define LLFOLDERVIEWEVENTLISTENER_H -#include "lldarray.h" // JAMESDEBUG convert to std::vector +#include "lldarray.h" // *TODO: convert to std::vector #include "llfoldertype.h" #include "llfontgl.h" // just for StyleFlags enum #include "llinventorytype.h" diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp index 04b690b903..3c36248c1f 100644 --- a/indra/newview/llfolderviewitem.cpp +++ b/indra/newview/llfolderviewitem.cpp @@ -489,27 +489,34 @@ void LLFolderViewItem::dirtyFilter() // together. BOOL LLFolderViewItem::setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus) { - if( selection == this ) + if (selection == this && !mIsSelected) { - mIsSelected = TRUE; - if(mListener) + selectItem(); + if (mListener) { mListener->selectItem(); } } - else + else if (mIsSelected) // Deselect everything else. { - mIsSelected = FALSE; + deselectItem(); } return mIsSelected; } BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selected) { - if(selection == this && mIsSelected != selected) + if (selection == this && mIsSelected != selected) { - mIsSelected = selected; - if(mListener) + if (mIsSelected) + { + deselectItem(); + } + else + { + selectItem(); + } + if (mListener) { mListener->selectItem(); } @@ -518,6 +525,33 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte return FALSE; } +void LLFolderViewItem::deselectItem(void) +{ + llassert(mIsSelected); + + mIsSelected = FALSE; + + // Update ancestors' count of selected descendents. + LLFolderViewFolder* parent_folder = getParentFolder(); + if (parent_folder) + { + parent_folder->recursiveIncrementNumDescendantsSelected(-1); + } +} + +void LLFolderViewItem::selectItem(void) +{ + llassert(!mIsSelected); + + mIsSelected = TRUE; + + // Update ancestors' count of selected descendents. + LLFolderViewFolder* parent_folder = getParentFolder(); + if (parent_folder) + { + parent_folder->recursiveIncrementNumDescendantsSelected(1); + } +} BOOL LLFolderViewItem::isMovable() { @@ -1073,6 +1107,7 @@ void LLFolderViewItem::draw() LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ): LLFolderViewItem( p ), // 0 = no create time + mNumDescendantsSelected(0), mIsOpen(FALSE), mExpanderHighlighted(FALSE), mCurHeight(0.f), @@ -1458,16 +1493,34 @@ BOOL LLFolderViewFolder::hasFilteredDescendants() return mMostFilteredDescendantGeneration >= getRoot()->getFilter()->getCurrentGeneration(); } +void LLFolderViewFolder::recursiveIncrementNumDescendantsSelected(S32 increment) +{ + LLFolderViewFolder* parent_folder = this; + do + { + parent_folder->mNumDescendantsSelected += increment; + + // Make sure we don't have negative values. + llassert(parent_folder->mNumDescendantsSelected >= 0); + + parent_folder = parent_folder->getParentFolder(); + } + while(parent_folder); +} + // Passes selection information on to children and record selection // information if necessary. BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem, - BOOL take_keyboard_focus) + BOOL take_keyboard_focus) { BOOL rv = FALSE; - if( selection == this ) + if (selection == this) { - mIsSelected = TRUE; - if(mListener) + if (!isSelected()) + { + selectItem(); + } + if (mListener) { mListener->selectItem(); } @@ -1475,7 +1528,10 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem } else { - mIsSelected = FALSE; + if (isSelected()) + { + deselectItem(); + } rv = FALSE; } BOOL child_selected = FALSE; @@ -1507,21 +1563,31 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem return rv; } -// This method is used to change the selection of an item. If -// selection is 'this', then note selection as true. Returns TRUE -// if this or a child is now selected. -BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, - BOOL selected) +// This method is used to change the selection of an item. +// Recursively traverse all children; if 'selection' is 'this' then change +// the select status if necessary. +// Returns TRUE if the selection state of this folder, or of a child, was changed. +BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, BOOL selected) { BOOL rv = FALSE; if(selection == this) { - mIsSelected = selected; - if(mListener && selected) + if (isSelected() != selected) + { + rv = TRUE; + if (selected) + { + selectItem(); + } + else + { + deselectItem(); + } + } + if (mListener && selected) { mListener->selectItem(); } - rv = TRUE; } for (folders_t::iterator iter = mFolders.begin(); @@ -1545,16 +1611,14 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection, return rv; } -S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& selected_items) +void LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& selected_items) { - S32 num_selected = 0; - // pass on to child folders first for (folders_t::iterator iter = mFolders.begin(); iter != mFolders.end();) { folders_t::iterator fit = iter++; - num_selected += (*fit)->extendSelection(selection, last_selected, selected_items); + (*fit)->extendSelection(selection, last_selected, selected_items); } // handle selection of our immediate children... @@ -1647,7 +1711,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie if (item->changeSelection(item, TRUE)) { selected_items.put(item); - num_selected++; } } } @@ -1657,11 +1720,8 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie if (selection->changeSelection(selection, TRUE)) { selected_items.put(selection); - num_selected++; } } - - return num_selected; } void LLFolderViewFolder::destroyView() @@ -1711,6 +1771,10 @@ void LLFolderViewFolder::removeView(LLFolderViewItem* item) return; } // deselect without traversing hierarchy + if (item->isSelected()) + { + item->deselectItem(); + } getRoot()->removeFromSelectionList(item); extractItem(item); delete item; @@ -1726,16 +1790,24 @@ void LLFolderViewFolder::extractItem( LLFolderViewItem* item ) // This is an evil downcast. However, it's only doing // pointer comparison to find if (which it should be ) the // item is in the container, so it's pretty safe. - LLFolderViewFolder* f = reinterpret_cast<LLFolderViewFolder*>(item); + LLFolderViewFolder* f = static_cast<LLFolderViewFolder*>(item); folders_t::iterator ft; ft = std::find(mFolders.begin(), mFolders.end(), f); - if(ft != mFolders.end()) + if (ft != mFolders.end()) { + if ((*ft)->numSelected()) + { + recursiveIncrementNumDescendantsSelected(-(*ft)->numSelected()); + } mFolders.erase(ft); } } else { + if ((*it)->isSelected()) + { + recursiveIncrementNumDescendantsSelected(-1); + } mItems.erase(it); } //item has been removed, need to update filter @@ -1899,6 +1971,10 @@ BOOL LLFolderViewFolder::isRemovable() BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item) { mItems.push_back(item); + if (item->isSelected()) + { + recursiveIncrementNumDescendantsSelected(1); + } item->setRect(LLRect(0, 0, getRect().getWidth(), 0)); item->setVisible(FALSE); addChild( item ); @@ -1912,6 +1988,10 @@ BOOL LLFolderViewFolder::addItem(LLFolderViewItem* item) BOOL LLFolderViewFolder::addFolder(LLFolderViewFolder* folder) { mFolders.push_back(folder); + if (folder->numSelected()) + { + recursiveIncrementNumDescendantsSelected(folder->numSelected()); + } folder->setOrigin(0, 0); folder->reshape(getRect().getWidth(), 0); folder->setVisible(FALSE); diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h index 11b644e3aa..2006e094a8 100644 --- a/indra/newview/llfolderviewitem.h +++ b/indra/newview/llfolderviewitem.h @@ -51,7 +51,7 @@ enum EInventorySortGroup SG_ITEM }; -// JAMESDEBUG *TODO: do we really need one sort object per folder? +// *TODO: do we really need one sort object per folder? // can we just have one of these per LLFolderView ? class LLInventorySort { @@ -108,7 +108,7 @@ public: // layout constants static const S32 LEFT_PAD = 5; - // LEFT_INDENTATION is set via folder_indentation above + // LEFT_INDENTATION is set via folder_indentation above static const S32 ICON_PAD = 2; static const S32 ICON_WIDTH = 16; static const S32 TEXT_PAD = 1; @@ -121,6 +121,9 @@ public: // Mostly for debugging printout purposes. const std::string& getSearchableLabel() { return mSearchableLabel; } +private: + BOOL mIsSelected; + protected: friend class LLUICtrlFactory; friend class LLFolderViewEventListener; @@ -134,7 +137,6 @@ protected: time_t mCreationDate; LLFolderViewFolder* mParentFolder; LLFolderViewEventListener* mListener; - BOOL mIsSelected; BOOL mIsCurSelection; BOOL mSelectPending; LLFontGL::StyleFlags mLabelStyle; @@ -212,19 +214,23 @@ public: virtual void dirtyFilter(); - // If the selection is 'this' then note that otherwise - // ignore. Returns TRUE if this object was affected. If open is - // TRUE, then folders are opened up along the way to the - // selection. - virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, - BOOL take_keyboard_focus); + // If 'selection' is 'this' then note that otherwise ignore. + // Returns TRUE if this item ends up being selected. + virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus); - // This method is used to toggle the selection of an item. If - // selection is 'this', then note selection, and return TRUE. + // This method is used to set the selection state of an item. + // If 'selection' is 'this' then note selection. + // Returns TRUE if the selection state of this item was changed. virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected); // this method is used to group select items - virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items){ return FALSE; } + virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items) { } + + // this method is used to deselect this element + void deselectItem(); + + // this method is used to select this element + void selectItem(); // gets multiple-element selection virtual std::set<LLUUID> getSelectionList() const; @@ -238,7 +244,7 @@ public: // destroys this item recursively virtual void destroyView(); - BOOL isSelected() { return mIsSelected; } + BOOL isSelected() const { return mIsSelected; } void setUnselected() { mIsSelected = FALSE; } @@ -247,7 +253,7 @@ public: BOOL getIsCurSelection() { return mIsCurSelection; } BOOL hasVisibleChildren() { return mHasVisibleChildren; } - + void setShowLoadStatus(bool status) { mShowLoadStatus = status; } // Call through to the viewed object and return true if it can be @@ -359,6 +365,13 @@ public: UNKNOWN, TRASH, NOT_TRASH } ETrash; +private: + S32 mNumDescendantsSelected; + +public: // Accessed needed by LLFolderViewItem + void recursiveIncrementNumDescendantsSelected(S32 increment); + S32 numSelected(void) const { return mNumDescendantsSelected + (isSelected() ? 1 : 0); } + protected: typedef std::list<LLFolderViewItem*> items_t; typedef std::list<LLFolderViewFolder*> folders_t; @@ -420,18 +433,19 @@ public: virtual void dirtyFilter(); // Passes selection information on to children and record - // selection information if necessary. Returns TRUE if this object - // (or a child) was affected. - virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, - BOOL take_keyboard_focus); - - // This method is used to change the selection of an item. If - // selection is 'this', then note selection as true. Returns TRUE - // if this or a child is now selected. + // selection information if necessary. + // Returns TRUE if this object (or a child) ends up being selected. + // If 'openitem' is TRUE then folders are opened up along the way to the selection. + virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus); + + // This method is used to change the selection of an item. + // Recursively traverse all children; if 'selection' is 'this' then change + // the select status if necessary. + // Returns TRUE if the selection state of this folder, or of a child, was changed. virtual BOOL changeSelection(LLFolderViewItem* selection, BOOL selected); // this method is used to group select items - virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items); + virtual void extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items); // Returns true is this object and all of its children can be removed. virtual BOOL isRemovable(); @@ -521,6 +535,7 @@ public: time_t getCreationDate() const; bool isTrash() const; + S32 getNumSelectedDescendants(void) const { return mNumDescendantsSelected; } }; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp index 2f856abe8f..e9f1e3bc22 100644 --- a/indra/newview/llfriendcard.cpp +++ b/indra/newview/llfriendcard.cpp @@ -26,13 +26,14 @@ #include "llviewerprecompiledheaders.h" +#include "llfriendcard.h" + +#include "llavatarnamecache.h" #include "llinventory.h" #include "llinventoryfunctions.h" #include "llinventoryobserver.h" #include "lltrans.h" -#include "llfriendcard.h" - #include "llcallingcard.h" // for LLAvatarTracker #include "llviewerinventory.h" #include "llinventorymodel.h" @@ -541,8 +542,9 @@ void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID) { bool shouldBeAdded = true; - std::string name; - gCacheName->getFullName(avatarID, name); + LLAvatarName av_name; + LLAvatarNameCache::get(avatarID, &av_name); + const std::string& name = av_name.mUsername; lldebugs << "Processing buddy name: " << name << ", id: " << avatarID diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 260e15c714..f990b9294d 100644 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -128,7 +128,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item) switch(item->getType()) { case LLAssetType::AT_OBJECT: - if (gAgentAvatarp->isWearingAttachment(item->getUUID())) + if (get_is_item_worn(item->getUUID())) { acceptable = false; } @@ -139,7 +139,7 @@ bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item) BOOL copyable = false; if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true; - if (!copyable && gAgentWearables.isWearingItem(item->getUUID())) + if (!copyable && get_is_item_worn(item->getUUID())) { acceptable = false; } diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index 83846f5b61..842911ecc0 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -48,6 +48,7 @@ #include "lltoolmgr.h" #include "llselectmgr.h" #include "llhudmanager.h" +#include "llhudtext.h" #include "llrendersphere.h" #include "llviewerobjectlist.h" #include "lltoolselectrect.h" @@ -662,35 +663,27 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV x2 = x1 + PARCEL_GRID_STEP_METERS; y2 = y1; - if (gRenderForSelect) - { - LLColor4U color((U8)(GL_NAME_PARCEL_WALL >> 16), (U8)(GL_NAME_PARCEL_WALL >> 8), (U8)GL_NAME_PARCEL_WALL); - gGL.color4ubv(color.mV); - } - else - { - dy = (pos_y - y1) + DIST_OFFSET; - - if (pos_x < x1) - dx = pos_x - x1; - else if (pos_x > x2) - dx = pos_x - x2; - else - dx = 0; + dy = (pos_y - y1) + DIST_OFFSET; - dist = dx*dx+dy*dy; - - if (dist < MIN_DIST_SQ) - alpha = MAX_ALPHA; - else if (dist > MAX_DIST_SQ) - alpha = 0.0f; - else - alpha = 30/dist; - - alpha = llclamp(alpha, 0.0f, MAX_ALPHA); - - gGL.color4f(1.f, 1.f, 1.f, alpha); - } + if (pos_x < x1) + dx = pos_x - x1; + else if (pos_x > x2) + dx = pos_x - x2; + else + dx = 0; + + dist = dx*dx+dy*dy; + + if (dist < MIN_DIST_SQ) + alpha = MAX_ALPHA; + else if (dist > MAX_DIST_SQ) + alpha = 0.0f; + else + alpha = 30/dist; + + alpha = llclamp(alpha, 0.0f, MAX_ALPHA); + + gGL.color4f(1.f, 1.f, 1.f, alpha); if ((pos_y - y1) < 0) direction = SOUTH_MASK; else direction = NORTH_MASK; @@ -708,35 +701,27 @@ void LLViewerParcelMgr::renderCollisionSegments(U8* segments, BOOL use_pass, LLV x2 = x1; y2 = y1 + PARCEL_GRID_STEP_METERS; - if (gRenderForSelect) - { - LLColor4U color((U8)(GL_NAME_PARCEL_WALL >> 16), (U8)(GL_NAME_PARCEL_WALL >> 8), (U8)GL_NAME_PARCEL_WALL); - gGL.color4ubv(color.mV); - } + dx = (pos_x - x1) + DIST_OFFSET; + + if (pos_y < y1) + dy = pos_y - y1; + else if (pos_y > y2) + dy = pos_y - y2; + else + dy = 0; + + dist = dx*dx+dy*dy; + + if (dist < MIN_DIST_SQ) + alpha = MAX_ALPHA; + else if (dist > MAX_DIST_SQ) + alpha = 0.0f; else - { - dx = (pos_x - x1) + DIST_OFFSET; - - if (pos_y < y1) - dy = pos_y - y1; - else if (pos_y > y2) - dy = pos_y - y2; - else - dy = 0; - - dist = dx*dx+dy*dy; - - if (dist < MIN_DIST_SQ) - alpha = MAX_ALPHA; - else if (dist > MAX_DIST_SQ) - alpha = 0.0f; - else - alpha = 30/dist; - - alpha = llclamp(alpha, 0.0f, MAX_ALPHA); + alpha = 30/dist; + + alpha = llclamp(alpha, 0.0f, MAX_ALPHA); - gGL.color4f(1.f, 1.f, 1.f, alpha); - } + gGL.color4f(1.f, 1.f, 1.f, alpha); if ((pos_x - x1) > 0) direction = WEST_MASK; else direction = EAST_MASK; @@ -888,7 +873,7 @@ void LLViewerObjectList::renderObjectBeacons() color = debug_beacon.mTextColor; color.mV[3] *= 1.f; - hud_textp->setString(utf8str_to_wstring(debug_beacon.mString)); + hud_textp->setString(debug_beacon.mString); hud_textp->setColor(color); hud_textp->setPositionAgent(debug_beacon.mPositionAgent); debug_beacon.mHUDObject = hud_textp; diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index c42b397252..5393678a6b 100644 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -235,7 +235,7 @@ static bool isGroupUIVisible() { static LLPanel* panel = 0; if(!panel) - panel = LLSideTray::getInstance()->findChild<LLPanel>("panel_group_info_sidetray"); + panel = LLSideTray::getInstance()->getPanel("panel_group_info_sidetray"); if(!panel) return false; return panel->isInVisibleChain(); diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp index 4f9d51ce58..c3e6e1c2dc 100644 --- a/indra/newview/llgrouplist.cpp +++ b/indra/newview/llgrouplist.cpp @@ -283,7 +283,7 @@ mGroupNameBox(NULL), mInfoBtn(NULL), mGroupID(LLUUID::null) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_list_item.xml"); + buildFromFile( "panel_group_list_item.xml"); // Remember group icon width including its padding from the name text box, // so that we can hide and show the icon again later. diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp new file mode 100644 index 0000000000..3f0deb98cd --- /dev/null +++ b/indra/newview/llhints.cpp @@ -0,0 +1,395 @@ +/** + * @file llhints.cpp + * @brief Hint popups for displaying context sensitive help in a UI overlay + * + * $LicenseInfo:firstyear=2000&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" // must be first include + +#include "llhints.h" + +#include "llbutton.h" +#include "lltextbox.h" +#include "llviewerwindow.h" +#include "llviewercontrol.h" +#include "llsdparam.h" + +class LLHintPopup : public LLPanel +{ +public: + + typedef enum e_popup_direction + { + LEFT, + TOP, + RIGHT, + BOTTOM, + TOP_RIGHT + } EPopupDirection; + + struct PopupDirections : public LLInitParam::TypeValuesHelper<LLHintPopup::EPopupDirection, PopupDirections> + { + static void declareValues() + { + declare("left", LLHintPopup::LEFT); + declare("right", LLHintPopup::RIGHT); + declare("top", LLHintPopup::TOP); + declare("bottom", LLHintPopup::BOTTOM); + declare("top_right", LLHintPopup::TOP_RIGHT); + } + }; + + struct TargetParams : public LLInitParam::Block<TargetParams> + { + Mandatory<std::string> target; + Mandatory<EPopupDirection, PopupDirections> direction; + + TargetParams() + : target("target"), + direction("direction") + {} + }; + + struct Params : public LLInitParam::Block<Params, LLPanel::Params> + { + Mandatory<LLNotificationPtr> notification; + Optional<TargetParams> target_params; + Optional<S32> distance; + Optional<LLUIImage*> left_arrow, + up_arrow, + right_arrow, + down_arrow, + lower_left_arrow; + + Optional<S32> left_arrow_offset, + up_arrow_offset, + right_arrow_offset, + down_arrow_offset; + Optional<F32> fade_in_time, + fade_out_time; + + Params() + : distance("distance"), + left_arrow("left_arrow"), + up_arrow("up_arrow"), + right_arrow("right_arrow"), + down_arrow("down_arrow"), + lower_left_arrow("lower_left_arrow"), + left_arrow_offset("left_arrow_offset"), + up_arrow_offset("up_arrow_offset"), + right_arrow_offset("right_arrow_offset"), + down_arrow_offset("down_arrow_offset"), + fade_in_time("fade_in_time"), + fade_out_time("fade_out_time") + {} + }; + + LLHintPopup(const Params&); + + /*virtual*/ BOOL postBuild(); + + void onClickClose() + { + if (!mHidden) + { + hide(); + LLNotifications::instance().cancel(mNotification); + } + } + void draw(); + void hide() { if(!mHidden) {mHidden = true; mFadeTimer.reset();} } + +private: + LLNotificationPtr mNotification; + std::string mTarget; + EPopupDirection mDirection; + S32 mDistance; + LLUIImagePtr mArrowLeft, + mArrowUp, + mArrowRight, + mArrowDown, + mArrowDownAndLeft; + S32 mArrowLeftOffset, + mArrowUpOffset, + mArrowRightOffset, + mArrowDownOffset; + LLFrameTimer mFadeTimer; + F32 mFadeInTime, + mFadeOutTime; + bool mHidden; +}; + +static LLDefaultChildRegistry::Register<LLHintPopup> r("hint_popup"); + + +LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) +: mNotification(p.notification), + mDirection(TOP), + mDistance(p.distance), + mArrowLeft(p.left_arrow), + mArrowUp(p.up_arrow), + mArrowRight(p.right_arrow), + mArrowDown(p.down_arrow), + mArrowDownAndLeft(p.lower_left_arrow), + mArrowLeftOffset(p.left_arrow_offset), + mArrowUpOffset(p.up_arrow_offset), + mArrowRightOffset(p.right_arrow_offset), + mArrowDownOffset(p.down_arrow_offset), + mHidden(false), + mFadeInTime(p.fade_in_time), + mFadeOutTime(p.fade_out_time), + LLPanel(p) +{ + if (p.target_params.isProvided()) + { + mDirection = p.target_params.direction; + mTarget = p.target_params.target; + } + buildFromFile( "panel_hint.xml", NULL, p); +} + +BOOL LLHintPopup::postBuild() +{ + LLTextBox& hint_text = getChildRef<LLTextBox>("hint_text"); + hint_text.setText(mNotification->getMessage()); + + getChild<LLButton>("close")->setClickedCallback(boost::bind(&LLHintPopup::onClickClose, this)); + getChild<LLTextBox>("hint_title")->setText(mNotification->getLabel()); + + LLRect text_bounds = hint_text.getTextBoundingRect(); + S32 delta_height = text_bounds.getHeight() - hint_text.getRect().getHeight(); + reshape(getRect().getWidth(), getRect().getHeight() + delta_height); + return TRUE; +} + +void LLHintPopup::draw() +{ + F32 alpha = 1.f; + if (mHidden) + { + alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeOutTime, 1.f, 0.f); + if (alpha == 0.f) + { + die(); + return; + } + } + else + { + alpha = clamp_rescale(mFadeTimer.getElapsedTimeF32(), 0.f, mFadeInTime, 0.f, 1.f); + } + + { LLViewDrawContext context(alpha); + + if (mTarget.empty()) + { + // just draw contents, no arrow, in default position + LLPanel::draw(); + } + else + { + LLView* targetp = LLHints::getHintTarget(mTarget).get(); + if (!targetp) + { + // target widget is no longer valid, go away + die(); + } + else if (!targetp->isInVisibleChain()) + { + // if target is invisible, don't draw, but keep alive in case widget comes back + // but do make it so that it allows mouse events to pass through + setEnabled(false); + setMouseOpaque(false); + } + else + { + // revert back enabled and mouse opaque state in case we disabled it before + setEnabled(true); + setMouseOpaque(true); + + LLRect target_rect; + targetp->localRectToOtherView(targetp->getLocalRect(), &target_rect, getParent()); + + LLRect my_local_rect = getLocalRect(); + LLRect my_rect; + LLRect arrow_rect; + LLUIImagePtr arrow_imagep; + + switch(mDirection) + { + case LEFT: + my_rect.setCenterAndSize( target_rect.mLeft - (my_local_rect.getWidth() / 2 + mDistance), + target_rect.getCenterY(), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowRight) + { + arrow_rect.setCenterAndSize(my_local_rect.mRight + mArrowRight->getWidth() / 2 + mArrowRightOffset, + my_local_rect.getCenterY(), + mArrowRight->getWidth(), + mArrowRight->getHeight()); + arrow_imagep = mArrowRight; + } + break; + case TOP: + my_rect.setCenterAndSize( target_rect.getCenterX(), + target_rect.mTop + (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowDown) + { + arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), + my_local_rect.mBottom - mArrowDown->getHeight() / 2 + mArrowDownOffset, + mArrowDown->getWidth(), + mArrowDown->getHeight()); + arrow_imagep = mArrowDown; + } + break; + case RIGHT: + my_rect.setCenterAndSize( target_rect.mRight + (my_local_rect.getWidth() / 2 + mDistance), + target_rect.getCenterY(), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowLeft) + { + arrow_rect.setCenterAndSize(my_local_rect.mLeft - mArrowLeft->getWidth() / 2 + mArrowLeftOffset, + my_local_rect.getCenterY(), + mArrowLeft->getWidth(), + mArrowLeft->getHeight()); + arrow_imagep = mArrowLeft; + } + break; + case BOTTOM: + my_rect.setCenterAndSize( target_rect.getCenterX(), + target_rect.mBottom - (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowUp) + { + arrow_rect.setCenterAndSize(my_local_rect.getCenterX(), + my_local_rect.mTop + mArrowUp->getHeight() / 2 + mArrowUpOffset, + mArrowUp->getWidth(), + mArrowUp->getHeight()); + arrow_imagep = mArrowUp; + } + break; + case TOP_RIGHT: + my_rect.setCenterAndSize( target_rect.mRight + (my_local_rect.getWidth() / 2), + target_rect.mTop + (my_local_rect.getHeight() / 2 + mDistance), + my_local_rect.getWidth(), + my_local_rect.getHeight()); + if (mArrowDownAndLeft) + { + arrow_rect.setCenterAndSize(my_local_rect.mLeft + mArrowDownAndLeft->getWidth() / 2 + mArrowLeftOffset, + my_local_rect.mBottom - mArrowDownAndLeft->getHeight() / 2 + mArrowDownOffset, + mArrowDownAndLeft->getWidth(), + mArrowDownAndLeft->getHeight()); + arrow_imagep = mArrowDownAndLeft; + } + } + setShape(my_rect); + LLPanel::draw(); + + if (arrow_imagep) arrow_imagep->draw(arrow_rect, LLColor4(1.f, 1.f, 1.f, alpha)); + } + } + } +} + + +LLRegistry<std::string, LLHandle<LLView> > LLHints::sTargetRegistry; +std::map<LLNotificationPtr, class LLHintPopup*> LLHints::sHints; + +//static +void LLHints::show(LLNotificationPtr hint) +{ + LLHintPopup::Params p(LLUICtrlFactory::getDefaultParams<LLHintPopup>()); + + LLParamSDParser parser; + parser.readSD(hint->getPayload(), p, true); + p.notification = hint; + + if (p.validateBlock()) + { + LLHintPopup* popup = new LLHintPopup(p); + + sHints[hint] = popup; + + LLView* hint_holder = gViewerWindow->getHintHolder(); + if (hint_holder) + { + hint_holder->addChild(popup); + popup->centerWithin(hint_holder->getLocalRect()); + } + } +} + +//static +void LLHints::hide(LLNotificationPtr hint) +{ + hint_map_t::iterator found_it = sHints.find(hint); + if (found_it != sHints.end()) + { + found_it->second->hide(); + sHints.erase(found_it); + } +} + +//static +void LLHints::registerHintTarget(const std::string& name, LLHandle<LLView> target) +{ + sTargetRegistry.defaultRegistrar().replace(name, target); +} + +//static +LLHandle<LLView> LLHints::getHintTarget(const std::string& name) +{ + LLHandle<LLView>* handlep = sTargetRegistry.getValue(name); + if (handlep) + { + return *handlep; + } + else + { + return LLHandle<LLView>(); + } +} + +//static +void LLHints::initClass() +{ + sRegister.reference(); + + LLControlVariablePtr control = gSavedSettings.getControl("EnableUIHints"); + control->getSignal()->connect(boost::bind(&showHints, _2)); + gViewerWindow->getHintHolder()->setVisible(control->getValue().asBoolean()); + +} + +//staic +void LLHints::showHints(const LLSD& show) +{ + bool visible = show.asBoolean(); + gViewerWindow->getHintHolder()->setVisible(visible); +} diff --git a/indra/newview/llhints.h b/indra/newview/llhints.h new file mode 100644 index 0000000000..ebffe561b9 --- /dev/null +++ b/indra/newview/llhints.h @@ -0,0 +1,50 @@ +/** + * @file llhints.h + * @brief Hint popups for displaying context sensitive help in a UI overlay + * + * $LicenseInfo:firstyear=2000&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_LLHINTS_H +#define LL_LLHINTS_H + +#include "llpanel.h" +#include "llnotifications.h" + + +class LLHints : public LLInitClass<LLHints> +{ +public: + static void show(LLNotificationPtr hint); + static void hide(LLNotificationPtr hint); + static void registerHintTarget(const std::string& name, LLHandle<LLView> target); + static LLHandle<LLView> getHintTarget(const std::string& name); + static void initClass(); +private: + static LLRegistry<std::string, LLHandle<LLView> > sTargetRegistry; + typedef std::map<LLNotificationPtr, class LLHintPopup*> hint_map_t; + static hint_map_t sHints; + static void showHints(const LLSD& show); +}; + + +#endif diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp index aea8c5928b..568b0ae585 100644 --- a/indra/newview/llhudicon.cpp +++ b/indra/newview/llhudicon.cpp @@ -201,11 +201,6 @@ void LLHUDIcon::render() renderIcon(FALSE); } -void LLHUDIcon::renderForSelect() -{ - renderIcon(TRUE); -} - BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3* intersection) { if (mHidden) diff --git a/indra/newview/llhudicon.h b/indra/newview/llhudicon.h index 7712ebac1a..644daa0299 100644 --- a/indra/newview/llhudicon.h +++ b/indra/newview/llhudicon.h @@ -44,6 +44,7 @@ // Renders a 2D icon billboard floating at the location specified. class LLDrawable; class LLViewerObject; +class LLViewerTexture; class LLHUDIcon : public LLHUDObject { @@ -51,7 +52,6 @@ friend class LLHUDObject; public: /*virtual*/ void render(); - /*virtual*/ void renderForSelect(); /*virtual*/ void markDead(); /*virtual*/ F32 getDistance() const { return mDistance; } diff --git a/indra/newview/llhudnametag.cpp b/indra/newview/llhudnametag.cpp new file mode 100644 index 0000000000..c099a3964b --- /dev/null +++ b/indra/newview/llhudnametag.cpp @@ -0,0 +1,1067 @@ +/** + * @file llhudnametag.cpp + * @brief Name tags for avatars + * @author James Cook + * + * $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 "llhudnametag.h" + +#include "llrender.h" + +#include "llagent.h" +#include "llviewercontrol.h" +#include "llcriticaldamp.h" +#include "lldrawable.h" +#include "llfontgl.h" +#include "llglheaders.h" +#include "llhudrender.h" +#include "llui.h" +#include "llviewercamera.h" +#include "llviewertexturelist.h" +#include "llviewerobject.h" +#include "llvovolume.h" +#include "llviewerwindow.h" +#include "llstatusbar.h" +#include "llmenugl.h" +#include "pipeline.h" +#include <boost/tokenizer.hpp> + + +const F32 SPRING_STRENGTH = 0.7f; +const F32 RESTORATION_SPRING_TIME_CONSTANT = 0.1f; +const F32 HORIZONTAL_PADDING = 16.f; +const F32 VERTICAL_PADDING = 12.f; +const F32 LINE_PADDING = 3.f; // aka "leading" +const F32 BUFFER_SIZE = 2.f; +const F32 MIN_EDGE_OVERLAP = 3.f; +const F32 HUD_TEXT_MAX_WIDTH = 190.f; +const F32 HUD_TEXT_MAX_WIDTH_NO_BUBBLE = 1000.f; +const F32 RESIZE_TIME = 0.f; +const S32 NUM_OVERLAP_ITERATIONS = 10; +const F32 NEIGHBOR_FORCE_FRACTION = 1.f; +const F32 POSITION_DAMPING_TC = 0.2f; +const F32 MAX_STABLE_CAMERA_VELOCITY = 0.1f; +const F32 LOD_0_SCREEN_COVERAGE = 0.15f; +const F32 LOD_1_SCREEN_COVERAGE = 0.30f; +const F32 LOD_2_SCREEN_COVERAGE = 0.40f; + +std::set<LLPointer<LLHUDNameTag> > LLHUDNameTag::sTextObjects; +std::vector<LLPointer<LLHUDNameTag> > LLHUDNameTag::sVisibleTextObjects; +BOOL LLHUDNameTag::sDisplayText = TRUE ; + +bool llhudnametag_further_away::operator()(const LLPointer<LLHUDNameTag>& lhs, const LLPointer<LLHUDNameTag>& rhs) const +{ + return lhs->getDistance() > rhs->getDistance(); +} + + +LLHUDNameTag::LLHUDNameTag(const U8 type) +: LLHUDObject(type), + mDoFade(TRUE), + mFadeDistance(8.f), + mFadeRange(4.f), + mLastDistance(0.f), + mZCompare(TRUE), + mVisibleOffScreen(FALSE), + mOffscreen(FALSE), +// mScale(), + mWidth(0.f), + mHeight(0.f), + mFontp(LLFontGL::getFontSansSerifSmall()), + mBoldFontp(LLFontGL::getFontSansSerifBold()), + mSoftScreenRect(), + mPositionAgent(), + mPositionOffset(), + mMass(10.f), + mMaxLines(10), + mOffsetY(0), + mRadius(0.1f), + mTextSegments(), + mLabelSegments(), + mTextAlignment(ALIGN_TEXT_CENTER), + mVertAlignment(ALIGN_VERT_CENTER), + mLOD(0), + mHidden(FALSE) +{ + LLPointer<LLHUDNameTag> ptr(this); + sTextObjects.insert(ptr); + + mColor = LLUIColorTable::instance().getColor("BackgroundChatColor"); +} + +LLHUDNameTag::~LLHUDNameTag() +{ +} + + +BOOL LLHUDNameTag::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render) +{ + if (!mVisible || mHidden) + { + return FALSE; + } + + // don't pick text that isn't bound to a viewerobject + if (!mSourceObject || mSourceObject->mDrawable.isNull()) + { + return FALSE; + } + + F32 alpha_factor = 1.f; + LLColor4 text_color = mColor; + if (mDoFade) + { + if (mLastDistance > mFadeDistance) + { + alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange); + text_color.mV[3] = text_color.mV[3]*alpha_factor; + } + } + if (text_color.mV[3] < 0.01f) + { + return FALSE; + } + + mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f)); + + // scale screen size of borders down + //RN: for now, text on hud objects is never occluded + + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); + + LLVector3 width_vec = mWidth * x_pixel_vec; + LLVector3 height_vec = mHeight * y_pixel_vec; + + LLCoordGL screen_pos; + LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); + + LLVector2 screen_offset; + screen_offset = updateScreenPos(mPositionOffset); + + LLVector3 render_position = mPositionAgent + + (x_pixel_vec * screen_offset.mV[VX]) + + (y_pixel_vec * screen_offset.mV[VY]); + + + //if (mUseBubble) + { + LLVector3 bg_pos = render_position + + (F32)mOffsetY * y_pixel_vec + - (width_vec / 2.f) + - (height_vec); + //LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]); + + LLVector3 v[] = + { + bg_pos, + bg_pos + width_vec, + bg_pos + width_vec + height_vec, + bg_pos + height_vec, + }; + + if (debug_render) + { + gGL.begin(LLRender::LINE_STRIP); + gGL.vertex3fv(v[0].mV); + gGL.vertex3fv(v[1].mV); + gGL.vertex3fv(v[2].mV); + gGL.vertex3fv(v[3].mV); + gGL.vertex3fv(v[0].mV); + gGL.vertex3fv(v[2].mV); + gGL.end(); + } + + LLVector3 dir = end-start; + F32 t = 0.f; + + if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, NULL, NULL, &t, FALSE) || + LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, NULL, NULL, &t, FALSE) ) + { + if (t <= 1.f) + { + intersection = start + dir*t; + return TRUE; + } + } + } + + return FALSE; +} + +void LLHUDNameTag::render() +{ + if (sDisplayText) + { + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); + renderText(FALSE); + } +} + +void LLHUDNameTag::renderForSelect() +{ + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); + renderText(TRUE); +} + +void LLHUDNameTag::renderText(BOOL for_select) +{ + if (!mVisible || mHidden) + { + return; + } + + // don't pick text that isn't bound to a viewerobject + if (for_select && + (!mSourceObject || mSourceObject->mDrawable.isNull())) + { + return; + } + + if (for_select) + { + gGL.getTexUnit(0)->disable(); + } + else + { + gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); + } + + LLGLState gls_blend(GL_BLEND, for_select ? FALSE : TRUE); + LLGLState gls_alpha(GL_ALPHA_TEST, for_select ? FALSE : TRUE); + + LLColor4 shadow_color(0.f, 0.f, 0.f, 1.f); + F32 alpha_factor = 1.f; + mColor = LLUIColorTable::instance().getColor("BackgroundChatColor"); + LLColor4 text_color = mColor; + if (mDoFade) + { + if (mLastDistance > mFadeDistance) + { + alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange); + text_color.mV[3] = text_color.mV[3]*alpha_factor; + } + } + if (text_color.mV[3] < 0.01f) + { + return; + } + shadow_color.mV[3] = text_color.mV[3]; + + mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f)); + + // *TODO: cache this image + LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Rect"); + + // *TODO: make this a per-text setting + LLColor4 bg_color = LLUIColorTable::instance().getColor("NameTagBackground"); + bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); + + // maybe a no-op? + //const S32 border_height = 16; + //const S32 border_width = 16; + const S32 border_height = 8; + const S32 border_width = 8; + + // *TODO move this into helper function + F32 border_scale = 1.f; + + if (border_height * 2 > mHeight) + { + border_scale = (F32)mHeight / ((F32)border_height * 2.f); + } + if (border_width * 2 > mWidth) + { + border_scale = llmin(border_scale, (F32)mWidth / ((F32)border_width * 2.f)); + } + + // scale screen size of borders down + //RN: for now, text on hud objects is never occluded + + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); + + LLVector2 border_scale_vec((F32)border_width / (F32)imagep->getTextureWidth(), (F32)border_height / (F32)imagep->getTextureHeight()); + LLVector3 width_vec = mWidth * x_pixel_vec; + LLVector3 height_vec = mHeight * y_pixel_vec; + LLVector3 scaled_border_width = (F32)llfloor(border_scale * (F32)border_width) * x_pixel_vec; + LLVector3 scaled_border_height = (F32)llfloor(border_scale * (F32)border_height) * y_pixel_vec; + + mRadius = (width_vec + height_vec).magVec() * 0.5f; + + LLCoordGL screen_pos; + LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); + + LLVector2 screen_offset; +// if (!mUseBubble) +// { +// screen_offset = mPositionOffset; +// } +// else +// { + screen_offset = updateScreenPos(mPositionOffset); +// } + + LLVector3 render_position = mPositionAgent + + (x_pixel_vec * screen_offset.mV[VX]) + + (y_pixel_vec * screen_offset.mV[VY]); + +// if (mUseBubble) + { + LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); + LLUI::pushMatrix(); + { + LLVector3 bg_pos = render_position + + (F32)mOffsetY * y_pixel_vec + - (width_vec / 2.f) + - (height_vec); + LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]); + + if (for_select) + { + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + S32 name = mSourceObject->mGLName; + LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name); + gGL.color4ubv(coloru.mV); + gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); + LLUI::popMatrix(); + return; + } + else + { + gGL.getTexUnit(0)->bind(imagep->getImage()); + + gGL.color4fv(bg_color.mV); + gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); + + if ( mLabelSegments.size()) + { + LLUI::pushMatrix(); + { + gGL.color4f(text_color.mV[VX], text_color.mV[VY], text_color.mV[VZ], gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); + LLVector3 label_height = (mFontp->getLineHeight() * mLabelSegments.size() + (VERTICAL_PADDING / 3.f)) * y_pixel_vec; + LLVector3 label_offset = height_vec - label_height; + LLUI::translate(label_offset.mV[VX], label_offset.mV[VY], label_offset.mV[VZ]); + gl_segmented_rect_3d_tex_top(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, label_height); + } + LLUI::popMatrix(); + } + } + + BOOL outside_width = llabs(mPositionOffset.mV[VX]) > mWidth * 0.5f; + BOOL outside_height = llabs(mPositionOffset.mV[VY] + (mVertAlignment == ALIGN_VERT_TOP ? mHeight * 0.5f : 0.f)) > mHeight * (mVertAlignment == ALIGN_VERT_TOP ? mHeight * 0.75f : 0.5f); + + // draw line segments pointing to parent object + if (!mOffscreen && (outside_width || outside_height)) + { + LLUI::pushMatrix(); + { + gGL.color4fv(bg_color.mV); + LLVector3 target_pos = -1.f * (mPositionOffset.mV[VX] * x_pixel_vec + mPositionOffset.mV[VY] * y_pixel_vec); + target_pos += (width_vec / 2.f); + target_pos += mVertAlignment == ALIGN_VERT_CENTER ? (height_vec * 0.5f) : LLVector3::zero; + target_pos -= 3.f * x_pixel_vec; + target_pos -= 6.f * y_pixel_vec; + LLUI::translate(target_pos.mV[VX], target_pos.mV[VY], target_pos.mV[VZ]); + gl_segmented_rect_3d_tex(border_scale_vec, 3.f * x_pixel_vec, 3.f * y_pixel_vec, 6.f * x_pixel_vec, 6.f * y_pixel_vec); + } + LLUI::popMatrix(); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE); + + LLVector3 box_center_offset; + box_center_offset = (width_vec * 0.5f) + (height_vec * 0.5f); + LLUI::translate(box_center_offset.mV[VX], box_center_offset.mV[VY], box_center_offset.mV[VZ]); + gGL.color4fv(bg_color.mV); + LLUI::setLineWidth(2.0); + gGL.begin(LLRender::LINES); + { + if (outside_width) + { + LLVector3 vert; + // draw line in x then y + if (mPositionOffset.mV[VX] < 0.f) + { + // start at right edge + vert = width_vec * 0.5f; + gGL.vertex3fv(vert.mV); + } + else + { + // start at left edge + vert = width_vec * -0.5f; + gGL.vertex3fv(vert.mV); + } + vert = -mPositionOffset.mV[VX] * x_pixel_vec; + gGL.vertex3fv(vert.mV); + gGL.vertex3fv(vert.mV); + vert -= mPositionOffset.mV[VY] * y_pixel_vec; + vert -= ((mVertAlignment == ALIGN_VERT_TOP) ? (height_vec * 0.5f) : LLVector3::zero); + gGL.vertex3fv(vert.mV); + } + else + { + LLVector3 vert; + // draw line in y then x + if (mPositionOffset.mV[VY] < 0.f) + { + // start at top edge + vert = (height_vec * 0.5f) - (mPositionOffset.mV[VX] * x_pixel_vec); + gGL.vertex3fv(vert.mV); + } + else + { + // start at bottom edge + vert = (height_vec * -0.5f) - (mPositionOffset.mV[VX] * x_pixel_vec); + gGL.vertex3fv(vert.mV); + } + vert = -mPositionOffset.mV[VY] * y_pixel_vec - mPositionOffset.mV[VX] * x_pixel_vec; + vert -= ((mVertAlignment == ALIGN_VERT_TOP) ? (height_vec * 0.5f) : LLVector3::zero); + gGL.vertex3fv(vert.mV); + } + } + gGL.end(); + LLUI::setLineWidth(1.0); + + } + } + LLUI::popMatrix(); + } + + F32 y_offset = (F32)mOffsetY; + + // Render label + { + gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); + + for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin(); + segment_iter != mLabelSegments.end(); ++segment_iter ) + { + // Label segments use default font + const LLFontGL* fontp = (segment_iter->mStyle == LLFontGL::BOLD) ? mBoldFontp : mFontp; + y_offset -= fontp->getLineHeight(); + + F32 x_offset; + if (mTextAlignment == ALIGN_TEXT_CENTER) + { + x_offset = -0.5f*segment_iter->getWidth(fontp); + } + else // ALIGN_LEFT + { + x_offset = -0.5f * mWidth + (HORIZONTAL_PADDING / 2.f); + } + + LLColor4 label_color(0.f, 0.f, 0.f, 1.f); + label_color.mV[VALPHA] = alpha_factor; + hud_render_text(segment_iter->getText(), render_position, *fontp, segment_iter->mStyle, LLFontGL::NO_SHADOW, x_offset, y_offset, label_color, FALSE); + } + } + + // Render text + { + // -1 mMaxLines means unlimited lines. + S32 start_segment; + S32 max_lines = getMaxLines(); + + if (max_lines < 0) + { + start_segment = 0; + } + else + { + start_segment = llmax((S32)0, (S32)mTextSegments.size() - max_lines); + } + + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin() + start_segment; + segment_iter != mTextSegments.end(); ++segment_iter ) + { + const LLFontGL* fontp = segment_iter->mFont; + y_offset -= fontp->getLineHeight(); + y_offset -= LINE_PADDING; + + U8 style = segment_iter->mStyle; + LLFontGL::ShadowType shadow = LLFontGL::DROP_SHADOW; + + F32 x_offset; + if (mTextAlignment== ALIGN_TEXT_CENTER) + { + x_offset = -0.5f*segment_iter->getWidth(fontp); + } + else // ALIGN_LEFT + { + x_offset = -0.5f * mWidth + (HORIZONTAL_PADDING / 2.f); + + // *HACK + x_offset += 1; + } + + text_color.mV[VALPHA] *= alpha_factor; + + hud_render_text(segment_iter->getText(), render_position, *fontp, style, shadow, x_offset, y_offset, text_color, FALSE); + } + } + /// Reset the default color to white. The renderer expects this to be the default. + gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); + if (for_select) + { + gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); + } +} + +void LLHUDNameTag::setString(const std::string &text_utf8) +{ + mTextSegments.clear(); + addLine(text_utf8, mColor); +} + +void LLHUDNameTag::clearString() +{ + mTextSegments.clear(); +} + + +void LLHUDNameTag::addLine(const std::string &text_utf8, + const LLColor4& color, + const LLFontGL::StyleFlags style, + const LLFontGL* font) +{ + LLWString wline = utf8str_to_wstring(text_utf8); + if (!wline.empty()) + { + // use default font for segment if custom font not specified + if (!font) + { + font = mFontp; + } + typedef boost::tokenizer<boost::char_separator<llwchar>, LLWString::const_iterator, LLWString > tokenizer; + LLWString seps(utf8str_to_wstring("\r\n")); + boost::char_separator<llwchar> sep(seps.c_str()); + + tokenizer tokens(wline, sep); + tokenizer::iterator iter = tokens.begin(); + + while (iter != tokens.end()) + { + U32 line_length = 0; + do + { + F32 max_pixels = HUD_TEXT_MAX_WIDTH; + S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); + LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); + mTextSegments.push_back(segment); + line_length += segment_length; + } + while (line_length != iter->size()); + ++iter; + } + } +} + +void LLHUDNameTag::setLabel(const std::string &label_utf8) +{ + mLabelSegments.clear(); + addLabel(label_utf8); +} + +void LLHUDNameTag::addLabel(const std::string& label_utf8) +{ + LLWString wstr = utf8string_to_wstring(label_utf8); + if (!wstr.empty()) + { + LLWString seps(utf8str_to_wstring("\r\n")); + LLWString empty; + + typedef boost::tokenizer<boost::char_separator<llwchar>, LLWString::const_iterator, LLWString > tokenizer; + boost::char_separator<llwchar> sep(seps.c_str(), empty.c_str(), boost::keep_empty_tokens); + + tokenizer tokens(wstr, sep); + tokenizer::iterator iter = tokens.begin(); + + while (iter != tokens.end()) + { + U32 line_length = 0; + do + { + S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), + HUD_TEXT_MAX_WIDTH, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); + LLHUDTextSegment segment(iter->substr(line_length, segment_length), LLFontGL::NORMAL, mColor, mFontp); + mLabelSegments.push_back(segment); + line_length += segment_length; + } + while (line_length != iter->size()); + ++iter; + } + } +} + +void LLHUDNameTag::setZCompare(const BOOL zcompare) +{ + mZCompare = zcompare; +} + +void LLHUDNameTag::setFont(const LLFontGL* font) +{ + mFontp = font; +} + + +void LLHUDNameTag::setColor(const LLColor4 &color) +{ + mColor = color; + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); + segment_iter != mTextSegments.end(); ++segment_iter ) + { + segment_iter->mColor = color; + } +} + +void LLHUDNameTag::setAlpha(F32 alpha) +{ + mColor.mV[VALPHA] = alpha; + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); + segment_iter != mTextSegments.end(); ++segment_iter ) + { + segment_iter->mColor.mV[VALPHA] = alpha; + } +} + + +void LLHUDNameTag::setDoFade(const BOOL do_fade) +{ + mDoFade = do_fade; +} + +void LLHUDNameTag::updateVisibility() +{ + if (mSourceObject) + { + mSourceObject->updateText(); + } + + mPositionAgent = gAgent.getPosAgentFromGlobal(mPositionGlobal); + + if (!mSourceObject) + { + //llwarns << "LLHUDNameTag::updateScreenPos -- mSourceObject is NULL!" << llendl; + mVisible = TRUE; + sVisibleTextObjects.push_back(LLPointer<LLHUDNameTag> (this)); + return; + } + + // Not visible if parent object is dead + if (mSourceObject->isDead()) + { + mVisible = FALSE; + return; + } + + // push text towards camera by radius of object, but not past camera + LLVector3 vec_from_camera = mPositionAgent - LLViewerCamera::getInstance()->getOrigin(); + LLVector3 dir_from_camera = vec_from_camera; + dir_from_camera.normVec(); + + if (dir_from_camera * LLViewerCamera::getInstance()->getAtAxis() <= 0.f) + { //text is behind camera, don't render + mVisible = FALSE; + return; + } + + if (vec_from_camera * LLViewerCamera::getInstance()->getAtAxis() <= LLViewerCamera::getInstance()->getNear() + 0.1f + mSourceObject->getVObjRadius()) + { + mPositionAgent = LLViewerCamera::getInstance()->getOrigin() + vec_from_camera * ((LLViewerCamera::getInstance()->getNear() + 0.1f) / (vec_from_camera * LLViewerCamera::getInstance()->getAtAxis())); + } + else + { + mPositionAgent -= dir_from_camera * mSourceObject->getVObjRadius(); + } + + mLastDistance = (mPositionAgent - LLViewerCamera::getInstance()->getOrigin()).magVec(); + + if (mLOD >= 3 || !mTextSegments.size() || (mDoFade && (mLastDistance > mFadeDistance + mFadeRange))) + { + mVisible = FALSE; + return; + } + + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); + + LLVector3 render_position = mPositionAgent + + (x_pixel_vec * mPositionOffset.mV[VX]) + + (y_pixel_vec * mPositionOffset.mV[VY]); + + mOffscreen = FALSE; + if (!LLViewerCamera::getInstance()->sphereInFrustum(render_position, mRadius)) + { + if (!mVisibleOffScreen) + { + mVisible = FALSE; + return; + } + else + { + mOffscreen = TRUE; + } + } + + mVisible = TRUE; + sVisibleTextObjects.push_back(LLPointer<LLHUDNameTag> (this)); +} + +LLVector2 LLHUDNameTag::updateScreenPos(LLVector2 &offset) +{ + LLCoordGL screen_pos; + LLVector2 screen_pos_vec; + LLVector3 x_pixel_vec; + LLVector3 y_pixel_vec; + LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); + LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); + if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen) + { + // bubble off-screen, so find a spot for it along screen edge + LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(world_pos, screen_pos); + } + + screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY); + + LLRect world_rect = gViewerWindow->getWorldViewRectScaled(); + S32 bottom = world_rect.mBottom + STATUS_BAR_HEIGHT; + + LLVector2 screen_center; + screen_center.mV[VX] = llclamp((F32)screen_pos_vec.mV[VX], (F32)world_rect.mLeft + mWidth * 0.5f, (F32)world_rect.mRight - mWidth * 0.5f); + + if(mVertAlignment == ALIGN_VERT_TOP) + { + screen_center.mV[VY] = llclamp((F32)screen_pos_vec.mV[VY], + (F32)bottom, + (F32)world_rect.mTop - mHeight - (F32)MENU_BAR_HEIGHT); + mSoftScreenRect.setLeftTopAndSize(screen_center.mV[VX] - (mWidth + BUFFER_SIZE) * 0.5f, + screen_center.mV[VY] + (mHeight + BUFFER_SIZE), mWidth + BUFFER_SIZE, mHeight + BUFFER_SIZE); + } + else + { + screen_center.mV[VY] = llclamp((F32)screen_pos_vec.mV[VY], + (F32)bottom + mHeight * 0.5f, + (F32)world_rect.mTop - mHeight * 0.5f - (F32)MENU_BAR_HEIGHT); + mSoftScreenRect.setCenterAndSize(screen_center.mV[VX], screen_center.mV[VY], mWidth + BUFFER_SIZE, mHeight + BUFFER_SIZE); + } + + return offset + (screen_center - LLVector2((F32)screen_pos.mX, (F32)screen_pos.mY)); +} + +void LLHUDNameTag::updateSize() +{ + F32 height = 0.f; + F32 width = 0.f; + + S32 max_lines = getMaxLines(); + //S32 lines = (max_lines < 0) ? (S32)mTextSegments.size() : llmin((S32)mTextSegments.size(), max_lines); + //F32 height = (F32)mFontp->getLineHeight() * (lines + mLabelSegments.size()); + + S32 start_segment; + if (max_lines < 0) start_segment = 0; + else start_segment = llmax((S32)0, (S32)mTextSegments.size() - max_lines); + + std::vector<LLHUDTextSegment>::iterator iter = mTextSegments.begin() + start_segment; + while (iter != mTextSegments.end()) + { + const LLFontGL* fontp = iter->mFont; + height += fontp->getLineHeight(); + height += LINE_PADDING; + width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH)); + ++iter; + } + + // Don't want line spacing under the last line + if (height > 0.f) + { + height -= LINE_PADDING; + } + + iter = mLabelSegments.begin(); + while (iter != mLabelSegments.end()) + { + height += mFontp->getLineHeight(); + width = llmax(width, llmin(iter->getWidth(mFontp), HUD_TEXT_MAX_WIDTH)); + ++iter; + } + + if (width == 0.f) + { + return; + } + + width += HORIZONTAL_PADDING; + height += VERTICAL_PADDING; + + // *TODO: Could do a timer-based resize here + //mWidth = llmax(width, lerp(mWidth, (F32)width, u)); + //mHeight = llmax(height, lerp(mHeight, (F32)height, u)); + mWidth = width; + mHeight = height; +} + +void LLHUDNameTag::updateAll() +{ + // iterate over all text objects, calculate their restoration forces, + // and add them to the visible set if they are on screen and close enough + sVisibleTextObjects.clear(); + + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDNameTag* textp = (*text_it); + textp->mTargetPositionOffset.clearVec(); + textp->updateSize(); + textp->updateVisibility(); + } + + // sort back to front for rendering purposes + std::sort(sVisibleTextObjects.begin(), sVisibleTextObjects.end(), llhudnametag_further_away()); + + // iterate from front to back, and set LOD based on current screen coverage + F32 screen_area = (F32)(gViewerWindow->getWindowWidthScaled() * gViewerWindow->getWindowHeightScaled()); + F32 current_screen_area = 0.f; + std::vector<LLPointer<LLHUDNameTag> >::reverse_iterator r_it; + for (r_it = sVisibleTextObjects.rbegin(); r_it != sVisibleTextObjects.rend(); ++r_it) + { + LLHUDNameTag* textp = (*r_it); +// if (textp->mUseBubble) +// { + if (current_screen_area / screen_area > LOD_2_SCREEN_COVERAGE) + { + textp->setLOD(3); + } + else if (current_screen_area / screen_area > LOD_1_SCREEN_COVERAGE) + { + textp->setLOD(2); + } + else if (current_screen_area / screen_area > LOD_0_SCREEN_COVERAGE) + { + textp->setLOD(1); + } + else + { + textp->setLOD(0); + } + textp->updateSize(); + // find on-screen position and initialize collision rectangle + textp->mTargetPositionOffset = textp->updateScreenPos(LLVector2::zero); + current_screen_area += (F32)(textp->mSoftScreenRect.getWidth() * textp->mSoftScreenRect.getHeight()); +// } + } + + LLStat* camera_vel_stat = LLViewerCamera::getInstance()->getVelocityStat(); + F32 camera_vel = camera_vel_stat->getCurrent(); + if (camera_vel > MAX_STABLE_CAMERA_VELOCITY) + { + return; + } + + VisibleTextObjectIterator src_it; + + for (S32 i = 0; i < NUM_OVERLAP_ITERATIONS; i++) + { + for (src_it = sVisibleTextObjects.begin(); src_it != sVisibleTextObjects.end(); ++src_it) + { + LLHUDNameTag* src_textp = (*src_it); + +// if (!src_textp->mUseBubble) +// { +// continue; +// } + VisibleTextObjectIterator dst_it = src_it; + ++dst_it; + for (; dst_it != sVisibleTextObjects.end(); ++dst_it) + { + LLHUDNameTag* dst_textp = (*dst_it); + +// if (!dst_textp->mUseBubble) +// { +// continue; +// } + if (src_textp->mSoftScreenRect.overlaps(dst_textp->mSoftScreenRect)) + { + LLRectf intersect_rect = src_textp->mSoftScreenRect; + intersect_rect.intersectWith(dst_textp->mSoftScreenRect); + intersect_rect.stretch(-BUFFER_SIZE * 0.5f); + + F32 src_center_x = src_textp->mSoftScreenRect.getCenterX(); + F32 src_center_y = src_textp->mSoftScreenRect.getCenterY(); + F32 dst_center_x = dst_textp->mSoftScreenRect.getCenterX(); + F32 dst_center_y = dst_textp->mSoftScreenRect.getCenterY(); + F32 intersect_center_x = intersect_rect.getCenterX(); + F32 intersect_center_y = intersect_rect.getCenterY(); + LLVector2 force = lerp(LLVector2(dst_center_x - intersect_center_x, dst_center_y - intersect_center_y), + LLVector2(intersect_center_x - src_center_x, intersect_center_y - src_center_y), + 0.5f); + force.setVec(dst_center_x - src_center_x, dst_center_y - src_center_y); + force.normVec(); + + LLVector2 src_force = -1.f * force; + LLVector2 dst_force = force; + + LLVector2 force_strength; + F32 src_mult = dst_textp->mMass / (dst_textp->mMass + src_textp->mMass); + F32 dst_mult = 1.f - src_mult; + F32 src_aspect_ratio = src_textp->mSoftScreenRect.getWidth() / src_textp->mSoftScreenRect.getHeight(); + F32 dst_aspect_ratio = dst_textp->mSoftScreenRect.getWidth() / dst_textp->mSoftScreenRect.getHeight(); + src_force.mV[VY] *= src_aspect_ratio; + src_force.normVec(); + dst_force.mV[VY] *= dst_aspect_ratio; + dst_force.normVec(); + + src_force.mV[VX] *= llmin(intersect_rect.getWidth() * src_mult, intersect_rect.getHeight() * SPRING_STRENGTH); + src_force.mV[VY] *= llmin(intersect_rect.getHeight() * src_mult, intersect_rect.getWidth() * SPRING_STRENGTH); + dst_force.mV[VX] *= llmin(intersect_rect.getWidth() * dst_mult, intersect_rect.getHeight() * SPRING_STRENGTH); + dst_force.mV[VY] *= llmin(intersect_rect.getHeight() * dst_mult, intersect_rect.getWidth() * SPRING_STRENGTH); + + src_textp->mTargetPositionOffset += src_force; + dst_textp->mTargetPositionOffset += dst_force; + src_textp->mTargetPositionOffset = src_textp->updateScreenPos(src_textp->mTargetPositionOffset); + dst_textp->mTargetPositionOffset = dst_textp->updateScreenPos(dst_textp->mTargetPositionOffset); + } + } + } + } + + VisibleTextObjectIterator this_object_it; + for (this_object_it = sVisibleTextObjects.begin(); this_object_it != sVisibleTextObjects.end(); ++this_object_it) + { +// if (!(*this_object_it)->mUseBubble) +// { +// continue; +// } + (*this_object_it)->mPositionOffset = lerp((*this_object_it)->mPositionOffset, (*this_object_it)->mTargetPositionOffset, LLCriticalDamp::getInterpolant(POSITION_DAMPING_TC)); + } +} + +void LLHUDNameTag::setLOD(S32 lod) +{ + mLOD = lod; + //RN: uncomment this to visualize LOD levels + //std::string label = llformat("%d", lod); + //setLabel(label); +} + +S32 LLHUDNameTag::getMaxLines() +{ + switch(mLOD) + { + case 0: + return mMaxLines; + case 1: + return mMaxLines > 0 ? mMaxLines / 2 : 5; + case 2: + return mMaxLines > 0 ? mMaxLines / 3 : 2; + default: + // label only + return 0; + } +} + +void LLHUDNameTag::markDead() +{ + sTextObjects.erase(LLPointer<LLHUDNameTag>(this)); + LLHUDObject::markDead(); +} + +void LLHUDNameTag::shiftAll(const LLVector3& offset) +{ + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDNameTag *textp = text_it->get(); + textp->shift(offset); + } +} + +void LLHUDNameTag::shift(const LLVector3& offset) +{ + mPositionAgent += offset; +} + +//static +void LLHUDNameTag::addPickable(std::set<LLViewerObject*> &pick_list) +{ + //this might put an object on the pick list a second time, overriding it's mGLName, which is ok + // *FIX: we should probably cull against pick frustum + VisibleTextObjectIterator text_it; + for (text_it = sVisibleTextObjects.begin(); text_it != sVisibleTextObjects.end(); ++text_it) + { +// if (!(*text_it)->mUseBubble) +// { +// continue; +// } + pick_list.insert((*text_it)->mSourceObject); + } +} + +//static +// called when UI scale changes, to flush font width caches +void LLHUDNameTag::reshape() +{ + TextObjectIterator text_it; + for (text_it = sTextObjects.begin(); text_it != sTextObjects.end(); ++text_it) + { + LLHUDNameTag* textp = (*text_it); + std::vector<LLHUDTextSegment>::iterator segment_iter; + for (segment_iter = textp->mTextSegments.begin(); + segment_iter != textp->mTextSegments.end(); ++segment_iter ) + { + segment_iter->clearFontWidthMap(); + } + for(segment_iter = textp->mLabelSegments.begin(); + segment_iter != textp->mLabelSegments.end(); ++segment_iter ) + { + segment_iter->clearFontWidthMap(); + } + } +} + +//============================================================================ + +F32 LLHUDNameTag::LLHUDTextSegment::getWidth(const LLFontGL* font) +{ + std::map<const LLFontGL*, F32>::iterator iter = mFontWidthMap.find(font); + if (iter != mFontWidthMap.end()) + { + return iter->second; + } + else + { + F32 width = font->getWidthF32(mText.c_str()); + mFontWidthMap[font] = width; + return width; + } +} diff --git a/indra/newview/llhudnametag.h b/indra/newview/llhudnametag.h new file mode 100644 index 0000000000..3325c22def --- /dev/null +++ b/indra/newview/llhudnametag.h @@ -0,0 +1,185 @@ +/** + * @file llhudnametag.h + * @brief Name tags for avatars + * @author James Cook + * + * $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 LLHUDNAMETAG_H +#define LLHUDNAMETAG_H + +#include "llpointer.h" + +#include "llhudobject.h" +#include "v4color.h" +//#include "v4coloru.h" +#include "v2math.h" +#include "llrect.h" +//#include "llframetimer.h" +#include "llfontgl.h" +#include <set> +#include <vector> + +class LLDrawable; +class LLHUDNameTag; + +struct llhudnametag_further_away +{ + bool operator()(const LLPointer<LLHUDNameTag>& lhs, const LLPointer<LLHUDNameTag>& rhs) const; +}; + +class LLHUDNameTag : public LLHUDObject +{ +protected: + class LLHUDTextSegment + { + public: + LLHUDTextSegment(const LLWString& text, const LLFontGL::StyleFlags style, const LLColor4& color, const LLFontGL* font) + : mColor(color), + mStyle(style), + mText(text), + mFont(font) + {} + F32 getWidth(const LLFontGL* font); + const LLWString& getText() const { return mText; } + void clearFontWidthMap() { mFontWidthMap.clear(); } + + LLColor4 mColor; + LLFontGL::StyleFlags mStyle; + const LLFontGL* mFont; + private: + LLWString mText; + std::map<const LLFontGL*, F32> mFontWidthMap; + }; + +public: + typedef enum e_text_alignment + { + ALIGN_TEXT_LEFT, + ALIGN_TEXT_CENTER + } ETextAlignment; + + typedef enum e_vert_alignment + { + ALIGN_VERT_TOP, + ALIGN_VERT_CENTER + } EVertAlignment; + +public: + // Set entire string, eliminating existing lines + void setString(const std::string& text_utf8); + + void clearString(); + + // Add text a line at a time, allowing custom formatting + void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL); + + // For bubble chat, set the part above the chat text + void setLabel(const std::string& label_utf8); + void addLabel(const std::string& label_utf8); + + // Sets the default font for lines with no font specified + void setFont(const LLFontGL* font); + void setColor(const LLColor4 &color); + void setAlpha(F32 alpha); + void setZCompare(const BOOL zcompare); + void setDoFade(const BOOL do_fade); + void setVisibleOffScreen(BOOL visible) { mVisibleOffScreen = visible; } + + // mMaxLines of -1 means unlimited lines. + void setMaxLines(S32 max_lines) { mMaxLines = max_lines; } + void setFadeDistance(F32 fade_distance, F32 fade_range) { mFadeDistance = fade_distance; mFadeRange = fade_range; } + void updateVisibility(); + LLVector2 updateScreenPos(LLVector2 &offset_target); + void updateSize(); +// void setMass(F32 mass) { mMass = llmax(0.1f, mass); } + void setTextAlignment(ETextAlignment alignment) { mTextAlignment = alignment; } + void setVertAlignment(EVertAlignment alignment) { mVertAlignment = alignment; } + /*virtual*/ void markDead(); + friend class LLHUDObject; + /*virtual*/ F32 getDistance() const { return mLastDistance; } + //void setUseBubble(BOOL use_bubble) { mUseBubble = use_bubble; } + S32 getLOD() { return mLOD; } + BOOL getVisible() { return mVisible; } + BOOL getHidden() const { return mHidden; } + void setHidden( BOOL hide ) { mHidden = hide; } + void shift(const LLVector3& offset); + + BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render = FALSE); + + static void shiftAll(const LLVector3& offset); + static void addPickable(std::set<LLViewerObject*> &pick_list); + static void reshape(); + static void setDisplayText(BOOL flag) { sDisplayText = flag ; } + +protected: + LLHUDNameTag(const U8 type); + + /*virtual*/ void render(); + /*virtual*/ void renderForSelect(); + void renderText(BOOL for_select); + static void updateAll(); + void setLOD(S32 lod); + S32 getMaxLines(); + +private: + ~LLHUDNameTag(); + BOOL mDoFade; + F32 mFadeRange; + F32 mFadeDistance; + F32 mLastDistance; + BOOL mZCompare; + BOOL mVisibleOffScreen; + BOOL mOffscreen; + LLColor4 mColor; +// LLVector3 mScale; + F32 mWidth; + F32 mHeight; +// LLColor4U mPickColor; + const LLFontGL* mFontp; + const LLFontGL* mBoldFontp; + LLRectf mSoftScreenRect; + LLVector3 mPositionAgent; + LLVector2 mPositionOffset; + LLVector2 mTargetPositionOffset; + F32 mMass; + S32 mMaxLines; + S32 mOffsetY; + F32 mRadius; + std::vector<LLHUDTextSegment> mTextSegments; + std::vector<LLHUDTextSegment> mLabelSegments; +// LLFrameTimer mResizeTimer; + ETextAlignment mTextAlignment; + EVertAlignment mVertAlignment; + S32 mLOD; + BOOL mHidden; + + static BOOL sDisplayText ; + static std::set<LLPointer<LLHUDNameTag> > sTextObjects; + static std::vector<LLPointer<LLHUDNameTag> > sVisibleTextObjects; +// static std::vector<LLPointer<LLHUDNameTag> > sVisibleHUDTextObjects; + typedef std::set<LLPointer<LLHUDNameTag> >::iterator TextObjectIterator; + typedef std::vector<LLPointer<LLHUDNameTag> >::iterator VisibleTextObjectIterator; +}; + +#endif diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp index 3e814a0773..5e762ee037 100644 --- a/indra/newview/llhudobject.cpp +++ b/indra/newview/llhudobject.cpp @@ -4,7 +4,7 @@ * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2002-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 @@ -24,9 +24,6 @@ * $/LicenseInfo$ */ -// llhudobject.cpp -// Copyright 2002, Linden Research, Inc. - #include "llviewerprecompiledheaders.h" #include "llhudobject.h" @@ -38,7 +35,7 @@ #include "llhudeffecttrail.h" #include "llhudeffectlookat.h" #include "llhudeffectpointat.h" - +#include "llhudnametag.h" #include "llvoicevisualizer.h" #include "llagent.h" @@ -66,7 +63,6 @@ LLHUDObject::LLHUDObject(const U8 type) : mVisible = TRUE; mType = type; mDead = FALSE; - mOnHUDAttachment = FALSE; } LLHUDObject::~LLHUDObject() @@ -145,6 +141,9 @@ LLHUDObject *LLHUDObject::addHUDObject(const U8 type) case LL_HUD_ICON: hud_objectp = new LLHUDIcon(type); break; + case LL_HUD_NAME_TAG: + hud_objectp = new LLHUDNameTag(type); + break; default: llwarns << "Unknown type of hud object:" << (U32) type << llendl; } @@ -257,6 +256,7 @@ void LLHUDObject::updateAll() LLFastTimer ftm(FTM_HUD_UPDATE); LLHUDText::updateAll(); LLHUDIcon::updateAll(); + LLHUDNameTag::updateAll(); sortObjects(); } @@ -284,7 +284,7 @@ void LLHUDObject::renderAll() } // static -void LLHUDObject::renderAllForSelect() +void LLHUDObject::renderAllForTimer() { LLHUDObject *hud_objp; @@ -299,30 +299,17 @@ void LLHUDObject::renderAllForSelect() } else if (hud_objp->isVisible()) { - hud_objp->renderForSelect(); + hud_objp->renderForTimer(); } } } // static -void LLHUDObject::renderAllForTimer() +void LLHUDObject::reshapeAll() { - LLHUDObject *hud_objp; - - hud_object_list_t::iterator object_it; - for (object_it = sHUDObjects.begin(); object_it != sHUDObjects.end(); ) - { - hud_object_list_t::iterator cur_it = object_it++; - hud_objp = (*cur_it); - if (hud_objp->getNumRefs() == 1) - { - sHUDObjects.erase(cur_it); - } - else if (hud_objp->isVisible()) - { - hud_objp->renderForTimer(); - } - } + // only hud objects that use fonts care about window size/scale changes + LLHUDText::reshape(); + LLHUDNameTag::reshape(); } // static diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h index 97145b9a84..33e6394445 100644 --- a/indra/newview/llhudobject.h +++ b/indra/newview/llhudobject.h @@ -36,7 +36,7 @@ #include "v4color.h" #include "v3math.h" #include "v3dmath.h" -#include "lldrawpool.h" +#include "lldrawpool.h" // TODO: eliminate, unused below #include <list> class LLViewerCamera; @@ -71,6 +71,9 @@ public: static void renderAllForSelect(); static void renderAllForTimer(); + // Some objects may need to update when window shape changes + static void reshapeAll(); + static void cleanupHUDObjects(); enum @@ -91,7 +94,8 @@ public: LL_HUD_EFFECT_EDIT, LL_HUD_EFFECT_LOOKAT, LL_HUD_EFFECT_POINTAT, - LL_HUD_EFFECT_VOICE_VISUALIZER // Ventrella + LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella + LL_HUD_NAME_TAG }; protected: static void sortObjects(); @@ -100,7 +104,6 @@ protected: ~LLHUDObject(); virtual void render() = 0; - virtual void renderForSelect() {}; virtual void renderForTimer() {}; protected: @@ -108,7 +111,6 @@ protected: BOOL mDead; BOOL mVisible; LLVector3d mPositionGlobal; - BOOL mOnHUDAttachment; LLPointer<LLViewerObject> mSourceObject; LLPointer<LLViewerObject> mTargetObject; diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 96638018c4..f7e5103d88 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -1,7 +1,6 @@ - /** * @file llhudtext.cpp - * @brief LLHUDText class implementation + * @brief Floating text above objects, set via script with llSetText() * * $LicenseInfo:firstyear=2002&license=viewerlgpl$ * Second Life Viewer Source Code @@ -56,16 +55,16 @@ const F32 HORIZONTAL_PADDING = 15.f; const F32 VERTICAL_PADDING = 12.f; const F32 BUFFER_SIZE = 2.f; const F32 MIN_EDGE_OVERLAP = 3.f; -F32 HUD_TEXT_MAX_WIDTH = 190.f; +const F32 HUD_TEXT_MAX_WIDTH = 190.f; const F32 HUD_TEXT_MAX_WIDTH_NO_BUBBLE = 1000.f; const F32 RESIZE_TIME = 0.f; const S32 NUM_OVERLAP_ITERATIONS = 10; const F32 NEIGHBOR_FORCE_FRACTION = 1.f; const F32 POSITION_DAMPING_TC = 0.2f; const F32 MAX_STABLE_CAMERA_VELOCITY = 0.1f; -const F32 LOD_0_SCREEN_COVERAGE = 0.15f; -const F32 LOD_1_SCREEN_COVERAGE = 0.30f; -const F32 LOD_2_SCREEN_COVERAGE = 0.40f; +//const F32 LOD_0_SCREEN_COVERAGE = 0.15f; +//const F32 LOD_1_SCREEN_COVERAGE = 0.30f; +//const F32 LOD_2_SCREEN_COVERAGE = 0.40f; std::set<LLPointer<LLHUDText> > LLHUDText::sTextObjects; std::vector<LLPointer<LLHUDText> > LLHUDText::sVisibleTextObjects; @@ -74,15 +73,14 @@ BOOL LLHUDText::sDisplayText = TRUE ; bool lltextobject_further_away::operator()(const LLPointer<LLHUDText>& lhs, const LLPointer<LLHUDText>& rhs) const { - return (lhs->getDistance() > rhs->getDistance()) ? true : false; + return lhs->getDistance() > rhs->getDistance(); } LLHUDText::LLHUDText(const U8 type) : LLHUDObject(type), - mUseBubble(FALSE), - mUsePixelSize(TRUE), - mVisibleOffScreen(FALSE), + mOnHUDAttachment(FALSE), +// mVisibleOffScreen(FALSE), mWidth(0.f), mHeight(0.f), mFontp(LLFontGL::getFontSansSerifSmall()), @@ -92,7 +90,7 @@ LLHUDText::LLHUDText(const U8 type) : mOffsetY(0), mTextAlignment(ALIGN_TEXT_CENTER), mVertAlignment(ALIGN_VERT_CENTER), - mLOD(0), +// mLOD(0), mHidden(FALSE) { mColor = LLColor4(1.f, 1.f, 1.f, 1.f); @@ -100,7 +98,6 @@ LLHUDText::LLHUDText(const U8 type) : mFadeDistance = 8.f; mFadeRange = 4.f; mZCompare = TRUE; - mDropShadow = TRUE; mOffscreen = FALSE; mRadius = 0.1f; LLPointer<LLHUDText> ptr(this); @@ -111,155 +108,26 @@ LLHUDText::~LLHUDText() { } - -BOOL LLHUDText::lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render) -{ - if (!mVisible || mHidden) - { - return FALSE; - } - - // don't pick text that isn't bound to a viewerobject or isn't in a bubble - if (!mSourceObject || mSourceObject->mDrawable.isNull() || !mUseBubble) - { - return FALSE; - } - - F32 alpha_factor = 1.f; - LLColor4 text_color = mColor; - if (mDoFade) - { - if (mLastDistance > mFadeDistance) - { - alpha_factor = llmax(0.f, 1.f - (mLastDistance - mFadeDistance)/mFadeRange); - text_color.mV[3] = text_color.mV[3]*alpha_factor; - } - } - if (text_color.mV[3] < 0.01f) - { - return FALSE; - } - - mOffsetY = lltrunc(mHeight * ((mVertAlignment == ALIGN_VERT_CENTER) ? 0.5f : 1.f)); - - // scale screen size of borders down - //RN: for now, text on hud objects is never occluded - - LLVector3 x_pixel_vec; - LLVector3 y_pixel_vec; - - if (mOnHUDAttachment) - { - x_pixel_vec = LLVector3::y_axis / (F32)gViewerWindow->getWindowWidthScaled(); - y_pixel_vec = LLVector3::z_axis / (F32)gViewerWindow->getWindowHeightScaled(); - } - else - { - LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); - } - - LLVector3 width_vec = mWidth * x_pixel_vec; - LLVector3 height_vec = mHeight * y_pixel_vec; - - LLCoordGL screen_pos; - LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); - - LLVector2 screen_offset; - screen_offset = updateScreenPos(mPositionOffset); - - LLVector3 render_position = mPositionAgent - + (x_pixel_vec * screen_offset.mV[VX]) - + (y_pixel_vec * screen_offset.mV[VY]); - - - if (mUseBubble) - { - LLVector3 bg_pos = render_position - + (F32)mOffsetY * y_pixel_vec - - (width_vec / 2.f) - - (height_vec); - //LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]); - - LLVector3 v[] = - { - bg_pos, - bg_pos + width_vec, - bg_pos + width_vec + height_vec, - bg_pos + height_vec, - }; - - if (debug_render) - { - gGL.begin(LLRender::LINE_STRIP); - gGL.vertex3fv(v[0].mV); - gGL.vertex3fv(v[1].mV); - gGL.vertex3fv(v[2].mV); - gGL.vertex3fv(v[3].mV); - gGL.vertex3fv(v[0].mV); - gGL.vertex3fv(v[2].mV); - gGL.end(); - } - - LLVector3 dir = end-start; - F32 t = 0.f; - - if (LLTriangleRayIntersect(v[0], v[1], v[2], start, dir, NULL, NULL, &t, FALSE) || - LLTriangleRayIntersect(v[2], v[3], v[0], start, dir, NULL, NULL, &t, FALSE) ) - { - if (t <= 1.f) - { - intersection = start + dir*t; - return TRUE; - } - } - } - - return FALSE; -} - void LLHUDText::render() { if (!mOnHUDAttachment && sDisplayText) { LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - renderText(FALSE); + renderText(); } } -void LLHUDText::renderForSelect() -{ - if (!mOnHUDAttachment) - { - LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - renderText(TRUE); - } -} - -void LLHUDText::renderText(BOOL for_select) +void LLHUDText::renderText() { if (!mVisible || mHidden) { return; } - // don't pick text that isn't bound to a viewerobject or isn't in a bubble - if (for_select && - (!mSourceObject || mSourceObject->mDrawable.isNull() || !mUseBubble)) - { - return; - } - - if (for_select) - { - gGL.getTexUnit(0)->disable(); - } - else - { - gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); - } + gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); - LLGLState gls_blend(GL_BLEND, for_select ? FALSE : TRUE); - LLGLState gls_alpha(GL_ALPHA_TEST, for_select ? FALSE : TRUE); + LLGLState gls_blend(GL_BLEND, TRUE); + LLGLState gls_alpha(GL_ALPHA_TEST, TRUE); LLColor4 shadow_color(0.f, 0.f, 0.f, 1.f); F32 alpha_factor = 1.f; @@ -284,7 +152,7 @@ void LLHUDText::renderText(BOOL for_select) LLUIImagePtr imagep = LLUI::getUIImage("Rounded_Square"); // *TODO: make this a per-text setting - LLColor4 bg_color = LLUIColorTable::instance().getColor("BackgroundChatColor"); + LLColor4 bg_color = LLUIColorTable::instance().getColor("ObjectBubbleColor"); bg_color.setAlpha(gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); const S32 border_height = 16; @@ -330,178 +198,17 @@ void LLHUDText::renderText(BOOL for_select) LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); LLVector2 screen_offset; - if (!mUseBubble) - { - screen_offset = mPositionOffset; - } - else - { - screen_offset = updateScreenPos(mPositionOffset); - } + screen_offset = mPositionOffset; LLVector3 render_position = mPositionAgent + (x_pixel_vec * screen_offset.mV[VX]) + (y_pixel_vec * screen_offset.mV[VY]); - //if (mOnHUD) - //{ - // render_position.mV[VY] -= fmodf(render_position.mV[VY], 1.f / (F32)gViewerWindow->getWindowWidthScaled()); - // render_position.mV[VZ] -= fmodf(render_position.mV[VZ], 1.f / (F32)gViewerWindow->getWindowHeightScaled()); - //} - //else - //{ - // render_position = LLViewerCamera::getInstance()->roundToPixel(render_position); - //} - - if (mUseBubble) - { - LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE); - LLUI::pushMatrix(); - { - LLVector3 bg_pos = render_position - + (F32)mOffsetY * y_pixel_vec - - (width_vec / 2.f) - - (height_vec); - LLUI::translate(bg_pos.mV[VX], bg_pos.mV[VY], bg_pos.mV[VZ]); - - if (for_select) - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - S32 name = mSourceObject->mGLName; - LLColor4U coloru((U8)(name >> 16), (U8)(name >> 8), (U8)name); - gGL.color4ubv(coloru.mV); - gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); - LLUI::popMatrix(); - return; - } - else - { - gGL.getTexUnit(0)->bind(imagep->getImage()); - - gGL.color4fv(bg_color.mV); - gl_segmented_rect_3d_tex(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, height_vec); - - if ( mLabelSegments.size()) - { - LLUI::pushMatrix(); - { - gGL.color4f(text_color.mV[VX], text_color.mV[VY], text_color.mV[VZ], gSavedSettings.getF32("ChatBubbleOpacity") * alpha_factor); - LLVector3 label_height = (mFontp->getLineHeight() * mLabelSegments.size() + (VERTICAL_PADDING / 3.f)) * y_pixel_vec; - LLVector3 label_offset = height_vec - label_height; - LLUI::translate(label_offset.mV[VX], label_offset.mV[VY], label_offset.mV[VZ]); - gl_segmented_rect_3d_tex_top(border_scale_vec, scaled_border_width, scaled_border_height, width_vec, label_height); - } - LLUI::popMatrix(); - } - } - - BOOL outside_width = llabs(mPositionOffset.mV[VX]) > mWidth * 0.5f; - BOOL outside_height = llabs(mPositionOffset.mV[VY] + (mVertAlignment == ALIGN_VERT_TOP ? mHeight * 0.5f : 0.f)) > mHeight * (mVertAlignment == ALIGN_VERT_TOP ? mHeight * 0.75f : 0.5f); - - // draw line segments pointing to parent object - if (!mOffscreen && (outside_width || outside_height)) - { - LLUI::pushMatrix(); - { - gGL.color4fv(bg_color.mV); - LLVector3 target_pos = -1.f * (mPositionOffset.mV[VX] * x_pixel_vec + mPositionOffset.mV[VY] * y_pixel_vec); - target_pos += (width_vec / 2.f); - target_pos += mVertAlignment == ALIGN_VERT_CENTER ? (height_vec * 0.5f) : LLVector3::zero; - target_pos -= 3.f * x_pixel_vec; - target_pos -= 6.f * y_pixel_vec; - LLUI::translate(target_pos.mV[VX], target_pos.mV[VY], target_pos.mV[VZ]); - gl_segmented_rect_3d_tex(border_scale_vec, 3.f * x_pixel_vec, 3.f * y_pixel_vec, 6.f * x_pixel_vec, 6.f * y_pixel_vec); - } - LLUI::popMatrix(); - - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - LLGLDepthTest gls_depth(mZCompare ? GL_TRUE : GL_FALSE, GL_FALSE); - - LLVector3 box_center_offset; - box_center_offset = (width_vec * 0.5f) + (height_vec * 0.5f); - LLUI::translate(box_center_offset.mV[VX], box_center_offset.mV[VY], box_center_offset.mV[VZ]); - gGL.color4fv(bg_color.mV); - LLUI::setLineWidth(2.0); - gGL.begin(LLRender::LINES); - { - if (outside_width) - { - LLVector3 vert; - // draw line in x then y - if (mPositionOffset.mV[VX] < 0.f) - { - // start at right edge - vert = width_vec * 0.5f; - gGL.vertex3fv(vert.mV); - } - else - { - // start at left edge - vert = width_vec * -0.5f; - gGL.vertex3fv(vert.mV); - } - vert = -mPositionOffset.mV[VX] * x_pixel_vec; - gGL.vertex3fv(vert.mV); - gGL.vertex3fv(vert.mV); - vert -= mPositionOffset.mV[VY] * y_pixel_vec; - vert -= ((mVertAlignment == ALIGN_VERT_TOP) ? (height_vec * 0.5f) : LLVector3::zero); - gGL.vertex3fv(vert.mV); - } - else - { - LLVector3 vert; - // draw line in y then x - if (mPositionOffset.mV[VY] < 0.f) - { - // start at top edge - vert = (height_vec * 0.5f) - (mPositionOffset.mV[VX] * x_pixel_vec); - gGL.vertex3fv(vert.mV); - } - else - { - // start at bottom edge - vert = (height_vec * -0.5f) - (mPositionOffset.mV[VX] * x_pixel_vec); - gGL.vertex3fv(vert.mV); - } - vert = -mPositionOffset.mV[VY] * y_pixel_vec - mPositionOffset.mV[VX] * x_pixel_vec; - vert -= ((mVertAlignment == ALIGN_VERT_TOP) ? (height_vec * 0.5f) : LLVector3::zero); - gGL.vertex3fv(vert.mV); - } - } - gGL.end(); - LLUI::setLineWidth(1.0); - - } - } - LLUI::popMatrix(); - } - F32 y_offset = (F32)mOffsetY; // Render label { gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); - - for(std::vector<LLHUDTextSegment>::iterator segment_iter = mLabelSegments.begin(); - segment_iter != mLabelSegments.end(); ++segment_iter ) - { - const LLFontGL* fontp = (segment_iter->mStyle == LLFontGL::BOLD) ? mBoldFontp : mFontp; - y_offset -= fontp->getLineHeight(); - - F32 x_offset; - if (mTextAlignment == ALIGN_TEXT_CENTER) - { - x_offset = -0.5f*segment_iter->getWidth(fontp); - } - else // ALIGN_LEFT - { - x_offset = -0.5f * mWidth + (HORIZONTAL_PADDING / 2.f); - } - - LLColor4 label_color(0.f, 0.f, 0.f, 1.f); - label_color.mV[VALPHA] = alpha_factor; - hud_render_text(segment_iter->getText(), render_position, *fontp, segment_iter->mStyle, LLFontGL::NO_SHADOW, x_offset, y_offset, label_color, mOnHUDAttachment); - } } // Render text @@ -522,15 +229,11 @@ void LLHUDText::renderText(BOOL for_select) for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin() + start_segment; segment_iter != mTextSegments.end(); ++segment_iter ) { - const LLFontGL* fontp = (segment_iter->mStyle == LLFontGL::BOLD) ? mBoldFontp : mFontp; + const LLFontGL* fontp = segment_iter->mFont; y_offset -= fontp->getLineHeight(); U8 style = segment_iter->mStyle; - LLFontGL::ShadowType shadow = LLFontGL::NO_SHADOW; - if (mDropShadow) - { - shadow = LLFontGL::DROP_SHADOW; - } + LLFontGL::ShadowType shadow = LLFontGL::DROP_SHADOW; F32 x_offset; if (mTextAlignment== ALIGN_TEXT_CENTER) @@ -550,21 +253,12 @@ void LLHUDText::renderText(BOOL for_select) } /// Reset the default color to white. The renderer expects this to be the default. gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f); - if (for_select) - { - gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE); - } } -void LLHUDText::setStringUTF8(const std::string &wtext) -{ - setString(utf8str_to_wstring(wtext)); -} - -void LLHUDText::setString(const LLWString &wtext) +void LLHUDText::setString(const std::string &text_utf8) { mTextSegments.clear(); - addLine(wtext, mColor); + addLine(text_utf8, mColor); } void LLHUDText::clearString() @@ -573,21 +267,19 @@ void LLHUDText::clearString() } -void LLHUDText::addLine(const std::string &str, const LLColor4& color, const LLFontGL::StyleFlags style) -{ - addLine(utf8str_to_wstring(str), color, style); -} - - -void LLHUDText::addLine(const LLWString &wstr, const LLColor4& color, const LLFontGL::StyleFlags style) +void LLHUDText::addLine(const std::string &text_utf8, + const LLColor4& color, + const LLFontGL::StyleFlags style, + const LLFontGL* font) { - if (gNoRender) + LLWString wline = utf8str_to_wstring(text_utf8); + if (!wline.empty()) { - return; - } - if (!wstr.empty()) - { - LLWString wline(wstr); + // use default font for segment if custom font not specified + if (!font) + { + font = mFontp; + } typedef boost::tokenizer<boost::char_separator<llwchar>, LLWString::const_iterator, LLWString > tokenizer; LLWString seps(utf8str_to_wstring("\r\n")); boost::char_separator<llwchar> sep(seps.c_str()); @@ -600,44 +292,10 @@ void LLHUDText::addLine(const LLWString &wstr, const LLColor4& color, const LLFo U32 line_length = 0; do { - S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), mUseBubble ? HUD_TEXT_MAX_WIDTH : HUD_TEXT_MAX_WIDTH_NO_BUBBLE, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); - mTextSegments.push_back(LLHUDTextSegment(iter->substr(line_length, segment_length), style, color)); - line_length += segment_length; - } - while (line_length != iter->size()); - ++iter; - } - } -} - -void LLHUDText::setLabel(const std::string &label) -{ - setLabel(utf8str_to_wstring(label)); -} - -void LLHUDText::setLabel(const LLWString &wlabel) -{ - mLabelSegments.clear(); - - if (!wlabel.empty()) - { - LLWString wstr(wlabel); - LLWString seps(utf8str_to_wstring("\r\n")); - LLWString empty; - - typedef boost::tokenizer<boost::char_separator<llwchar>, LLWString::const_iterator, LLWString > tokenizer; - boost::char_separator<llwchar> sep(seps.c_str(), empty.c_str(), boost::keep_empty_tokens); - - tokenizer tokens(wstr, sep); - tokenizer::iterator iter = tokens.begin(); - - while (iter != tokens.end()) - { - U32 line_length = 0; - do - { - S32 segment_length = mFontp->maxDrawableChars(iter->substr(line_length).c_str(), mUseBubble ? HUD_TEXT_MAX_WIDTH : HUD_TEXT_MAX_WIDTH_NO_BUBBLE, wstr.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); - mLabelSegments.push_back(LLHUDTextSegment(iter->substr(line_length, segment_length), LLFontGL::NORMAL, mColor)); + F32 max_pixels = HUD_TEXT_MAX_WIDTH_NO_BUBBLE; + S32 segment_length = font->maxDrawableChars(iter->substr(line_length).c_str(), max_pixels, wline.length(), LLFontGL::WORD_BOUNDARY_IF_POSSIBLE); + LLHUDTextSegment segment(iter->substr(line_length, segment_length), style, color, font); + mTextSegments.push_back(segment); line_length += segment_length; } while (line_length != iter->size()); @@ -646,11 +304,6 @@ void LLHUDText::setLabel(const LLWString &wlabel) } } -void LLHUDText::setDropShadow(const BOOL do_shadow) -{ - mDropShadow = do_shadow; -} - void LLHUDText::setZCompare(const BOOL zcompare) { mZCompare = zcompare; @@ -672,12 +325,17 @@ void LLHUDText::setColor(const LLColor4 &color) } } - -void LLHUDText::setUsePixelSize(const BOOL use_pixel_size) +void LLHUDText::setAlpha(F32 alpha) { - mUsePixelSize = use_pixel_size; + mColor.mV[VALPHA] = alpha; + for (std::vector<LLHUDTextSegment>::iterator segment_iter = mTextSegments.begin(); + segment_iter != mTextSegments.end(); ++segment_iter ) + { + segment_iter->mColor.mV[VALPHA] = alpha; + } } + void LLHUDText::setDoFade(const BOOL do_fade) { mDoFade = do_fade; @@ -745,7 +403,7 @@ void LLHUDText::updateVisibility() mLastDistance = (mPositionAgent - LLViewerCamera::getInstance()->getOrigin()).magVec(); - if (mLOD >= 3 || !mTextSegments.size() || (mDoFade && (mLastDistance > mFadeDistance + mFadeRange))) + if (!mTextSegments.size() || (mDoFade && (mLastDistance > mFadeDistance + mFadeRange))) { mVisible = FALSE; return; @@ -763,15 +421,15 @@ void LLHUDText::updateVisibility() mOffscreen = FALSE; if (!LLViewerCamera::getInstance()->sphereInFrustum(render_position, mRadius)) { - if (!mVisibleOffScreen) - { +// if (!mVisibleOffScreen) +// { mVisible = FALSE; return; - } - else - { - mOffscreen = TRUE; - } +// } +// else +// { +// mOffscreen = TRUE; +// } } mVisible = TRUE; @@ -786,11 +444,11 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset) LLVector3 y_pixel_vec; LLViewerCamera::getInstance()->getPixelVectors(mPositionAgent, y_pixel_vec, x_pixel_vec); LLVector3 world_pos = mPositionAgent + (offset.mV[VX] * x_pixel_vec) + (offset.mV[VY] * y_pixel_vec); - if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen) - { - // bubble off-screen, so find a spot for it along screen edge - LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(world_pos, screen_pos); - } +// if (!LLViewerCamera::getInstance()->projectPosAgentToScreen(world_pos, screen_pos, FALSE) && mVisibleOffScreen) +// { +// // bubble off-screen, so find a spot for it along screen edge +// LLViewerCamera::getInstance()->projectPosAgentToScreenEdge(world_pos, screen_pos); +// } screen_pos_vec.setVec((F32)screen_pos.mX, (F32)screen_pos.mY); @@ -821,12 +479,12 @@ LLVector2 LLHUDText::updateScreenPos(LLVector2 &offset) void LLHUDText::updateSize() { + F32 height = 0.f; F32 width = 0.f; S32 max_lines = getMaxLines(); - S32 lines = (max_lines < 0) ? (S32)mTextSegments.size() : llmin((S32)mTextSegments.size(), max_lines); - - F32 height = (F32)mFontp->getLineHeight() * (lines + mLabelSegments.size()); + //S32 lines = (max_lines < 0) ? (S32)mTextSegments.size() : llmin((S32)mTextSegments.size(), max_lines); + //F32 height = (F32)mFontp->getLineHeight() * (lines + mLabelSegments.size()); S32 start_segment; if (max_lines < 0) start_segment = 0; @@ -835,17 +493,12 @@ void LLHUDText::updateSize() std::vector<LLHUDTextSegment>::iterator iter = mTextSegments.begin() + start_segment; while (iter != mTextSegments.end()) { - width = llmax(width, llmin(iter->getWidth(mFontp), HUD_TEXT_MAX_WIDTH)); + const LLFontGL* fontp = iter->mFont; + height += fontp->getLineHeight(); + width = llmax(width, llmin(iter->getWidth(fontp), HUD_TEXT_MAX_WIDTH)); ++iter; } - iter = mLabelSegments.begin(); - while (iter != mLabelSegments.end()) - { - width = llmax(width, llmin(iter->getWidth(mFontp), HUD_TEXT_MAX_WIDTH)); - ++iter; - } - if (width == 0.f) { return; @@ -854,18 +507,8 @@ void LLHUDText::updateSize() width += HORIZONTAL_PADDING; height += VERTICAL_PADDING; - if (!mResizeTimer.getStarted() && (width != mWidth || height != mHeight)) - { - mResizeTimer.start(); - } - - // *NOTE: removed logic which did a divide by zero. - F32 u = 1.f;//llclamp(mResizeTimer.getElapsedTimeF32() / RESIZE_TIME, 0.f, 1.f); - if (u == 1.f) - { - mResizeTimer.stop(); - } - + // *TODO: Could do some sort of timer-based resize logic here + F32 u = 1.f; mWidth = llmax(width, lerp(mWidth, (F32)width, u)); mHeight = llmax(height, lerp(mHeight, (F32)height, u)); } @@ -889,146 +532,31 @@ void LLHUDText::updateAll() // sort back to front for rendering purposes std::sort(sVisibleTextObjects.begin(), sVisibleTextObjects.end(), lltextobject_further_away()); std::sort(sVisibleHUDTextObjects.begin(), sVisibleHUDTextObjects.end(), lltextobject_further_away()); - - // iterate from front to back, and set LOD based on current screen coverage - F32 screen_area = (F32)(gViewerWindow->getWindowWidthScaled() * gViewerWindow->getWindowHeightScaled()); - F32 current_screen_area = 0.f; - std::vector<LLPointer<LLHUDText> >::reverse_iterator r_it; - for (r_it = sVisibleTextObjects.rbegin(); r_it != sVisibleTextObjects.rend(); ++r_it) - { - LLHUDText* textp = (*r_it); - if (textp->mUseBubble) - { - if (current_screen_area / screen_area > LOD_2_SCREEN_COVERAGE) - { - textp->setLOD(3); - } - else if (current_screen_area / screen_area > LOD_1_SCREEN_COVERAGE) - { - textp->setLOD(2); - } - else if (current_screen_area / screen_area > LOD_0_SCREEN_COVERAGE) - { - textp->setLOD(1); - } - else - { - textp->setLOD(0); - } - textp->updateSize(); - // find on-screen position and initialize collision rectangle - textp->mTargetPositionOffset = textp->updateScreenPos(LLVector2::zero); - current_screen_area += (F32)(textp->mSoftScreenRect.getWidth() * textp->mSoftScreenRect.getHeight()); - } - } - - LLStat* camera_vel_stat = LLViewerCamera::getInstance()->getVelocityStat(); - F32 camera_vel = camera_vel_stat->getCurrent(); - if (camera_vel > MAX_STABLE_CAMERA_VELOCITY) - { - return; - } - - VisibleTextObjectIterator src_it; - - for (S32 i = 0; i < NUM_OVERLAP_ITERATIONS; i++) - { - for (src_it = sVisibleTextObjects.begin(); src_it != sVisibleTextObjects.end(); ++src_it) - { - LLHUDText* src_textp = (*src_it); - - if (!src_textp->mUseBubble) - { - continue; - } - VisibleTextObjectIterator dst_it = src_it; - ++dst_it; - for (; dst_it != sVisibleTextObjects.end(); ++dst_it) - { - LLHUDText* dst_textp = (*dst_it); - - if (!dst_textp->mUseBubble) - { - continue; - } - if (src_textp->mSoftScreenRect.overlaps(dst_textp->mSoftScreenRect)) - { - LLRectf intersect_rect = src_textp->mSoftScreenRect; - intersect_rect.intersectWith(dst_textp->mSoftScreenRect); - intersect_rect.stretch(-BUFFER_SIZE * 0.5f); - - F32 src_center_x = src_textp->mSoftScreenRect.getCenterX(); - F32 src_center_y = src_textp->mSoftScreenRect.getCenterY(); - F32 dst_center_x = dst_textp->mSoftScreenRect.getCenterX(); - F32 dst_center_y = dst_textp->mSoftScreenRect.getCenterY(); - F32 intersect_center_x = intersect_rect.getCenterX(); - F32 intersect_center_y = intersect_rect.getCenterY(); - LLVector2 force = lerp(LLVector2(dst_center_x - intersect_center_x, dst_center_y - intersect_center_y), - LLVector2(intersect_center_x - src_center_x, intersect_center_y - src_center_y), - 0.5f); - force.setVec(dst_center_x - src_center_x, dst_center_y - src_center_y); - force.normVec(); - - LLVector2 src_force = -1.f * force; - LLVector2 dst_force = force; - - LLVector2 force_strength; - F32 src_mult = dst_textp->mMass / (dst_textp->mMass + src_textp->mMass); - F32 dst_mult = 1.f - src_mult; - F32 src_aspect_ratio = src_textp->mSoftScreenRect.getWidth() / src_textp->mSoftScreenRect.getHeight(); - F32 dst_aspect_ratio = dst_textp->mSoftScreenRect.getWidth() / dst_textp->mSoftScreenRect.getHeight(); - src_force.mV[VY] *= src_aspect_ratio; - src_force.normVec(); - dst_force.mV[VY] *= dst_aspect_ratio; - dst_force.normVec(); - - src_force.mV[VX] *= llmin(intersect_rect.getWidth() * src_mult, intersect_rect.getHeight() * SPRING_STRENGTH); - src_force.mV[VY] *= llmin(intersect_rect.getHeight() * src_mult, intersect_rect.getWidth() * SPRING_STRENGTH); - dst_force.mV[VX] *= llmin(intersect_rect.getWidth() * dst_mult, intersect_rect.getHeight() * SPRING_STRENGTH); - dst_force.mV[VY] *= llmin(intersect_rect.getHeight() * dst_mult, intersect_rect.getWidth() * SPRING_STRENGTH); - - src_textp->mTargetPositionOffset += src_force; - dst_textp->mTargetPositionOffset += dst_force; - src_textp->mTargetPositionOffset = src_textp->updateScreenPos(src_textp->mTargetPositionOffset); - dst_textp->mTargetPositionOffset = dst_textp->updateScreenPos(dst_textp->mTargetPositionOffset); - } - } - } - } - - VisibleTextObjectIterator this_object_it; - for (this_object_it = sVisibleTextObjects.begin(); this_object_it != sVisibleTextObjects.end(); ++this_object_it) - { - if (!(*this_object_it)->mUseBubble) - { - continue; - } - (*this_object_it)->mPositionOffset = lerp((*this_object_it)->mPositionOffset, (*this_object_it)->mTargetPositionOffset, LLCriticalDamp::getInterpolant(POSITION_DAMPING_TC)); - } } -void LLHUDText::setLOD(S32 lod) -{ - mLOD = lod; - //RN: uncomment this to visualize LOD levels - //std::string label = llformat("%d", lod); - //setLabel(label); -} +//void LLHUDText::setLOD(S32 lod) +//{ +// mLOD = lod; +// //RN: uncomment this to visualize LOD levels +// //std::string label = llformat("%d", lod); +// //setLabel(label); +//} S32 LLHUDText::getMaxLines() { - switch(mLOD) - { - case 0: - return mMaxLines; - case 1: - return mMaxLines > 0 ? mMaxLines / 2 : 5; - case 2: - return mMaxLines > 0 ? mMaxLines / 3 : 2; - default: - // label only - return 0; - } + return mMaxLines; + //switch(mLOD) + //{ + //case 0: + // return mMaxLines; + //case 1: + // return mMaxLines > 0 ? mMaxLines / 2 : 5; + //case 2: + // return mMaxLines > 0 ? mMaxLines / 3 : 2; + //default: + // // label only + // return 0; + //} } void LLHUDText::markDead() @@ -1051,7 +579,7 @@ void LLHUDText::renderAllHUD() for (text_it = sVisibleHUDTextObjects.begin(); text_it != sVisibleHUDTextObjects.end(); ++text_it) { - (*text_it)->renderText(FALSE); + (*text_it)->renderText(); } } @@ -1079,22 +607,6 @@ void LLHUDText::shift(const LLVector3& offset) mPositionAgent += offset; } -//static -void LLHUDText::addPickable(std::set<LLViewerObject*> &pick_list) -{ - //this might put an object on the pick list a second time, overriding it's mGLName, which is ok - // *FIX: we should probably cull against pick frustum - VisibleTextObjectIterator text_it; - for (text_it = sVisibleTextObjects.begin(); text_it != sVisibleTextObjects.end(); ++text_it) - { - if (!(*text_it)->mUseBubble) - { - continue; - } - pick_list.insert((*text_it)->mSourceObject); - } -} - //static // called when UI scale changes, to flush font width caches void LLHUDText::reshape() @@ -1109,11 +621,6 @@ void LLHUDText::reshape() { segment_iter->clearFontWidthMap(); } - for(segment_iter = textp->mLabelSegments.begin(); - segment_iter != textp->mLabelSegments.end(); ++segment_iter ) - { - segment_iter->clearFontWidthMap(); - } } } diff --git a/indra/newview/llhudtext.h b/indra/newview/llhudtext.h index 4f4ee55a61..36015d51f0 100644 --- a/indra/newview/llhudtext.h +++ b/indra/newview/llhudtext.h @@ -28,18 +28,15 @@ #define LL_LLHUDTEXT_H #include "llpointer.h" -#include "lldarrayptr.h" #include "llhudobject.h" #include "v4color.h" #include "v4coloru.h" #include "v2math.h" #include "llrect.h" -#include "llframetimer.h" #include "llfontgl.h" #include <set> #include <vector> -#include "lldarray.h" // Renders a 2D text billboard floating at the location specified. class LLDrawable; @@ -56,14 +53,19 @@ protected: class LLHUDTextSegment { public: - LLHUDTextSegment(const LLWString& text, const LLFontGL::StyleFlags style, const LLColor4& color) - : mColor(color), mStyle(style), mText(text) {} + LLHUDTextSegment(const LLWString& text, const LLFontGL::StyleFlags style, const LLColor4& color, const LLFontGL* font) + : mColor(color), + mStyle(style), + mText(text), + mFont(font) + {} F32 getWidth(const LLFontGL* font); - const LLWString& getText() const { return mText; }; + const LLWString& getText() const { return mText; } void clearFontWidthMap() { mFontWidthMap.clear(); } LLColor4 mColor; LLFontGL::StyleFlags mStyle; + const LLFontGL* mFont; private: LLWString mText; std::map<const LLFontGL*, F32> mFontWidthMap; @@ -83,20 +85,21 @@ public: } EVertAlignment; public: - void setStringUTF8(const std::string &utf8string); - void setString(const LLWString &wstring); + // Set entire string, eliminating existing lines + void setString(const std::string& text_utf8); + void clearString(); - void addLine(const std::string &text, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL); - void addLine(const LLWString &wtext, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL); - void setLabel(const std::string &label); - void setLabel(const LLWString &label); - void setDropShadow(const BOOL do_shadow); + + // Add text a line at a time, allowing custom formatting + void addLine(const std::string &text_utf8, const LLColor4& color, const LLFontGL::StyleFlags style = LLFontGL::NORMAL, const LLFontGL* font = NULL); + + // Sets the default font for lines with no font specified void setFont(const LLFontGL* font); void setColor(const LLColor4 &color); - void setUsePixelSize(const BOOL use_pixel_size); + void setAlpha(F32 alpha); void setZCompare(const BOOL zcompare); void setDoFade(const BOOL do_fade); - void setVisibleOffScreen(BOOL visible) { mVisibleOffScreen = visible; } +// void setVisibleOffScreen(BOOL visible) { mVisibleOffScreen = visible; } // mMaxLines of -1 means unlimited lines. void setMaxLines(S32 max_lines) { mMaxLines = max_lines; } @@ -110,43 +113,34 @@ public: /*virtual*/ void markDead(); friend class LLHUDObject; /*virtual*/ F32 getDistance() const { return mLastDistance; } - void setUseBubble(BOOL use_bubble) { mUseBubble = use_bubble; } - S32 getLOD() { return mLOD; } BOOL getVisible() { return mVisible; } BOOL getHidden() const { return mHidden; } void setHidden( BOOL hide ) { mHidden = hide; } void setOnHUDAttachment(BOOL on_hud) { mOnHUDAttachment = on_hud; } void shift(const LLVector3& offset); - BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end, LLVector3& intersection, BOOL debug_render = FALSE); - static void shiftAll(const LLVector3& offset); static void renderAllHUD(); - static void addPickable(std::set<LLViewerObject*> &pick_list); static void reshape(); static void setDisplayText(BOOL flag) { sDisplayText = flag ; } + protected: LLHUDText(const U8 type); /*virtual*/ void render(); - /*virtual*/ void renderForSelect(); - void renderText(BOOL for_select); + void renderText(); static void updateAll(); - void setLOD(S32 lod); S32 getMaxLines(); private: ~LLHUDText(); - BOOL mOnHUD; - BOOL mUseBubble; - BOOL mDropShadow; + BOOL mOnHUDAttachment; BOOL mDoFade; F32 mFadeRange; F32 mFadeDistance; F32 mLastDistance; - BOOL mUsePixelSize; BOOL mZCompare; - BOOL mVisibleOffScreen; +// BOOL mVisibleOffScreen; BOOL mOffscreen; LLColor4 mColor; LLVector3 mScale; @@ -164,11 +158,8 @@ private: S32 mOffsetY; F32 mRadius; std::vector<LLHUDTextSegment> mTextSegments; - std::vector<LLHUDTextSegment> mLabelSegments; - LLFrameTimer mResizeTimer; ETextAlignment mTextAlignment; EVertAlignment mVertAlignment; - S32 mLOD; BOOL mHidden; static BOOL sDisplayText ; diff --git a/indra/newview/llhudview.cpp b/indra/newview/llhudview.cpp index 686bcfae1c..9a63e99357 100644 --- a/indra/newview/llhudview.cpp +++ b/indra/newview/llhudview.cpp @@ -50,7 +50,7 @@ const S32 HUD_ARROW_SIZE = 32; LLHUDView::LLHUDView(const LLRect& r) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_hud.xml"); + buildFromFile( "panel_hud.xml"); setShape(r, true); } diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index 658e9403d8..bdc0dfa7e2 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -32,6 +32,7 @@ #include "llagent.h" #include "llappviewer.h" +#include "llavatarnamecache.h" #include "llbutton.h" #include "llbottomtray.h" #include "llchannelmanager.h" @@ -251,14 +252,14 @@ BOOL LLIMFloater::postBuild() } mControlPanel->setSessionId(mSessionID); - mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel")); + mControlPanel->getParent()->setVisible(gSavedSettings.getBOOL("IMShowControlPanel")); LLButton* slide_left = getChild<LLButton>("slide_left_btn"); - slide_left->setVisible(mControlPanel->getVisible()); + slide_left->setVisible(mControlPanel->getParent()->getVisible()); slide_left->setClickedCallback(boost::bind(&LLIMFloater::onSlide, this)); LLButton* slide_right = getChild<LLButton>("slide_right_btn"); - slide_right->setVisible(!mControlPanel->getVisible()); + slide_right->setVisible(!mControlPanel->getParent()->getVisible()); slide_right->setClickedCallback(boost::bind(&LLIMFloater::onSlide, this)); mInputEditor = getChild<LLLineEditor>("chat_editor"); @@ -275,12 +276,6 @@ BOOL LLIMFloater::postBuild() mInputEditor->setReplaceNewlinesWithSpaces( FALSE ); mInputEditor->setPassDelete( TRUE ); - std::string session_name(LLIMModel::instance().getName(mSessionID)); - - mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + session_name); - - setTitle(session_name); - childSetCommitCallback("chat_editor", onSendMsg, this); mChatHistory = getChild<LLChatHistory>("chat_history"); @@ -298,6 +293,19 @@ BOOL LLIMFloater::postBuild() mInputEditor->setLabel(LLTrans::getString("IM_unavailable_text_label")); } + if ( im_session && im_session->isP2PSessionType()) + { + // look up display name for window title + LLAvatarNameCache::get(im_session->mOtherParticipantID, + boost::bind(&LLIMFloater::onAvatarNameCache, + this, _1, _2)); + } + else + { + std::string session_name(LLIMModel::instance().getName(mSessionID)); + updateSessionName(session_name, session_name); + } + //*TODO if session is not initialized yet, add some sort of a warning message like "starting session...blablabla" //see LLFloaterIMPanel for how it is done (IB) @@ -311,6 +319,23 @@ BOOL LLIMFloater::postBuild() } } +void LLIMFloater::updateSessionName(const std::string& ui_title, + const std::string& ui_label) +{ + mInputEditor->setLabel(LLTrans::getString("IM_to_label") + " " + ui_label); + setTitle(ui_title); +} + +void LLIMFloater::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) +{ + // Use display name only for labels, as the extended name will be in the + // floater title + std::string ui_title = av_name.getCompleteName(); + updateSessionName(ui_title, av_name.mDisplayName); + mTypingStart.setArg("[NAME]", ui_title); +} + // virtual void LLIMFloater::draw() { @@ -357,12 +382,12 @@ void* LLIMFloater::createPanelAdHocControl(void* userdata) void LLIMFloater::onSlide() { - mControlPanel->setVisible(!mControlPanel->getVisible()); + mControlPanel->getParent()->setVisible(!mControlPanel->getParent()->getVisible()); - gSavedSettings.setBOOL("IMShowControlPanel", mControlPanel->getVisible()); + gSavedSettings.setBOOL("IMShowControlPanel", mControlPanel->getParent()->getVisible()); - getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getVisible()); - getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getVisible()); + getChild<LLButton>("slide_left_btn")->setVisible(mControlPanel->getParent()->getVisible()); + getChild<LLButton>("slide_right_btn")->setVisible(!mControlPanel->getParent()->getVisible()); LLLayoutStack* stack = getChild<LLLayoutStack>("im_panels"); if (stack) stack->setAnimate(true); @@ -655,8 +680,6 @@ void LLIMFloater::updateMessages() if (messages.size()) { -// LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor"); - LLSD chat_args; chat_args["use_plain_text_chat_history"] = use_plain_text_chat_history; @@ -1071,13 +1094,9 @@ void LLIMFloater::addTypingIndicator(const LLIMInfo* im_info) { mOtherTyping = true; - // Create typing is started title string - LLUIString typing_start(mTypingStart); - typing_start.setArg("[NAME]", im_info->mName); - // Save and set new title mSavedTitle = getTitle(); - setTitle (typing_start); + setTitle (mTypingStart); // Update speaker LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(mSessionID); diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h index e604623b1b..e80e45e64a 100644 --- a/indra/newview/llimfloater.h +++ b/indra/newview/llimfloater.h @@ -32,6 +32,7 @@ #include "lltooldraganddrop.h" #include "lltransientdockablefloater.h" +class LLAvatarName; class LLLineEditor; class LLPanelChatControlPanel; class LLChatHistory; @@ -124,6 +125,12 @@ private: /* virtual */ void onFocusLost(); /* virtual */ void onFocusReceived(); + // Update the window title, input field help text, etc. + void updateSessionName(const std::string& ui_title, const std::string& ui_label); + + // For display name lookups for IM window titles + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); + BOOL dropCallingCard(LLInventoryItem* item, BOOL drop); BOOL dropCategory(LLInventoryCategory* category, BOOL drop); diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp index 5bbab1f092..33cb3a54a7 100644 --- a/indra/newview/llimfloatercontainer.cpp +++ b/indra/newview/llimfloatercontainer.cpp @@ -94,9 +94,9 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp, if(gAgent.isInGroup(session_id, TRUE)) { - LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>(); + LLGroupIconCtrl::Params icon_params; icon_params.group_id = session_id; - icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params); + icon = LLUICtrlFactory::instance().create<LLGroupIconCtrl>(icon_params); mSessions[session_id] = floaterp; floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); @@ -105,9 +105,9 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp, { LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id); - LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>(); + LLAvatarIconCtrl::Params icon_params; icon_params.avatar_id = avatar_id; - icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params); + icon = LLUICtrlFactory::instance().create<LLAvatarIconCtrl>(icon_params); mSessions[session_id] = floaterp; floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id)); diff --git a/indra/newview/llimhandler.cpp b/indra/newview/llimhandler.cpp index bc76092a20..cd71da7393 100644 --- a/indra/newview/llimhandler.cpp +++ b/indra/newview/llimhandler.cpp @@ -115,7 +115,7 @@ bool LLIMHandler::processNotification(const LLSD& notify) { mChannel->killToastByNotificationID(notification->getID()); } - return true; + return false; } //-------------------------------------------------------------------------- diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 493398c68a..3578c98622 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -28,6 +28,7 @@ #include "llimview.h" +#include "llavatarnamecache.h" // IDEVO #include "llfloaterreg.h" #include "llfontgl.h" #include "llgl.h" @@ -64,11 +65,6 @@ #include "llviewerparcelmgr.h" -const static std::string IM_TIME("time"); -const static std::string IM_TEXT("message"); -const static std::string IM_FROM("from"); -const static std::string IM_FROM_ID("from_id"); - const static std::string ADHOC_NAME_SUFFIX(" Conference"); const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other"); @@ -101,6 +97,20 @@ BOOL LLSessionTimeoutTimer::tick() return TRUE; } +static void on_avatar_name_cache_toast(const LLUUID& agent_id, + const LLAvatarName& av_name, + LLSD msg) +{ + LLSD args; + args["MESSAGE"] = msg["message"]; + args["TIME"] = msg["time"]; + // *TODO: Can this ever be an object name or group name? + args["FROM"] = av_name.getCompleteName(); + args["FROM_ID"] = msg["from_id"]; + args["SESSION_ID"] = msg["session_id"]; + LLNotificationsUtil::add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID())); +} + void toast_callback(const LLSD& msg){ // do not show toast in busy mode or it goes from agent if (gAgent.getBusy() || gAgent.getID() == msg["from_id"]) @@ -121,6 +131,20 @@ void toast_callback(const LLSD& msg){ return; } + // *NOTE Skip toasting if the user disable it in preferences/debug settings ~Alexandrea + LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( + msg["session_id"]); + if (!gSavedSettings.getBOOL("EnableGroupChatPopups") + && session->isGroupSessionType()) + { + return; + } + if (!gSavedSettings.getBOOL("EnableIMChatPopups") + && !session->isGroupSessionType()) + { + return; + } + // Skip toasting if we have open window of IM with this session id LLIMFloater* open_im_floater = LLIMFloater::findInstance(msg["session_id"]); if (open_im_floater && open_im_floater->getVisible()) @@ -128,14 +152,9 @@ void toast_callback(const LLSD& msg){ return; } - LLSD args; - args["MESSAGE"] = msg["message"]; - args["TIME"] = msg["time"]; - args["FROM"] = msg["from"]; - args["FROM_ID"] = msg["from_id"]; - args["SESSION_ID"] = msg["session_id"]; - - LLNotificationsUtil::add("IMToast", args, LLSD(), boost::bind(&LLIMFloater::show, msg["session_id"].asUUID())); + LLAvatarNameCache::get(msg["from_id"].asUUID(), + boost::bind(&on_avatar_name_cache_toast, + _1, _2, msg)); } void LLIMModel::setActiveSessionID(const LLUUID& session_id) @@ -252,21 +271,17 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& // history files have consistent (English) names in different locales. if (isAdHocSessionType() && IM_SESSION_INVITE == type) { - // Name here has a form of "<Avatar's name> Conference" - // Lets update it to localize the "Conference" word. See EXT-8429. - S32 separator_index = mName.rfind(" "); - std::string name = mName.substr(0, separator_index); - ++separator_index; - std::string conference_word = mName.substr(separator_index, mName.length()); + LLAvatarNameCache::get(mOtherParticipantID, + boost::bind(&LLIMModel::LLIMSession::onAdHocNameCache, + this, _2)); + } +} - // additional check that session name is what we expected - if ("Conference" == conference_word) - { +void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name) +{ LLStringUtil::format_map_t args; - args["[AGENT_NAME]"] = name; + args["[AGENT_NAME]"] = av_name.getCompleteName(); LLTrans::findString(mName, "conference-title-incoming", args); - } - } } void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction) @@ -283,7 +298,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES // no text notifications break; case P2P_SESSION: - gCacheName->getFullName(mOtherParticipantID, other_avatar_name); + gCacheName->getFullName(mOtherParticipantID, other_avatar_name); // voice if(direction == LLVoiceChannel::INCOMING_CALL) { @@ -418,12 +433,17 @@ void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& histo const LLSD& msg = *it; std::string from = msg[IM_FROM]; - LLUUID from_id = LLUUID::null; - if (msg[IM_FROM_ID].isUndefined()) + LLUUID from_id; + if (msg[IM_FROM_ID].isDefined()) { - gCacheName->getUUID(from, from_id); + from_id = msg[IM_FROM_ID].asUUID(); + } + else + { + // convert it to a legacy name if we have a complete name + std::string legacy_name = gCacheName->buildLegacyName(from); + gCacheName->getUUID(legacy_name, from_id); } - std::string timestamp = msg[IM_TIME]; std::string text = msg[IM_TEXT]; @@ -495,6 +515,11 @@ LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const uuid_vec_t& ids) return NULL; } +bool LLIMModel::LLIMSession::isOutgoingAdHoc() +{ + return IM_SESSION_CONFERENCE_START == mType; +} + bool LLIMModel::LLIMSession::isAdHoc() { return IM_SESSION_CONFERENCE_START == mType || (IM_SESSION_INVITE == mType && !gAgent.isInGroup(mSessionID)); @@ -510,6 +535,19 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline() return !mOtherParticipantIsAvatar; } +void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name) +{ + if (av_name.mUsername.empty()) + { + // display names is off, use mDisplayName which will be the legacy name + mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName); + } + else + { + mHistoryFileName = av_name.mUsername; + } +} + void LLIMModel::LLIMSession::buildHistoryFileName() { mHistoryFileName = mName; @@ -528,6 +566,12 @@ void LLIMModel::LLIMSession::buildHistoryFileName() //in case of incoming ad-hoc sessions mHistoryFileName = mName + " " + LLLogChat::timestamp(true) + " " + mSessionID.asString().substr(0, 4); } + + // look up username to use as the log name + if (isP2P()) + { + LLAvatarNameCache::get(mOtherParticipantID, boost::bind(&LLIMModel::LLIMSession::onAvatarNameCache, this, _1, _2)); + } } //static @@ -622,7 +666,10 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice); mId2SessionMap[session_id] = session; - LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id); + // When notifying observer, name of session is used instead of "name", because they may not be the + // same if it is an adhoc session (in this case name is localized in LLIMSession constructor). + std::string session_name = LLIMModel::getInstance()->getName(session_id); + LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, session_name, other_participant_id); return true; @@ -708,8 +755,18 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, bool LLIMModel::logToFile(const std::string& file_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) { if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) - { - LLLogChat::saveHistory(file_name, from, from_id, utf8_text); + { + std::string from_name = from; + + LLAvatarName av_name; + if (!from_id.isNull() && + LLAvatarNameCache::get(from_id, &av_name) && + !av_name.mIsDisplayNameDefault) + { + from_name = av_name.getCompleteName(); + } + + LLLogChat::saveHistory(file_name, from_name, from_id, utf8_text); return true; } else @@ -1020,33 +1077,44 @@ void LLIMModel::sendMessage(const std::string& utf8_text, if( session == 0)//??? shouldn't really happen { LLRecentPeople::instance().add(other_participant_id); + return; } - else + // IM_SESSION_INVITE means that this is an Ad-hoc incoming chat + // (it can be also Group chat but it is checked above) + // In this case mInitialTargetIDs contains Ad-hoc session ID and it should not be added + // to Recent People to prevent showing of an item with (???)(???). See EXT-8246. + // Concrete participants will be added into this list once they sent message in chat. + if (IM_SESSION_INVITE == dialog) return; + + if (IM_SESSION_CONFERENCE_START == dialog) // outgoing ad-hoc session { - // IM_SESSION_INVITE means that this is an Ad-hoc incoming chat - // (it can be also Group chat but it is checked above) - // In this case mInitialTargetIDs contains Ad-hoc session ID and it should not be added - // to Recent People to prevent showing of an item with (???)(???). See EXT-8246. - // Concrete participants will be added into this list once they sent message in chat. - if (IM_SESSION_INVITE == dialog) return; - - // Add only online members to recent (EXT-8658) - LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id); - LLSpeakerMgr::speaker_list_t speaker_list; - if(speaker_mgr != NULL) - { - speaker_mgr->getSpeakerList(&speaker_list, true); - } - for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) + // Add only online members of conference to recent list (EXT-8658) + addSpeakersToRecent(im_session_id); + } + else // outgoing P2P session + { + // Add the recepient of the session. + if (!session->mInitialTargetIDs.empty()) { - const LLPointer<LLSpeaker>& speakerp = *it; - - LLRecentPeople::instance().add(speakerp->mID); + LLRecentPeople::instance().add(*(session->mInitialTargetIDs.begin())); } } } +} - +void LLIMModel::addSpeakersToRecent(const LLUUID& im_session_id) +{ + LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id); + LLSpeakerMgr::speaker_list_t speaker_list; + if(speaker_mgr != NULL) + { + speaker_mgr->getSpeakerList(&speaker_list, true); + } + for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++) + { + const LLPointer<LLSpeaker>& speakerp = *it; + LLRecentPeople::instance().add(speakerp->mID); + } } void session_starter_helper( @@ -1755,11 +1823,23 @@ void LLOutgoingCallDialog::show(const LLSD& key) callee_name = LLTextUtil::formatPhoneNumber(callee_name); } - setTitle(callee_name); - LLSD callee_id = mPayload["other_user_id"]; - getChild<LLUICtrl>("calling")->setTextArg("[CALLEE_NAME]", callee_name); - getChild<LLUICtrl>("connecting")->setTextArg("[CALLEE_NAME]", callee_name); + // Beautification: Since you know who you called, just show display name + std::string title = callee_name; + std::string final_callee_name = callee_name; + if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION) + { + LLAvatarName av_name; + if (LLAvatarNameCache::get(callee_id, &av_name)) + { + final_callee_name = av_name.mDisplayName; + title = av_name.getCompleteName(); + } + } + getChild<LLUICtrl>("calling")->setTextArg("[CALLEE_NAME]", final_callee_name); + getChild<LLUICtrl>("connecting")->setTextArg("[CALLEE_NAME]", final_callee_name); + + setTitle(title); // for outgoing group calls callee_id == group id == session id setIcon(callee_id, callee_id); @@ -1914,16 +1994,21 @@ BOOL LLIncomingCallDialog::postBuild() if (caller_name == "anonymous") { caller_name = getString("anonymous"); + setCallerName(caller_name, caller_name, call_type); } else if (!is_avatar) { caller_name = LLTextUtil::formatPhoneNumber(caller_name); + setCallerName(caller_name, caller_name, call_type); + } + else + { + // Get the full name information + LLAvatarNameCache::get(caller_id, + boost::bind(&LLIncomingCallDialog::onAvatarNameCache, + this, _1, _2, call_type)); } - setTitle(caller_name + " " + call_type); - - LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name"); - caller_name_widget->setValue(caller_name + " " + call_type); setIcon(session_id, caller_id); childSetAction("Accept", onAccept, this); @@ -1951,6 +2036,24 @@ BOOL LLIncomingCallDialog::postBuild() return TRUE; } +void LLIncomingCallDialog::setCallerName(const std::string& ui_title, + const std::string& ui_label, + const std::string& call_type) +{ + setTitle(ui_title); + + // call_type may be a string like " is calling." + LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name"); + caller_name_widget->setValue(ui_label + " " + call_type); +} + +void LLIncomingCallDialog::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name, + const std::string& call_type) +{ + std::string title = av_name.getCompleteName(); + setCallerName(title, av_name.mDisplayName, call_type); +} void LLIncomingCallDialog::onOpen(const LLSD& key) { @@ -2058,8 +2161,11 @@ void LLIncomingCallDialog::processCallResponse(S32 response) } else { - if (gCacheName->getFullName(caller_id, correct_session_name)) + // *NOTE: really should be using callbacks here + LLAvatarName av_name; + if (LLAvatarNameCache::get(caller_id, &av_name)) { + correct_session_name = av_name.mDisplayName + " (" + av_name.mUsername + ")"; correct_session_name.append(ADHOC_NAME_SUFFIX); } } @@ -2580,7 +2686,8 @@ void LLIMMgr::inviteToSession( { if (caller_name.empty()) { - gCacheName->get(caller_id, FALSE, boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3, _4)); + gCacheName->get(caller_id, false, // voice + boost::bind(&LLIMMgr::onInviteNameLookup, payload, _1, _2, _3)); } else { @@ -2590,9 +2697,9 @@ void LLIMMgr::inviteToSession( } } -void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +void LLIMMgr::onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& name, bool is_group) { - payload["caller_name"] = first + " " + last; + payload["caller_name"] = name; payload["session_name"] = payload["caller_name"].asString(); std::string notify_box_type = payload["notify_box_type"].asString(); @@ -2813,13 +2920,14 @@ void LLIMMgr::noteOfflineUsers( for(S32 i = 0; i < count; ++i) { info = at.getBuddyInfo(ids.get(i)); - std::string first, last; - if(info && !info->isOnline() - && gCacheName->getName(ids.get(i), first, last)) + LLAvatarName av_name; + if (info + && !info->isOnline() + && LLAvatarNameCache::get(ids.get(i), &av_name)) { LLUIString offline = LLTrans::getString("offline_message"); - offline.setArg("[FIRST]", first); - offline.setArg("[LAST]", last); + // Use display name only because this user is your friend + offline.setArg("[NAME]", av_name.mDisplayName); im_model.proccessOnlineOfflineNotification(session_id, offline); } } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index ba8c7ae489..3f72d66bfb 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -35,7 +35,7 @@ #include "llvoicechannel.h" - +class LLAvatarName; class LLFriendObserver; class LLCallDialogManager; class LLIMSpeakerMgr; @@ -62,7 +62,7 @@ class LLIMModel : public LLSingleton<LLIMModel> { public: - struct LLIMSession + struct LLIMSession : public boost::signals2::trackable { typedef enum e_session_type { // for now we have 4 predefined types for a session @@ -84,6 +84,7 @@ public: /** @deprecated */ static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata); + bool isOutgoingAdHoc(); bool isAdHoc(); bool isP2P(); bool isOtherParticipantAvaline(); @@ -97,6 +98,10 @@ public: /** ad-hoc sessions involve sophisticated chat history file naming schemes */ void buildHistoryFileName(); + void onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name); + + void onAdHocNameCache(const LLAvatarName& av_name);
+ //*TODO make private static std::string generateHash(const std::set<LLUUID>& sorted_uuids); @@ -273,6 +278,9 @@ public: static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id, const LLUUID& other_participant_id, EInstantMessage dialog); + // Adds people from speakers list (people with whom you are currently speaking) to the Recent People List + static void addSpeakersToRecent(const LLUUID& im_session_id); + void testMessages(); /** @@ -453,7 +461,7 @@ private: void processIMTypingCore(const LLIMInfo* im_info, BOOL typing); - static void onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + static void onInviteNameLookup(LLSD payload, const LLUUID& id, const std::string& name, bool is_group); void notifyObserverSessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id); void notifyObserverSessionRemoved(const LLUUID& session_id); @@ -535,6 +543,13 @@ public: static void onStartIM(void* user_data); private: + void setCallerName(const std::string& ui_title, + const std::string& ui_label, + const std::string& call_type); + void onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name, + const std::string& call_type); + /*virtual*/ void onLifetimeExpired(); void processCallResponse(S32 response); }; diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp index b367d68b02..91ede6d221 100644 --- a/indra/newview/llinspectavatar.cpp +++ b/indra/newview/llinspectavatar.cpp @@ -31,6 +31,7 @@ #include "llagent.h" #include "llagentdata.h" #include "llavataractions.h" +#include "llavatarnamecache.h" #include "llavatarpropertiesprocessor.h" #include "llcallingcard.h" #include "lldateutil.h" @@ -51,6 +52,8 @@ #include "llfloater.h" #include "llfloaterreg.h" #include "llmenubutton.h" +#include "lltextbox.h" +#include "lltoggleablemenu.h" #include "lltooltip.h" // positionViewNearMouse() #include "lltrans.h" #include "lluictrl.h" @@ -137,17 +140,13 @@ private: // Is used to determine if "Add friend" option should be enabled in gear menu bool isNotFriend(); - // Callback for gCacheName to look up avatar name - void nameUpdatedCallback( - const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group); + void onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name); private: LLUUID mAvatarID; // Need avatar name information to spawn friend add request - std::string mAvatarName; + LLAvatarName mAvatarName; // an in-flight request for avatar properties from LLAvatarPropertiesProcessor // is represented by this object LLFetchAvatarData* mPropertiesRequest; @@ -330,6 +329,8 @@ void LLInspectAvatar::requestUpdate() // Clear out old data so it doesn't flash between old and new getChild<LLUICtrl>("user_name")->setValue(""); + getChild<LLUICtrl>("user_name_small")->setValue(""); + getChild<LLUICtrl>("user_slid")->setValue(""); getChild<LLUICtrl>("user_subtitle")->setValue(""); getChild<LLUICtrl>("user_details")->setValue(""); @@ -367,9 +368,9 @@ void LLInspectAvatar::requestUpdate() getChild<LLUICtrl>("avatar_icon")->setValue(LLSD(mAvatarID) ); - gCacheName->get(mAvatarID, FALSE, - boost::bind(&LLInspectAvatar::nameUpdatedCallback, - this, _1, _2, _3, _4)); + LLAvatarNameCache::get(mAvatarID, + boost::bind(&LLInspectAvatar::onAvatarNameCache, + this, _1, _2)); } void LLInspectAvatar::processAvatarData(LLAvatarData* data) @@ -402,8 +403,8 @@ void LLInspectAvatar::processAvatarData(LLAvatarData* data) // if neither the gear menu or self gear menu are open void LLInspectAvatar::onMouseLeave(S32 x, S32 y, MASK mask) { - LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu(); - LLMenuGL* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu(); + LLToggleableMenu* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu(); + LLToggleableMenu* gear_menu_self = getChild<LLMenuButton>("gear_self_btn")->getMenu(); if ( gear_menu && gear_menu->getVisible() && gear_menu_self && gear_menu_self->getVisible() ) { @@ -556,7 +557,7 @@ void LLInspectAvatar::updateVolumeSlider() LLUICtrl* mute_btn = getChild<LLUICtrl>("mute_btn"); - bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden"); + bool is_linden = LLStringUtil::endsWith(mAvatarName.getLegacyName(), " Linden"); mute_btn->setEnabled( !is_linden); mute_btn->setValue( is_muted ); @@ -587,7 +588,7 @@ void LLInspectAvatar::onClickMuteVolume() LLMuteList* mute_list = LLMuteList::getInstance(); bool is_muted = mute_list->isMuted(mAvatarID, LLMute::flagVoiceChat); - LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT); + LLMute mute(mAvatarID, mAvatarName.getLegacyName(), LLMute::AGENT); if (!is_muted) { mute_list->add(mute, LLMute::flagVoiceChat); @@ -606,22 +607,36 @@ void LLInspectAvatar::onVolumeChange(const LLSD& data) LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume); } -void LLInspectAvatar::nameUpdatedCallback( - const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group) +void LLInspectAvatar::onAvatarNameCache( + const LLUUID& agent_id, + const LLAvatarName& av_name) { - if (id == mAvatarID) + if (agent_id == mAvatarID) { - mAvatarName = first + " " + last; - getChild<LLUICtrl>("user_name")->setValue(LLSD(mAvatarName) ); + getChild<LLUICtrl>("user_name")->setValue(av_name.mDisplayName); + getChild<LLUICtrl>("user_name_small")->setValue(av_name.mDisplayName); + getChild<LLUICtrl>("user_slid")->setValue(av_name.mUsername); + mAvatarName = av_name; + + // show smaller display name if too long to display in regular size + if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth()) + { + getChild<LLUICtrl>("user_name_small")->setVisible( true ); + getChild<LLUICtrl>("user_name")->setVisible( false ); + } + else + { + getChild<LLUICtrl>("user_name_small")->setVisible( false ); + getChild<LLUICtrl>("user_name")->setVisible( true ); + + } + } } void LLInspectAvatar::onClickAddFriend() { - LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName); + LLAvatarActions::requestFriendshipDialog(mAvatarID, mAvatarName.getLegacyName()); closeFloater(); } @@ -689,7 +704,7 @@ void LLInspectAvatar::onClickShare() void LLInspectAvatar::onToggleMute() { - LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT); + LLMute mute(mAvatarID, mAvatarName.getLegacyName(), LLMute::AGENT); if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName)) { @@ -706,7 +721,7 @@ void LLInspectAvatar::onToggleMute() void LLInspectAvatar::onClickReport() { - LLFloaterReporter::showFromAvatar(mAvatarID, mAvatarName); + LLFloaterReporter::showFromAvatar(mAvatarID, mAvatarName.getCompleteName()); closeFloater(); } @@ -730,17 +745,17 @@ void LLInspectAvatar::onClickZoomIn() void LLInspectAvatar::onClickFindOnMap() { - gFloaterWorldMap->trackAvatar(mAvatarID, mAvatarName); + gFloaterWorldMap->trackAvatar(mAvatarID, mAvatarName.mDisplayName); LLFloaterReg::showInstance("world_map"); } bool LLInspectAvatar::enableMute() { - bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden"); + bool is_linden = LLStringUtil::endsWith(mAvatarName.getLegacyName(), " Linden"); bool is_self = mAvatarID == gAgent.getID(); - if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName)) + if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName.getLegacyName())) { return true; } @@ -752,10 +767,10 @@ bool LLInspectAvatar::enableMute() bool LLInspectAvatar::enableUnmute() { - bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden"); + bool is_linden = LLStringUtil::endsWith(mAvatarName.getLegacyName(), " Linden"); bool is_self = mAvatarID == gAgent.getID(); - if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName)) + if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName.getLegacyName())) { return true; } diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp index 214b135bc1..76617b55bf 100644 --- a/indra/newview/llinspectgroup.cpp +++ b/indra/newview/llinspectgroup.cpp @@ -78,9 +78,8 @@ public: // Callback for gCacheName to look up group name // Faster than waiting for group properties to return void nameUpdatedCallback(const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group); + const std::string& name, + bool is_group); // Button/menu callbacks void onClickViewProfile(); @@ -219,21 +218,19 @@ void LLInspectGroup::requestUpdate() mPropertiesRequest = new LLFetchGroupData(mGroupID, this); // Name lookup will be faster out of cache, use that - gCacheName->get(mGroupID, TRUE, + gCacheName->getGroup(mGroupID, boost::bind(&LLInspectGroup::nameUpdatedCallback, - this, _1, _2, _3, _4)); + this, _1, _2, _3)); } void LLInspectGroup::nameUpdatedCallback( const LLUUID& id, - const std::string& first, - const std::string& last, - BOOL is_group) + const std::string& name, + bool is_group) { if (id == mGroupID) { - // group names are returned as a first name - getChild<LLUICtrl>("group_name")->setValue(LLSD(first) ); + getChild<LLUICtrl>("group_name")->setValue( LLSD(name) ); } // Otherwise possibly a request for an older inspector, ignore it diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp index 532ffca4be..ee076f68ea 100644 --- a/indra/newview/llinspectobject.cpp +++ b/indra/newview/llinspectobject.cpp @@ -47,6 +47,7 @@ #include "llsafehandle.h" #include "llsidetray.h" #include "lltextbox.h" // for description truncation +#include "lltoggleablemenu.h" #include "lltrans.h" #include "llui.h" // positionViewNearMouse() #include "lluictrl.h" @@ -568,7 +569,7 @@ void LLInspectObject::updateSecureBrowsing() // if the gear menu is not open void LLInspectObject::onMouseLeave(S32 x, S32 y, MASK mask) { - LLMenuGL* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu(); + LLToggleableMenu* gear_menu = getChild<LLMenuButton>("gear_btn")->getMenu(); if ( gear_menu && gear_menu->getVisible() ) { return; diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp index e956b3b8de..bf6cf52298 100644 --- a/indra/newview/llinspectremoteobject.cpp +++ b/indra/newview/llinspectremoteobject.cpp @@ -60,12 +60,12 @@ public: private: void update(); - static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data); + void onNameCache(const LLUUID& id, const std::string& name, bool is_group); private: LLUUID mObjectID; LLUUID mOwnerID; - std::string mOwner; + std::string mOwnerLegacyName; std::string mSLurl; std::string mName; bool mGroupOwned; @@ -75,7 +75,7 @@ LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) : LLInspect(LLSD()), mObjectID(NULL), mOwnerID(NULL), - mOwner(""), + mOwnerLegacyName(), mSLurl(""), mName(""), mGroupOwned(false) @@ -112,10 +112,11 @@ void LLInspectRemoteObject::onOpen(const LLSD& data) mSLurl = data["slurl"].asString(); // work out the owner's name - mOwner = ""; + mOwnerLegacyName = ""; if (gCacheName) { - gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this); + gCacheName->get(mOwnerID, mGroupOwned, // muting + boost::bind(&LLInspectRemoteObject::onNameCache, this, _1, _2, _3)); } // update the inspector with the current object state @@ -144,7 +145,7 @@ void LLInspectRemoteObject::onClickMap() void LLInspectRemoteObject::onClickBlock() { LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT; - LLMute mute(mOwnerID, mOwner, mute_type); + LLMute mute(mOwnerID, mOwnerLegacyName, mute_type); LLMuteList::getInstance()->add(mute); LLPanelBlockedList::showPanelAndSelect(mute.mID); closeFloater(); @@ -155,16 +156,10 @@ void LLInspectRemoteObject::onClickClose() closeFloater(); } -//static -void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data) +void LLInspectRemoteObject::onNameCache(const LLUUID& id, const std::string& name, bool is_group) { - LLInspectRemoteObject *self = (LLInspectRemoteObject*)data; - self->mOwner = first; - if (!last.empty()) - { - self->mOwner += " " + last; - } - self->update(); + mOwnerLegacyName = name; + update(); } void LLInspectRemoteObject::update() @@ -174,7 +169,7 @@ void LLInspectRemoteObject::update() getChild<LLUICtrl>("object_name")->setValue("<nolink>" + mName + "</nolink>"); // show the object's owner - click it to show profile - std::string owner = mOwner; + std::string owner; if (! mOwnerID.isNull()) { if (mGroupOwned) diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 311d791319..5ba87423c7 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -29,6 +29,7 @@ // external projects #include "lltransfersourceasset.h" +#include "llavatarnamecache.h" // IDEVO #include "llagent.h" #include "llagentcamera.h" @@ -1642,16 +1643,19 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, const BOOL is_agent_inventory = (model->getCategory(inv_cat->getUUID()) != NULL) && (LLToolDragAndDrop::SOURCE_AGENT == source); + const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); + const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + BOOL accept = FALSE; if (is_agent_inventory) { const LLUUID &cat_id = inv_cat->getUUID(); const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false); - const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); + const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT); - const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); //-------------------------------------------------------------------------------- // Determine if folder can be moved. @@ -1689,6 +1693,21 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, } } } + if (move_is_into_landmarks) + { + for (S32 i=0; i < descendent_items.count(); ++i) + { + LLViewerInventoryItem* item = descendent_items[i]; + + // Don't move anything except landmarks and categories into Landmarks folder. + // We use getType() instead of getActua;Type() to allow links to landmarks and folders. + if (LLAssetType::AT_LANDMARK != item->getType() && LLAssetType::AT_CATEGORY != item->getType()) + { + is_movable = FALSE; + break; // It's generally movable, but not into Landmarks. + } + } + } // //-------------------------------------------------------------------------------- @@ -1776,6 +1795,17 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, LLUUID category_id = mUUID; accept = move_inv_category_world_to_agent(object_id, category_id, drop); } + else if (LLToolDragAndDrop::SOURCE_LIBRARY == source) + { + // Accept folders that contain complete outfits. + accept = move_is_into_current_outfit && LLAppearanceMgr::instance().getCanMakeFolderIntoOutfit(inv_cat->getUUID()); + + if (accept && drop) + { + LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, true, false); + } + } + return accept; } @@ -2660,6 +2690,8 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data) { + LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data; + //llinfos << "LLFolderBridge::dragOrDrop()" << llendl; BOOL accept = FALSE; switch(cargo_type) @@ -2675,9 +2707,24 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop, case DAD_BODYPART: case DAD_ANIMATION: case DAD_GESTURE: + accept = dragItemIntoFolder(inv_item, drop); + break; case DAD_LINK: - accept = dragItemIntoFolder((LLInventoryItem*)cargo_data, - drop); + // DAD_LINK type might mean one of two asset types: AT_LINK or AT_LINK_FOLDER. + // If we have an item of AT_LINK_FOLDER type we should process the linked + // category being dragged or dropped into folder. + if (inv_item && LLAssetType::AT_LINK_FOLDER == inv_item->getActualType()) + { + LLInventoryCategory* linked_category = gInventory.getCategory(inv_item->getLinkedUUID()); + if (linked_category) + { + accept = dragCategoryIntoFolder((LLInventoryCategory*)linked_category, drop); + } + } + else + { + accept = dragItemIntoFolder(inv_item, drop); + } break; case DAD_CATEGORY: if (LLFriendCardsManager::instance().isAnyFriendCategory(mUUID)) @@ -2856,6 +2903,85 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response return false; } +// Returns true if the item can be moved to Current Outfit or any outfit folder. +static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit) +{ + if ((inv_item->getInventoryType() != LLInventoryType::IT_WEARABLE) && + (inv_item->getInventoryType() != LLInventoryType::IT_GESTURE) && + (inv_item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) && + (inv_item->getInventoryType() != LLInventoryType::IT_OBJECT)) + { + return FALSE; + } + + if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID())) + { + return FALSE; + } + + return TRUE; +} + +// Returns TRUE if item is a landmark or a link to a landmark +// and can be moved to Favorites or Landmarks folder. +static BOOL can_move_to_landmarks(LLInventoryItem* inv_item) +{ + // Need to get the linked item to know its type because LLInventoryItem::getType() + // returns actual type AT_LINK for links, not the asset type of a linked item. + if (LLAssetType::AT_LINK == inv_item->getType()) + { + LLInventoryItem* linked_item = gInventory.getItem(inv_item->getLinkedUUID()); + if (linked_item) + { + return LLAssetType::AT_LANDMARK == linked_item->getType(); + } + } + + return LLAssetType::AT_LANDMARK == inv_item->getType(); +} + +void LLFolderBridge::dropToFavorites(LLInventoryItem* inv_item) +{ + // use callback to rearrange favorite landmarks after adding + // to have new one placed before target (on which it was dropped). See EXT-4312. + LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback(); + LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); + LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; + if (drag_over_item && drag_over_item->getListener()) + { + cb.get()->setTargetLandmarkId(drag_over_item->getListener()->getUUID()); + } + + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + cb); +} + +void LLFolderBridge::dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit) +{ + // BAP - should skip if dup. + if (move_is_into_current_outfit) + { + LLAppearanceMgr::instance().wearItemOnAvatar(inv_item->getUUID(), true, true); + } + else + { + LLPointer<LLInventoryCallback> cb = NULL; + link_inventory_item( + gAgent.getID(), + inv_item->getLinkedUUID(), + mUUID, + inv_item->getName(), + inv_item->getDescription(), + LLAssetType::AT_LINK, + cb); + } +} + // This is used both for testing whether an item can be dropped // into the folder, as well as performing the actual drop, depending // if drop == TRUE. @@ -2868,20 +2994,24 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if(!isAgentInventory()) return FALSE; // cannot drag into library if (!isAgentAvatarValid()) return FALSE; + const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); + const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false); + const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); + + const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); + const BOOL move_is_into_favorites = (mUUID == favorites_id); + const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); + LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); BOOL accept = FALSE; LLViewerObject* object = NULL; if(LLToolDragAndDrop::SOURCE_AGENT == source) { const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false); - const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); - const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false); const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID()); - const BOOL folder_allows_reorder = (mUUID == favorites_id); //-------------------------------------------------------------------------------- // Determine if item can be moved. @@ -2927,18 +3057,15 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if (!is_movable) accept = FALSE; - if ((mUUID == inv_item->getParentUUID()) && !folder_allows_reorder) + if ((mUUID == inv_item->getParentUUID()) && !move_is_into_favorites) accept = FALSE; if (move_is_into_current_outfit || move_is_into_outfit) { - if ((inv_item->getInventoryType() != LLInventoryType::IT_WEARABLE) && - (inv_item->getInventoryType() != LLInventoryType::IT_GESTURE) && - (inv_item->getInventoryType() != LLInventoryType::IT_OBJECT)) - accept = FALSE; + accept = can_move_to_outfit(inv_item, move_is_into_current_outfit); } - if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID())) + else if (move_is_into_favorites || move_is_into_landmarks) { - accept = FALSE; + accept = can_move_to_landmarks(inv_item); } if(accept && drop) @@ -2965,8 +3092,8 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // // REORDER - // (only reorder the item) - if ((mUUID == inv_item->getParentUUID()) && folder_allows_reorder) + // (only reorder the item in Favorites folder) + if ((mUUID == inv_item->getParentUUID()) && move_is_into_favorites) { LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); LLFolderViewItem* itemp = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; @@ -2980,52 +3107,15 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // FAVORITES folder // (copy the item) - else if (favorites_id == mUUID) + else if (move_is_into_favorites) { - // use callback to rearrange favorite landmarks after adding - // to have new one placed before target (on which it was dropped). See EXT-4312. - LLPointer<AddFavoriteLandmarkCallback> cb = new AddFavoriteLandmarkCallback(); - LLInventoryPanel* panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get()); - LLFolderViewItem* drag_over_item = panel ? panel->getRootFolder()->getDraggingOverItem() : NULL; - if (drag_over_item && drag_over_item->getListener()) - { - cb.get()->setTargetLandmarkId(drag_over_item->getListener()->getUUID()); - } - - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - cb); + dropToFavorites(inv_item); } // CURRENT OUTFIT or OUTFIT folder // (link the item) else if (move_is_into_current_outfit || move_is_into_outfit) { - if ((inv_item->getInventoryType() == LLInventoryType::IT_WEARABLE) || - (inv_item->getInventoryType() == LLInventoryType::IT_GESTURE) || - (inv_item->getInventoryType() == LLInventoryType::IT_OBJECT)) - { - // BAP - should skip if dup. - if (move_is_into_current_outfit) - { - LLAppearanceMgr::instance().wearItemOnAvatar(inv_item->getUUID(), true, true); - } - else - { - LLPointer<LLInventoryCallback> cb = NULL; - link_inventory_item( - gAgent.getID(), - inv_item->getLinkedUUID(), - mUUID, - inv_item->getName(), - inv_item->getDescription(), - LLAssetType::AT_LINK, - cb); - } - } + dropToOutfit(inv_item, move_is_into_current_outfit); } // NORMAL or TRASH folder // (move the item, restamp if into trash) @@ -3074,6 +3164,22 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, is_move = TRUE; accept = TRUE; } + + // Don't allow placing an original item into Current Outfit or an outfit folder + // because they must contain only links to wearable items. + // *TODO: Probably we should create a link to an item if it was dragged to outfit or COF. + if(move_is_into_current_outfit || move_is_into_outfit) + { + accept = FALSE; + } + // Don't allow to move a single item to Favorites or Landmarks + // if it is not a landmark or a link to a landmark. + else if ((move_is_into_favorites || move_is_into_landmarks) + && !can_move_to_landmarks(inv_item)) + { + accept = FALSE; + } + if(drop && accept) { LLMoveInv* move_inv = new LLMoveInv; @@ -3113,15 +3219,42 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, if(item && item->isFinished()) { accept = TRUE; - if(drop) + + if (move_is_into_current_outfit || move_is_into_outfit) { - copy_inventory_item( - gAgent.getID(), - inv_item->getPermissions().getOwner(), - inv_item->getUUID(), - mUUID, - std::string(), - LLPointer<LLInventoryCallback>(NULL)); + accept = can_move_to_outfit(inv_item, move_is_into_current_outfit); + } + // Don't allow to move a single item to Favorites or Landmarks + // if it is not a landmark or a link to a landmark. + else if (move_is_into_favorites || move_is_into_landmarks) + { + accept = can_move_to_landmarks(inv_item); + } + + if (accept && drop) + { + // FAVORITES folder + // (copy the item) + if (move_is_into_favorites) + { + dropToFavorites(inv_item); + } + // CURRENT OUTFIT or OUTFIT folder + // (link the item) + else if (move_is_into_current_outfit || move_is_into_outfit) + { + dropToOutfit(inv_item, move_is_into_current_outfit); + } + else + { + copy_inventory_item( + gAgent.getID(), + inv_item->getPermissions().getOwner(), + inv_item->getUUID(), + mUUID, + std::string(), + LLPointer<LLInventoryCallback>(NULL)); + } } } } @@ -3455,6 +3588,13 @@ void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string act { std::string callingcard_name; gCacheName->getFullName(item->getCreatorUUID(), callingcard_name); + // IDEVO + LLAvatarName av_name; + if (LLAvatarNameCache::useDisplayNames() + && LLAvatarNameCache::get(item->getCreatorUUID(), &av_name)) + { + callingcard_name = av_name.mDisplayName + " (" + av_name.mUsername + ")"; + } LLUUID session_id = gIMMgr->addSession(callingcard_name, IM_NOTHING_SPECIAL, item->getCreatorUUID()); if (session_id != LLUUID::null) { diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 14abdd76b9..5ac328dcef 100644 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -295,6 +295,8 @@ protected: menuentry_vec_t getMenuItems() { return mItems; } // returns a copy of current menu items + void dropToFavorites(LLInventoryItem* inv_item); + void dropToOutfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); //-------------------------------------------------------------------- // Messy hacks for handling folder options diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index f3d9639dee..ef20869114 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -487,12 +487,9 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte return false; break; case LLAssetType::AT_OBJECT: - if (isAgentAvatarValid() && !gAgentAvatarp->isWearingAttachment(item->getUUID())) - return true; - break; case LLAssetType::AT_BODYPART: case LLAssetType::AT_CLOTHING: - if(!gAgentWearables.isWearingItem(item->getUUID())) + if (!get_is_item_worn(item->getUUID())) return true; break; default: diff --git a/indra/newview/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp index 7216d61e7f..3f4f33e88d 100644 --- a/indra/newview/llinventoryicon.cpp +++ b/indra/newview/llinventoryicon.cpp @@ -50,7 +50,7 @@ public: LLIconDictionary::LLIconDictionary() { addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture")); - addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Texture")); + addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Sound")); addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard")); addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard")); addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark")); @@ -83,7 +83,7 @@ LLIconDictionary::LLIconDictionary() addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture")); addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem")); - addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem")); + addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkFolder")); addEntry(LLInventoryIcon::ICONNAME_INVALID, new IconEntry("Inv_Invalid")); diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 1ea91103f1..225d0288a9 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -302,7 +302,9 @@ LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem } else { - mIconCtrl = dynamic_cast<LLIconCtrl*>(LLUICtrlFactory::createDefaultWidget<LLIconCtrl>("item_icon")); + LLIconCtrl::Params icon_params; + icon_params.name = "item_icon"; + mIconCtrl = LLUICtrlFactory::create<LLIconCtrl>(icon_params); } LLTextBox::Params text_params(params.item_name); @@ -315,7 +317,9 @@ LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem } else { - mTitleCtrl = dynamic_cast<LLTextBox*>(LLUICtrlFactory::createDefaultWidget<LLTextBox>("item_title")); + LLTextBox::Params text_aprams; + text_params.name = "item_title"; + mTitleCtrl = LLUICtrlFactory::create<LLTextBox>(text_params); } } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 50adae09c0..0870b5b8dd 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -290,7 +290,10 @@ void LLInventoryPanel::modelChanged(U32 mask) const LLUUID& item_id = (*items_iter); const LLInventoryObject* model_item = model->getObject(item_id); LLFolderViewItem* view_item = mFolderRoot->getItemByID(item_id); - LLFolderViewFolder* view_folder = mFolderRoot->getFolderByID(item_id); + + // LLFolderViewFolder is derived from LLFolderViewItem so dynamic_cast from item + // to folder is the fast way to get a folder without searching through folders tree. + LLFolderViewFolder* view_folder = dynamic_cast<LLFolderViewFolder*>(view_item); ////////////////////////////// // LABEL Operation diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp index d714cae872..1527f8f4c9 100644 --- a/indra/newview/lllocationinputctrl.cpp +++ b/indra/newview/lllocationinputctrl.cpp @@ -224,7 +224,7 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p) LLLineEditor::Params params = p.combo_editor; params.rect(text_entry_rect); params.default_text(LLStringUtil::null); - params.max_length_bytes(p.max_chars); + params.max_length.bytes(p.max_chars); params.keystroke_callback(boost::bind(&LLLocationInputCtrl::onTextEntry, this, _1)); params.commit_on_focus_lost(false); params.follows.flags(FOLLOWS_ALL); diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index f5f4feeab3..2fb5ba82ba 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -56,12 +56,12 @@ const S32 LOG_RECALL_SIZE = 2048; -const static std::string IM_TIME("time"); -const static std::string IM_TEXT("message"); -const static std::string IM_FROM("from"); -const static std::string IM_FROM_ID("from_id"); -const static std::string IM_SEPARATOR(": "); +const std::string IM_TIME("time"); +const std::string IM_TEXT("message"); +const std::string IM_FROM("from"); +const std::string IM_FROM_ID("from_id"); +const static std::string IM_SEPARATOR(": "); const static std::string NEW_LINE("\n"); const static std::string NEW_LINE_SPACE_PREFIX("\n "); const static std::string TWO_SPACES(" "); @@ -87,7 +87,7 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+ * Regular expression suitable to match names like * "You", "Second Life", "Igor ProductEngine", "Object", "Mega House" */ -const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)"); +const static boost::regex NAME_AND_TEXT("([^:]+[:]{1})?(\\s*)(.*)"); //is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st" const static std::string NAME_TEXT_DIVIDER(": "); @@ -182,15 +182,31 @@ private: //static std::string LLLogChat::makeLogFileName(std::string filename) { + if( gSavedPerAccountSettings.getBOOL("LogFileNamewithDate") ) + { + time_t now; + time(&now); + char dbuffer[20]; /* Flawfinder: ignore */ + if (filename == "chat") + { + strftime(dbuffer, 20, "-%Y-%m-%d", localtime(&now)); + } + else + { + strftime(dbuffer, 20, "-%Y-%m", localtime(&now)); + } + filename += dbuffer; + } filename = cleanFileName(filename); filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename); filename += ".txt"; + //LL_INFOS("") << "Current:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ return filename; } std::string LLLogChat::cleanFileName(std::string filename) { - std::string invalidChars = "\"\'\\/?*:<>|"; + std::string invalidChars = "\"\'\\/?*:.<>|"; std::string::size_type position = filename.find_first_of(invalidChars); while (position != filename.npos) { @@ -346,6 +362,7 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line) messages.back()[IM_TEXT] = im_text; } +// static void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& messages) { if (file_name.empty()) @@ -353,10 +370,19 @@ void LLLogChat::loadAllHistory(const std::string& file_name, std::list<LLSD>& me llwarns << "Session name is Empty!" << llendl; return ; } - - LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r"); /*Flawfinder: ignore*/ - if (!fptr) return; //No previous conversation with this name. - + //LL_INFOS("") << "Loading:" << file_name << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ + //LL_INFOS("") << "Current:" << makeLogFileName(file_name) << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ + LLFILE* fptr = LLFile::fopen(makeLogFileName(file_name), "r");/*Flawfinder: ignore*/ + if (!fptr) + { + fptr = LLFile::fopen(oldLogFileName(file_name), "r");/*Flawfinder: ignore*/ + if (!fptr) + { + if (!fptr) return; //No previous conversation with this name. + } + } + + //LL_INFOS("") << "Reading:" << file_name << LL_ENDL; char buffer[LOG_RECALL_SIZE]; /*Flawfinder: ignore*/ char *bptr; S32 len; @@ -421,12 +447,12 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const } if (im[IM_TIME].isDefined()) - { +{ std::string timestamp = im[IM_TIME].asString(); boost::trim(timestamp); ostr << '[' << timestamp << ']' << TWO_SPACES; } - + //*TODO mark object's names in a special way so that they will be distinguishable form avatar name //which are more strict by its nature (only firstname and secondname) //Example, an object's name can be writen like "Object <actual_object's_name>" @@ -439,7 +465,7 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const ostr << from << IM_SEPARATOR; } } - + if (im[IM_TEXT].isDefined()) { std::string im_text = im[IM_TEXT].asString(); @@ -448,7 +474,7 @@ void LLChatLogFormatter::format(const LLSD& im, std::ostream& ostr) const boost::replace_all(im_text, NEW_LINE, NEW_LINE_SPACE_PREFIX); ostr << im_text; } -} + } bool LLChatLogParser::parse(std::string& raw, LLSD& im) { @@ -543,3 +569,32 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im) im[IM_TEXT] = name_and_text[IDX_TEXT]; return true; //parsed name and message text, maybe have a timestamp too } +std::string LLLogChat::oldLogFileName(std::string filename) +{ + std::string scanResult; + std::string directory = gDirUtilp->getPerAccountChatLogsDir();/* get Users log directory */ + directory += gDirUtilp->getDirDelimiter();/* add final OS dependent delimiter */ + filename=cleanFileName(filename);/* lest make shure the file name has no invalad charecters befor making the pattern */ + std::string pattern = (filename+(( filename == "chat" ) ? "-???\?-?\?-??.txt" : "-???\?-??.txt"));/* create search pattern*/ + //LL_INFOS("") << "Checking:" << directory << " for " << pattern << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ + std::vector<std::string> allfiles; + + while (gDirUtilp->getNextFileInDir(directory, pattern, scanResult)) + { + //LL_INFOS("") << "Found :" << scanResult << LL_ENDL; + allfiles.push_back(scanResult); + } + + if (allfiles.size() == 0) // if no result from date search, return generic filename + { + scanResult = directory + filename + ".txt"; + } + else + { + std::sort(allfiles.begin(), allfiles.end()); + scanResult = directory + allfiles.back(); + // thisfile is now the most recent version of the file. + } + //LL_INFOS("") << "Reading:" << scanResult << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ + return scanResult; +} diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index e544bb2d45..27752452c9 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -24,10 +24,11 @@ * $/LicenseInfo$ */ - #ifndef LL_LLLOGCHAT_H #define LL_LLLOGCHAT_H +class LLChat; + class LLLogChat { public: @@ -40,6 +41,10 @@ public: }; static std::string timestamp(bool withdate = false); static std::string makeLogFileName(std::string(filename)); + /** + *Add functions to get old and non date stamped file names when needed + */ + static std::string oldLogFileName(std::string(filename)); static void saveHistory(const std::string& filename, const std::string& from, const LLUUID& from_id, @@ -107,4 +112,10 @@ protected: virtual ~LLChatLogParser() {}; }; +// LLSD map lookup constants +extern const std::string IM_TIME; //("time"); +extern const std::string IM_TEXT; //("message"); +extern const std::string IM_FROM; //("from"); +extern const std::string IM_FROM_ID; //("from_id"); + #endif diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 9461bfbc32..8e1a368c6b 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -47,6 +47,7 @@ #include "llfloaterreg.h" #include "llnotifications.h" #include "llwindow.h" +#include "llviewerwindow.h" #if LL_LINUX || LL_SOLARIS #include "lltrans.h" #endif @@ -102,6 +103,7 @@ void LLLoginInstance::reconnect() std::vector<std::string> uris; LLGridManager::getInstance()->getLoginURIs(uris); mLoginModule->connect(uris.front(), mRequestData); + gViewerWindow->setShowProgress(true); } void LLLoginInstance::disconnect() @@ -137,6 +139,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia requested_options.append("initial-outfit"); requested_options.append("gestures"); + requested_options.append("display_names"); requested_options.append("event_categories"); requested_options.append("event_notifications"); requested_options.append("classified_categories"); @@ -240,6 +243,7 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event) LLSD data(LLSD::emptyMap()); data["message"] = message_response; data["reply_pump"] = TOS_REPLY_PUMP; + gViewerWindow->setShowProgress(FALSE); LLFloaterReg::showInstance("message_tos", data); LLEventPumps::instance().obtain(TOS_REPLY_PUMP) .listen(TOS_LISTENER_NAME, @@ -260,6 +264,7 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event) data["certificate"] = response["certificate"]; } + gViewerWindow->setShowProgress(FALSE); LLFloaterReg::showInstance("message_critical", data); LLEventPumps::instance().obtain(TOS_REPLY_PUMP) .listen(TOS_LISTENER_NAME, @@ -403,6 +408,8 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg) { mNotifications->add(notification_name, args, payload, boost::bind(&LLLoginInstance::updateDialogCallback, this, _1, _2)); + + gViewerWindow->setShowProgress(false); } } diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 5eb3b789f2..f871df0c36 100644 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -726,7 +726,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) LLVector3d new_position_global = selectNode->mSavedPositionGlobal + clamped_relative_move; // Don't let object centers go too far underground - F64 min_height = LLWorld::getInstance()->getMinAllowedZ(object); + F64 min_height = LLWorld::getInstance()->getMinAllowedZ(object, object->getPositionGlobal()); if (new_position_global.mdV[VZ] < min_height) { new_position_global.mdV[VZ] = min_height; diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index a6ff76cf84..e84c9152b1 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -38,7 +38,6 @@ #include "llviewermedia.h" #include "llviewertexture.h" #include "llviewerwindow.h" -#include "llnotificationsutil.h" #include "llweb.h" #include "llrender.h" #include "llpluginclassmedia.h" @@ -48,6 +47,13 @@ // linden library includes #include "llfocusmgr.h" +#include "llsdutil.h" +#include "lllayoutstack.h" +#include "lliconctrl.h" +#include "lltextbox.h" +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llnotifications.h" extern BOOL gRestoreGL; @@ -62,19 +68,21 @@ LLMediaCtrl::Params::Params() texture_width("texture_width", 1024), texture_height("texture_height", 1024), caret_color("caret_color"), - initial_mime_type("initial_mime_type") + initial_mime_type("initial_mime_type"), + media_id("media_id"), + trusted_content("trusted_content", false) { tab_stop(false); } LLMediaCtrl::LLMediaCtrl( const Params& p) : LLPanel( p ), + LLInstanceTracker<LLMediaCtrl, LLUUID>(LLUUID::generateNewID()), mTextureDepthBytes( 4 ), mBorder(NULL), mFrequentUpdates( true ), mForceUpdate( false ), mHomePageUrl( "" ), - mTrusted(false), mIgnoreUIScale( true ), mAlwaysRefresh( false ), mMediaSource( 0 ), @@ -88,7 +96,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mTextureWidth ( 1024 ), mTextureHeight ( 1024 ), mClearCache(false), - mHomePageMimeType(p.initial_mime_type) + mHomePageMimeType(p.initial_mime_type), + mTrusted(p.trusted_content) { { LLColor4 color = p.caret_color().get(); @@ -161,19 +170,10 @@ void LLMediaCtrl::setTakeFocusOnClick( bool take_focus ) } //////////////////////////////////////////////////////////////////////////////// -void LLMediaCtrl::setTrusted( bool valIn ) -{ - if(mMediaSource) - { - mMediaSource->setTrustedBrowser(valIn); - } - mTrusted = valIn; -} - -//////////////////////////////////////////////////////////////////////////////// // BOOL LLMediaCtrl::handleHover( S32 x, S32 y, MASK mask ) { + if (LLPanel::handleHover(x, y, mask)) return TRUE; convertInputCoords(x, y); if (mMediaSource) @@ -189,6 +189,7 @@ BOOL LLMediaCtrl::handleHover( S32 x, S32 y, MASK mask ) // BOOL LLMediaCtrl::handleScrollWheel( S32 x, S32 y, S32 clicks ) { + if (LLPanel::handleScrollWheel(x, y, clicks)) return TRUE; if (mMediaSource && mMediaSource->hasMedia()) mMediaSource->getMediaPlugin()->scrollEvent(0, clicks, gKeyboard->currentMask(TRUE)); @@ -199,6 +200,7 @@ BOOL LLMediaCtrl::handleScrollWheel( S32 x, S32 y, S32 clicks ) // BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask ) { + if (LLPanel::handleMouseUp(x, y, mask)) return TRUE; convertInputCoords(x, y); if (mMediaSource) @@ -223,6 +225,7 @@ BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask ) // BOOL LLMediaCtrl::handleMouseDown( S32 x, S32 y, MASK mask ) { + if (LLPanel::handleMouseDown(x, y, mask)) return TRUE; convertInputCoords(x, y); if (mMediaSource) @@ -242,6 +245,7 @@ BOOL LLMediaCtrl::handleMouseDown( S32 x, S32 y, MASK mask ) // BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask ) { + if (LLPanel::handleRightMouseUp(x, y, mask)) return TRUE; convertInputCoords(x, y); if (mMediaSource) @@ -266,6 +270,7 @@ BOOL LLMediaCtrl::handleRightMouseUp( S32 x, S32 y, MASK mask ) // BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) { + if (LLPanel::handleRightMouseDown(x, y, mask)) return TRUE; convertInputCoords(x, y); if (mMediaSource) @@ -285,6 +290,7 @@ BOOL LLMediaCtrl::handleRightMouseDown( S32 x, S32 y, MASK mask ) // BOOL LLMediaCtrl::handleDoubleClick( S32 x, S32 y, MASK mask ) { + if (LLPanel::handleDoubleClick(x, y, mask)) return TRUE; convertInputCoords(x, y); if (mMediaSource) @@ -339,6 +345,85 @@ void LLMediaCtrl::onFocusLost() // BOOL LLMediaCtrl::postBuild () { + LLLayoutStack::Params layout_p; + layout_p.name = "notification_stack"; + layout_p.rect = LLRect(0,getLocalRect().mTop,getLocalRect().mRight, 30); + layout_p.follows.flags = FOLLOWS_ALL; + layout_p.mouse_opaque = false; + layout_p.orientation = "vertical"; + + LLLayoutStack* stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p); + addChild(stackp); + + LLLayoutPanel::Params panel_p; + panel_p.rect = LLRect(0, 30, 800, 0); + panel_p.min_height = 30; + panel_p.name = "notification_area"; + panel_p.visible = false; + panel_p.user_resize = false; + panel_p.background_visible = true; + panel_p.bg_alpha_image.name = "Yellow_Gradient"; + panel_p.auto_resize = false; + LLLayoutPanel* notification_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); + stackp->addChild(notification_panel); + + panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>(); + panel_p.auto_resize = true; + panel_p.mouse_opaque = false; + LLLayoutPanel* dummy_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); + stackp->addChild(dummy_panel); + + layout_p = LLUICtrlFactory::getDefaultParams<LLLayoutStack>(); + layout_p.rect = LLRect(0, 30, 800, 0); + layout_p.follows.flags = FOLLOWS_ALL; + layout_p.orientation = "horizontal"; + stackp = LLUICtrlFactory::create<LLLayoutStack>(layout_p); + notification_panel->addChild(stackp); + + panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>(); + panel_p.rect.height = 30; + LLLayoutPanel* panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); + stackp->addChild(panel); + + LLIconCtrl::Params icon_p; + icon_p.name = "notification_icon"; + icon_p.rect = LLRect(5, 23, 21, 8); + panel->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_p)); + + LLTextBox::Params text_p; + text_p.rect = LLRect(31, 20, 430, 0); + text_p.text_color = LLColor4::black; + text_p.font = LLFontGL::getFontSansSerif(); + text_p.font.style = "BOLD"; + text_p.name = "notification_text"; + text_p.use_ellipses = true; + panel->addChild(LLUICtrlFactory::create<LLTextBox>(text_p)); + + panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>(); + panel_p.auto_resize = false; + panel_p.user_resize = false; + panel_p.name="form_elements"; + panel_p.rect = LLRect(0, 30, 130, 0); + LLLayoutPanel* form_elements_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); + stackp->addChild(form_elements_panel); + + panel_p = LLUICtrlFactory::getDefaultParams<LLLayoutPanel>(); + panel_p.auto_resize = false; + panel_p.user_resize = false; + panel_p.rect = LLRect(0, 30, 25, 0); + LLLayoutPanel* close_panel = LLUICtrlFactory::create<LLLayoutPanel>(panel_p); + stackp->addChild(close_panel); + + LLButton::Params button_p; + button_p.name = "close_notification"; + button_p.rect = LLRect(5, 23, 21, 7); + button_p.image_color=LLUIColorTable::instance().getColor("DkGray_66"); + button_p.image_unselected.name="Icon_Close_Foreground"; + button_p.image_selected.name="Icon_Close_Press"; + button_p.click_callback.function = boost::bind(&LLMediaCtrl::onCloseNotification, this); + + close_panel->addChild(LLUICtrlFactory::create<LLButton>(button_p)); + setVisibleCallback(boost::bind(&LLMediaCtrl::onVisibilityChange, this, _2)); return TRUE; } @@ -347,6 +432,7 @@ BOOL LLMediaCtrl::postBuild () // BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask ) { + if (LLPanel::handleKeyHere(key, mask)) return TRUE; BOOL result = FALSE; if (mMediaSource) @@ -372,6 +458,7 @@ void LLMediaCtrl::handleVisibilityChange ( BOOL new_visibility ) // BOOL LLMediaCtrl::handleUnicodeCharHere(llwchar uni_char) { + if (LLPanel::handleUnicodeCharHere(uni_char)) return TRUE; BOOL result = FALSE; if (mMediaSource) @@ -572,6 +659,15 @@ void LLMediaCtrl::setHomePageUrl( const std::string& urlIn, const std::string& m } } +void LLMediaCtrl::setTarget(const std::string& target) +{ + mTarget = target; + if (mMediaSource) + { + mMediaSource->setTarget(mTarget); + } +} + //////////////////////////////////////////////////////////////////////////////// // bool LLMediaCtrl::setCaretColor(unsigned int red, unsigned int green, unsigned int blue) @@ -613,6 +709,7 @@ bool LLMediaCtrl::ensureMediaSourceExists() { mMediaSource->setUsedInUI(true); mMediaSource->setHomeURL(mHomePageUrl, mHomePageMimeType); + mMediaSource->setTarget(mTarget); mMediaSource->setVisible( getVisible() ); mMediaSource->addObserver( this ); mMediaSource->setBackgroundColor( getBackgroundColor() ); @@ -824,6 +921,10 @@ void LLMediaCtrl::draw() if ( mBorder && mBorder->getVisible() ) mBorder->setKeyboardFocusHighlight( gFocusMgr.childHasKeyboardFocus( this ) ); + if (mCurNotification && !mCurNotification->isActive()) + { + hideNotification(); + } LLPanel::draw(); @@ -890,6 +991,7 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_NAVIGATE_BEGIN: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL; + hideNotification(); }; break; @@ -924,9 +1026,27 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL; + // retrieve the event parameters + std::string url = self->getClickURL(); + std::string target = self->getClickTarget(); + std::string uuid = self->getClickUUID(); + + LLNotification::Params notify_params; + notify_params.name = "PopupAttempt"; + notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", getKey()); + notify_params.functor.function = boost::bind(&LLMediaCtrl::onPopup, this, _1, _2); + + if (mTrusted) + { + LLNotifications::instance().forceResponse(notify_params, 0); + } + else + { + LLNotifications::instance().add(notify_params); + } + break; }; - break; - + case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << LL_ENDL; @@ -950,6 +1070,24 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAME_CHANGED" << LL_ENDL; }; break; + + case MEDIA_EVENT_CLOSE_REQUEST: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLOSE_REQUEST" << LL_ENDL; + } + break; + + case MEDIA_EVENT_PICK_FILE_REQUEST: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << LL_ENDL; + } + break; + + case MEDIA_EVENT_GEOMETRY_CHANGE: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() << LL_ENDL; + } + break; }; // chain all events to any potential observers of this object. @@ -963,3 +1101,113 @@ std::string LLMediaCtrl::getCurrentNavUrl() return mCurrentNavUrl; } +void LLMediaCtrl::onPopup(const LLSD& notification, const LLSD& response) +{ + if (response["open"]) + { + LLWeb::loadURL(notification["payload"]["url"], notification["payload"]["target"], notification["payload"]["uuid"]); + } + else + { + // Make sure the opening instance knows its window open request was denied, so it can clean things up. + LLViewerMedia::proxyWindowClosed(notification["payload"]["uuid"]); + } + +} + +void LLMediaCtrl::onCloseNotification() +{ + LLNotifications::instance().cancel(mCurNotification); +} + +void LLMediaCtrl::onClickIgnore(LLUICtrl* ctrl) +{ + bool check = ctrl->getValue().asBoolean(); + if (mCurNotification && mCurNotification->getForm()->getIgnoreType() == LLNotificationForm::IGNORE_SHOW_AGAIN) + { + // question was "show again" so invert value to get "ignore" + check = !check; + } + mCurNotification->setIgnored(check); +} + +void LLMediaCtrl::onClickNotificationButton(const std::string& name) +{ + if (!mCurNotification) return; + + LLSD response = mCurNotification->getResponseTemplate(); + response[name] = true; + + mCurNotification->respond(response); +} + +void LLMediaCtrl::showNotification(LLNotificationPtr notify) +{ + mCurNotification = notify; + + // add popup here + LLSD payload = notify->getPayload(); + + LLNotificationFormPtr formp = notify->getForm(); + LLLayoutPanel& panel = getChildRef<LLLayoutPanel>("notification_area"); + panel.setVisible(true); + panel.getChild<LLUICtrl>("notification_icon")->setValue(notify->getIcon()); + panel.getChild<LLUICtrl>("notification_text")->setValue(notify->getMessage()); + panel.getChild<LLUICtrl>("notification_text")->setToolTip(notify->getMessage()); + LLNotificationForm::EIgnoreType ignore_type = formp->getIgnoreType(); + LLLayoutPanel& form_elements = panel.getChildRef<LLLayoutPanel>("form_elements"); + form_elements.deleteAllChildren(); + + const S32 FORM_PADDING_HORIZONTAL = 10; + const S32 FORM_PADDING_VERTICAL = 3; + S32 cur_x = FORM_PADDING_HORIZONTAL; + + if (ignore_type != LLNotificationForm::IGNORE_NO) + { + LLCheckBoxCtrl::Params checkbox_p; + checkbox_p.name = "ignore_check"; + checkbox_p.rect = LLRect(cur_x, form_elements.getRect().getHeight() - FORM_PADDING_VERTICAL, cur_x, FORM_PADDING_VERTICAL); + checkbox_p.label = formp->getIgnoreMessage(); + checkbox_p.label_text.text_color = LLColor4::black; + checkbox_p.commit_callback.function = boost::bind(&LLMediaCtrl::onClickIgnore, this, _1); + checkbox_p.initial_value = formp->getIgnored(); + + LLCheckBoxCtrl* check = LLUICtrlFactory::create<LLCheckBoxCtrl>(checkbox_p); + check->setRect(check->getBoundingRect()); + form_elements.addChild(check); + cur_x = check->getRect().mRight + FORM_PADDING_HORIZONTAL; + } + + for (S32 i = 0; i < formp->getNumElements(); i++) + { + LLSD form_element = formp->getElement(i); + if (form_element["type"].asString() == "button") + { + LLButton::Params button_p; + button_p.name = form_element["name"]; + button_p.label = form_element["text"]; + button_p.rect = LLRect(cur_x, form_elements.getRect().getHeight() - FORM_PADDING_VERTICAL, cur_x, FORM_PADDING_VERTICAL); + button_p.click_callback.function = boost::bind(&LLMediaCtrl::onClickNotificationButton, this, form_element["name"].asString()); + button_p.auto_resize = true; + + LLButton* button = LLUICtrlFactory::create<LLButton>(button_p); + button->autoResize(); + form_elements.addChild(button); + + cur_x = button->getRect().mRight + FORM_PADDING_HORIZONTAL; + } + } + + + form_elements.reshape(cur_x, form_elements.getRect().getHeight()); + + //LLWeb::loadURL(payload["url"], payload["target"]); +} + +void LLMediaCtrl::hideNotification() +{ + LLLayoutPanel& panel = getChildRef<LLLayoutPanel>("notification_area"); + panel.setVisible(FALSE); + + mCurNotification.reset(); +} diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 755d1e1b04..65dfbbff78 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -40,7 +40,8 @@ class LLUICtrlFactory; class LLMediaCtrl : public LLPanel, public LLViewerMediaObserver, - public LLViewerMediaEventEmitter + public LLViewerMediaEventEmitter, + public LLInstanceTracker<LLMediaCtrl, LLUUID> { LOG_CLASS(LLMediaCtrl); public: @@ -51,7 +52,8 @@ public: Optional<bool> border_visible, ignore_ui_scale, hide_loading, - decouple_texture_size; + decouple_texture_size, + trusted_content; Optional<S32> texture_width, texture_height; @@ -59,6 +61,7 @@ public: Optional<LLUIColor> caret_color; Optional<std::string> initial_mime_type; + Optional<std::string> media_id; Params(); }; @@ -103,11 +106,11 @@ public: // Javascript or some other mechanism. However, we need the search // floater and login page to handle these URLs. Those are safe // because we control the page content. See DEV-9530. JC. - void setTrusted( bool valIn ); - void setHomePageUrl( const std::string& urlIn, const std::string& mime_type = LLStringUtil::null ); std::string getHomePageUrl(); + void setTarget(const std::string& target); + // set/clear URL to visit when a 404 page is reached void set404RedirectUrl( std::string redirect_url ); void clr404RedirectUrl(); @@ -140,6 +143,8 @@ public: void setTextureSize(S32 width, S32 height); + void showNotification(boost::shared_ptr<class LLNotification> notify); + void hideNotification(); // over-rides virtual BOOL handleKeyHere( KEY key, MASK mask); @@ -161,16 +166,21 @@ public: private: void onVisibilityChange ( const LLSD& new_visibility ); + void onPopup(const LLSD& notification, const LLSD& response); + void onCloseNotification(); + void onClickNotificationButton(const std::string& name); + void onClickIgnore(LLUICtrl* ctrl); const S32 mTextureDepthBytes; LLUUID mMediaTextureID; LLViewBorder* mBorder; bool mFrequentUpdates; bool mForceUpdate; - bool mTrusted; + const bool mTrusted; std::string mHomePageUrl; std::string mHomePageMimeType; std::string mCurrentNavUrl; + std::string mTarget; bool mIgnoreUIScale; bool mAlwaysRefresh; viewer_media_t mMediaSource; @@ -183,6 +193,7 @@ public: S32 mTextureWidth; S32 mTextureHeight; bool mClearCache; + boost::shared_ptr<class LLNotification> mCurNotification; }; #endif // LL_LLMediaCtrl_H diff --git a/indra/newview/llmetricperformancetester.cpp b/indra/newview/llmetricperformancetester.cpp deleted file mode 100644 index 903c97378e..0000000000 --- a/indra/newview/llmetricperformancetester.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/** - * @file llmetricperformancetester.cpp - * @brief LLMetricPerformanceTester class implementation - * - * $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 "indra_constants.h" -#include "llerror.h" -#include "llmath.h" -#include "llfontgl.h" -#include "llsdserialize.h" -#include "llstat.h" -#include "lltreeiterators.h" -#include "llmetricperformancetester.h" - -LLMetricPerformanceTester::name_tester_map_t LLMetricPerformanceTester::sTesterMap ; - -//static -void LLMetricPerformanceTester::initClass() -{ -} -//static -void LLMetricPerformanceTester::cleanClass() -{ - for(name_tester_map_t::iterator iter = sTesterMap.begin() ; iter != sTesterMap.end() ; ++iter) - { - delete iter->second ; - } - sTesterMap.clear() ; -} - -//static -void LLMetricPerformanceTester::addTester(LLMetricPerformanceTester* tester) -{ - if(!tester) - { - llerrs << "invalid tester!" << llendl ; - return ; - } - - std::string name = tester->getName() ; - if(getTester(name)) - { - llerrs << "Tester name is used by some other tester: " << name << llendl ; - return ; - } - - sTesterMap.insert(std::make_pair(name, tester)); - - return ; -} - -//static -LLMetricPerformanceTester* LLMetricPerformanceTester::getTester(std::string label) -{ - name_tester_map_t::iterator found_it = sTesterMap.find(label) ; - if(found_it != sTesterMap.end()) - { - return found_it->second ; - } - - return NULL ; -} - -LLMetricPerformanceTester::LLMetricPerformanceTester(std::string name, BOOL use_default_performance_analysis) - : mName(name), - mBaseSessionp(NULL), - mCurrentSessionp(NULL), - mCount(0), - mUseDefaultPerformanceAnalysis(use_default_performance_analysis) -{ - if(mName == std::string()) - { - llerrs << "invalid name." << llendl ; - } - - LLMetricPerformanceTester::addTester(this) ; -} - -/*virtual*/ -LLMetricPerformanceTester::~LLMetricPerformanceTester() -{ - if(mBaseSessionp) - { - delete mBaseSessionp ; - mBaseSessionp = NULL ; - } - if(mCurrentSessionp) - { - delete mCurrentSessionp ; - mCurrentSessionp = NULL ; - } -} - -void LLMetricPerformanceTester::incLabel() -{ - mCurLabel = llformat("%s-%d", mName.c_str(), mCount++) ; -} -void LLMetricPerformanceTester::preOutputTestResults(LLSD* sd) -{ - incLabel() ; - (*sd)[mCurLabel]["Name"] = mName ; -} -void LLMetricPerformanceTester::postOutputTestResults(LLSD* sd) -{ - LLMutexLock lock(LLFastTimer::sLogLock); - LLFastTimer::sLogQueue.push((*sd)); -} - -void LLMetricPerformanceTester::outputTestResults() -{ - LLSD sd ; - preOutputTestResults(&sd) ; - - outputTestRecord(&sd) ; - - postOutputTestResults(&sd) ; -} - -void LLMetricPerformanceTester::addMetricString(std::string str) -{ - mMetricStrings.push_back(str) ; -} - -const std::string& LLMetricPerformanceTester::getMetricString(U32 index) const -{ - return mMetricStrings[index] ; -} - -void LLMetricPerformanceTester::prePerformanceAnalysis() -{ - mCount = 0 ; - incLabel() ; -} - -// -//default analyzing the performance -// -/*virtual*/ -void LLMetricPerformanceTester::analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) -{ - if(mUseDefaultPerformanceAnalysis)//use default performance analysis - { - prePerformanceAnalysis() ; - - BOOL in_base = (*base).has(mCurLabel) ; - BOOL in_current = (*current).has(mCurLabel) ; - - while(in_base || in_current) - { - LLSD::String label = mCurLabel ; - - if(in_base && in_current) - { - *os << llformat("%s\n", label.c_str()) ; - - for(U32 index = 0 ; index < mMetricStrings.size() ; index++) - { - switch((*current)[label][ mMetricStrings[index] ].type()) - { - case LLSD::TypeInteger: - compareTestResults(os, mMetricStrings[index], - (S32)((*base)[label][ mMetricStrings[index] ].asInteger()), (S32)((*current)[label][ mMetricStrings[index] ].asInteger())) ; - break ; - case LLSD::TypeReal: - compareTestResults(os, mMetricStrings[index], - (F32)((*base)[label][ mMetricStrings[index] ].asReal()), (F32)((*current)[label][ mMetricStrings[index] ].asReal())) ; - break; - default: - llerrs << "unsupported metric " << mMetricStrings[index] << " LLSD type: " << (S32)(*current)[label][ mMetricStrings[index] ].type() << llendl ; - } - } - } - - incLabel() ; - in_base = (*base).has(mCurLabel) ; - in_current = (*current).has(mCurLabel) ; - } - }//end of default - else - { - //load the base session - prePerformanceAnalysis() ; - mBaseSessionp = loadTestSession(base) ; - - //load the current session - prePerformanceAnalysis() ; - mCurrentSessionp = loadTestSession(current) ; - - if(!mBaseSessionp || !mCurrentSessionp) - { - llerrs << "memory error during loading test sessions." << llendl ; - } - - //compare - compareTestSessions(os) ; - - //release memory - if(mBaseSessionp) - { - delete mBaseSessionp ; - mBaseSessionp = NULL ; - } - if(mCurrentSessionp) - { - delete mCurrentSessionp ; - mCurrentSessionp = NULL ; - } - } -} - -//virtual -void LLMetricPerformanceTester::compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) -{ - *os << llformat(" ,%s, %d, %d, %d, %.4f\n", metric_string.c_str(), v_base, v_current, - v_current - v_base, (v_base != 0) ? 100.f * v_current / v_base : 0) ; -} - -//virtual -void LLMetricPerformanceTester::compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) -{ - *os << llformat(" ,%s, %.4f, %.4f, %.4f, %.4f\n", metric_string.c_str(), v_base, v_current, - v_current - v_base, (fabs(v_base) > 0.0001f) ? 100.f * v_current / v_base : 0.f ) ; -} - -//virtual -LLMetricPerformanceTester::LLTestSession::~LLTestSession() -{ -} - diff --git a/indra/newview/llmetricperformancetester.h b/indra/newview/llmetricperformancetester.h deleted file mode 100644 index 6f5dc03564..0000000000 --- a/indra/newview/llmetricperformancetester.h +++ /dev/null @@ -1,153 +0,0 @@ -/** - * @file LLMetricPerformanceTester.h - * @brief LLMetricPerformanceTester class definition - * - * $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_METRICPERFORMANCETESTER_H -#define LL_METRICPERFORMANCETESTER_H - -class LLMetricPerformanceTester -{ -public: - // - //name passed to the constructor is a unique string for each tester. - //an error is reported if the name is already used by some other tester. - // - LLMetricPerformanceTester(std::string name, BOOL use_default_performance_analysis) ; - virtual ~LLMetricPerformanceTester(); - - // - //return the name of the tester - // - std::string getName() const { return mName ;} - // - //return the number of the test metrics in this tester - // - S32 getNumOfMetricStrings() const { return mMetricStrings.size() ;} - // - //return the metric string at the index - // - const std::string& getMetricString(U32 index) const ; - - // - //this function to compare the test results. - //by default, it compares the test results against the baseline one by one, item by item, - //in the increasing order of the LLSD label counter, starting from the first one. - //you can define your own way to analyze performance by passing FALSE to "use_default_performance_analysis", - //and implement two abstract virtual functions below: loadTestSession(...) and compareTestSessions(...). - // - void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; - -protected: - // - //insert metric strings used in the tester. - // - void addMetricString(std::string str) ; - - // - //increase LLSD label by 1 - // - void incLabel() ; - - // - //the function to write a set of test results to the log LLSD. - // - void outputTestResults() ; - - // - //compare the test results. - //you can write your own to overwrite the default one. - // - virtual void compareTestResults(std::ofstream* os, std::string metric_string, S32 v_base, S32 v_current) ; - virtual void compareTestResults(std::ofstream* os, std::string metric_string, F32 v_base, F32 v_current) ; - - // - //for performance analysis use - //it defines an interface for the two abstract virtual functions loadTestSession(...) and compareTestSessions(...). - //please make your own test session class derived from it. - // - class LLTestSession - { - public: - virtual ~LLTestSession() ; - }; - - // - //load a test session for log LLSD - //you need to implement it only when you define your own way to analyze performance. - //otherwise leave it empty. - // - virtual LLMetricPerformanceTester::LLTestSession* loadTestSession(LLSD* log) = 0 ; - // - //compare the base session and the target session - //you need to implement it only when you define your own way to analyze performance. - //otherwise leave it empty. - // - virtual void compareTestSessions(std::ofstream* os) = 0 ; - // - //the function to write a set of test results to the log LLSD. - //you have to write you own version of this function. - // - virtual void outputTestRecord(LLSD* sd) = 0 ; - -private: - void preOutputTestResults(LLSD* sd) ; - void postOutputTestResults(LLSD* sd) ; - void prePerformanceAnalysis() ; - -protected: - // - //the unique name string of the tester - // - std::string mName ; - // - //the current label counter for the log LLSD - // - std::string mCurLabel ; - S32 mCount ; - - BOOL mUseDefaultPerformanceAnalysis ; - LLTestSession* mBaseSessionp ; - LLTestSession* mCurrentSessionp ; - - //metrics strings - std::vector< std::string > mMetricStrings ; - -//static members -private: - static void addTester(LLMetricPerformanceTester* tester) ; - -public: - typedef std::map< std::string, LLMetricPerformanceTester* > name_tester_map_t; - static name_tester_map_t sTesterMap ; - - static LLMetricPerformanceTester* getTester(std::string label) ; - static BOOL hasMetricPerformanceTesters() {return !sTesterMap.empty() ;} - - static void initClass() ; - static void cleanClass() ; -}; - -#endif - diff --git a/indra/newview/llmorphview.h b/indra/newview/llmorphview.h index d135659ba2..1d8ee8e944 100644 --- a/indra/newview/llmorphview.h +++ b/indra/newview/llmorphview.h @@ -32,7 +32,6 @@ #include "llframetimer.h" class LLJoint; -class LLFloaterCustomize; class LLMorphView : public LLView { diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp index 3d0f4cc1ed..6658e1d7e8 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -39,7 +39,9 @@ #include "llvoavatarself.h" // to check gAgentAvatarp->isSitting() #include "llbottomtray.h" #include "llbutton.h" +#include "llfirstuse.h" #include "llfloaterreg.h" +#include "llhints.h" #include "lljoystickbutton.h" #include "lluictrlfactory.h" #include "llviewerwindow.h" @@ -161,6 +163,7 @@ void LLFloaterMove::setVisible(BOOL visible) if (visible) { + LLFirstUse::notMoving(false); // Attach the Stand/Stop Flying panel. LLPanelStandStopFlying* ssf_panel = LLPanelStandStopFlying::getInstance(); ssf_panel->reparent(this); @@ -560,6 +563,11 @@ void LLPanelStandStopFlying::setStandStopFlyingMode(EStandStopFlyingMode mode) { LLPanelStandStopFlying* panel = getInstance(); + if (mode == SSFM_STAND) + { + LLFirstUse::sit(); + LLFirstUse::notMoving(false); + } panel->mStandButton->setVisible(SSFM_STAND == mode); panel->mStopFlyingButton->setVisible(SSFM_STOP_FLYING == mode); @@ -590,6 +598,7 @@ BOOL LLPanelStandStopFlying::postBuild() mStandButton->setCommitCallback(boost::bind(&LLPanelStandStopFlying::onStandButtonClick, this)); mStandButton->setCommitCallback(boost::bind(&LLFloaterMove::enableInstance, TRUE)); mStandButton->setVisible(FALSE); + LLHints::registerHintTarget("stand_btn", mStandButton->getHandle()); mStopFlyingButton = getChild<LLButton>("stop_fly_btn"); //mStopFlyingButton->setCommitCallback(boost::bind(&LLFloaterMove::setFlyingMode, FALSE)); @@ -688,7 +697,7 @@ void LLPanelStandStopFlying::reparent(LLFloaterMove* move_view) LLPanelStandStopFlying* LLPanelStandStopFlying::getStandStopFlyingPanel() { LLPanelStandStopFlying* panel = new LLPanelStandStopFlying(); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_stand_stop_flying.xml"); + panel->buildFromFile("panel_stand_stop_flying.xml"); panel->setVisible(FALSE); //LLUI::getRootView()->addChild(panel); @@ -701,6 +710,8 @@ LLPanelStandStopFlying* LLPanelStandStopFlying::getStandStopFlyingPanel() void LLPanelStandStopFlying::onStandButtonClick() { + LLFirstUse::sit(false); + LLSelectMgr::getInstance()->deselectAllForStandingUp(); gAgent.setControlFlags(AGENT_CONTROL_STAND_UP); diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp index eb00663d3f..af8fdb17cf 100644 --- a/indra/newview/llmutelist.cpp +++ b/indra/newview/llmutelist.cpp @@ -112,9 +112,8 @@ LLMute::LLMute(const LLUUID& id, const std::string& name, EType type, U32 flags) LLNameValue* lastname = mute_object->getNVPair("LastName"); if (firstname && lastname) { - mName.assign( firstname->getString() ); - mName.append(" "); - mName.append( lastname->getString() ); + mName = LLCacheName::buildFullName( + firstname->getString(), lastname->getString()); } mType = mute_object->isAvatar() ? AGENT : OBJECT; } @@ -410,7 +409,7 @@ void LLMuteList::updateRemove(const LLMute& mute) gAgent.sendReliableMessage(); } -void notify_automute_callback(const LLUUID& agent_id, const std::string& first_name, const std::string& last_name, BOOL is_group, LLMuteList::EAutoReason reason) +void notify_automute_callback(const LLUUID& agent_id, const std::string& full_name, bool is_group, LLMuteList::EAutoReason reason) { std::string notif_name; switch (reason) @@ -428,8 +427,7 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n } LLSD args; - args["FIRST"] = first_name; - args["LAST"] = last_name; + args["NAME"] = full_name; LLNotificationPtr notif_ptr = LLNotifications::instance().add(notif_name, args, LLSD()); if (notif_ptr) @@ -444,7 +442,7 @@ void notify_automute_callback(const LLUUID& agent_id, const std::string& first_n } -BOOL LLMuteList::autoRemove(const LLUUID& agent_id, const EAutoReason reason, const std::string& first_name, const std::string& last_name) +BOOL LLMuteList::autoRemove(const LLUUID& agent_id, const EAutoReason reason) { BOOL removed = FALSE; @@ -454,24 +452,17 @@ BOOL LLMuteList::autoRemove(const LLUUID& agent_id, const EAutoReason reason, co removed = TRUE; remove(automute); - if (first_name.empty() && last_name.empty()) - { - std::string cache_first, cache_last; - if (gCacheName->getName(agent_id, cache_first, cache_last)) + std::string full_name; + if (gCacheName->getFullName(agent_id, full_name)) { // name in cache, call callback directly - notify_automute_callback(agent_id, cache_first, cache_last, FALSE, reason); + notify_automute_callback(agent_id, full_name, false, reason); } else { // not in cache, lookup name from cache - gCacheName->get(agent_id, FALSE, boost::bind(¬ify_automute_callback, _1, _2, _3, _4, reason)); - } - } - else - { - // call callback directly - notify_automute_callback(agent_id, first_name, last_name, FALSE, reason); + gCacheName->get(agent_id, false, + boost::bind(¬ify_automute_callback, _1, _2, _3, reason)); } } diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h index 62c72dd9c6..04e1570081 100644 --- a/indra/newview/llmutelist.h +++ b/indra/newview/llmutelist.h @@ -63,7 +63,7 @@ public: public: LLUUID mID; // agent or object id - std::string mName; // agent or object name + std::string mName; // agent or object name, does not store last name "Resident" EType mType; // needed for UI display of existing mutes U32 mFlags; // flags pertaining to this mute entry }; @@ -96,7 +96,7 @@ public: // Remove both normal and legacy mutes, for any or all properties. BOOL remove(const LLMute& mute, U32 flags = 0); - BOOL autoRemove(const LLUUID& agent_id, const EAutoReason reason, const std::string& first_name = LLStringUtil::null, const std::string& last_name = LLStringUtil::null); + BOOL autoRemove(const LLUUID& agent_id, const EAutoReason reason); // Name is required to test against legacy text-only mutes. BOOL isMuted(const LLUUID& id, const std::string& name = LLStringUtil::null, U32 flags = 0) const; diff --git a/indra/newview/llnamebox.cpp b/indra/newview/llnamebox.cpp index 74d4217899..1099316a19 100644 --- a/indra/newview/llnamebox.cpp +++ b/indra/newview/llnamebox.cpp @@ -47,6 +47,7 @@ LLNameBox::LLNameBox(const Params& p) { mNameID = LLUUID::null; mLink = p.link; + mParseHTML = mLink; // STORM-215 mInitialValue = p.initial_value().asString(); LLNameBox::sInstances.insert(this); setText(LLStringUtil::null); @@ -81,26 +82,15 @@ void LLNameBox::setNameID(const LLUUID& name_id, BOOL is_group) setText(mInitialValue); } -void LLNameBox::refresh(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group) +void LLNameBox::refresh(const LLUUID& id, const std::string& full_name, bool is_group) { if (id == mNameID) { - std::string name; - if (!is_group) - { - name = firstname + " " + lastname; - } - else - { - name = firstname; - } - setName(name, is_group); + setName(full_name, is_group); } } -void LLNameBox::refreshAll(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group) +void LLNameBox::refreshAll(const LLUUID& id, const std::string& full_name, bool is_group) { std::set<LLNameBox*>::iterator it; for (it = LLNameBox::sInstances.begin(); @@ -108,7 +98,7 @@ void LLNameBox::refreshAll(const LLUUID& id, const std::string& firstname, ++it) { LLNameBox* box = *it; - box->refresh(id, firstname, lastname, is_group); + box->refresh(id, full_name, is_group); } } @@ -119,7 +109,7 @@ void LLNameBox::setName(const std::string& name, BOOL is_group) std::string url; if (is_group) - url = "[secondlife:///app/group/" + LLURI::escape(name) + "/about " + name + "]"; + url = "[secondlife:///app/group/" + mNameID.asString() + "/about " + name + "]"; else url = "[secondlife:///app/agent/" + mNameID.asString() + "/about " + name + "]"; diff --git a/indra/newview/llnamebox.h b/indra/newview/llnamebox.h index dbabcc0e52..76e8551268 100644 --- a/indra/newview/llnamebox.h +++ b/indra/newview/llnamebox.h @@ -53,10 +53,9 @@ public: void setNameID(const LLUUID& name_id, BOOL is_group); - void refresh(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + void refresh(const LLUUID& id, const std::string& full_name, bool is_group); - static void refreshAll(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group); + static void refreshAll(const LLUUID& id, const std::string& full_name, bool is_group); protected: LLNameBox (const Params&); diff --git a/indra/newview/llnameeditor.cpp b/indra/newview/llnameeditor.cpp index f53252b614..b3b1ff7c06 100644 --- a/indra/newview/llnameeditor.cpp +++ b/indra/newview/llnameeditor.cpp @@ -75,26 +75,15 @@ void LLNameEditor::setNameID(const LLUUID& name_id, BOOL is_group) setText(name); } -void LLNameEditor::refresh(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group) +void LLNameEditor::refresh(const LLUUID& id, const std::string& full_name, bool is_group) { if (id == mNameID) { - std::string name; - if (!is_group) - { - name = firstname + " " + lastname; - } - else - { - name = firstname; - } - setText(name); + setText(full_name); } } -void LLNameEditor::refreshAll(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group) +void LLNameEditor::refreshAll(const LLUUID& id, const std::string& full_name, bool is_group) { std::set<LLNameEditor*>::iterator it; for (it = LLNameEditor::sInstances.begin(); @@ -102,7 +91,7 @@ void LLNameEditor::refreshAll(const LLUUID& id, const std::string& firstname, ++it) { LLNameEditor* box = *it; - box->refresh(id, firstname, lastname, is_group); + box->refresh(id, full_name, is_group); } } diff --git a/indra/newview/llnameeditor.h b/indra/newview/llnameeditor.h index d8360f9f4b..b8c4a6042e 100644 --- a/indra/newview/llnameeditor.h +++ b/indra/newview/llnameeditor.h @@ -59,10 +59,9 @@ public: void setNameID(const LLUUID& name_id, BOOL is_group); - void refresh(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + void refresh(const LLUUID& id, const std::string& full_name, bool is_group); - static void refreshAll(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group); + static void refreshAll(const LLUUID& id, const std::string& full_name, bool is_group); // Take/return agent UUIDs diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp index e7e60f544c..38100aa6c5 100644 --- a/indra/newview/llnamelistctrl.cpp +++ b/indra/newview/llnamelistctrl.cpp @@ -30,6 +30,7 @@ #include <boost/tokenizer.hpp> +#include "llavatarnamecache.h" #include "llcachename.h" #include "llfloaterreg.h" #include "llinventory.h" @@ -38,6 +39,7 @@ #include "llscrolllistcolumn.h" #include "llsdparam.h" #include "lltooltip.h" +#include "lltrans.h" static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list"); @@ -52,7 +54,8 @@ void LLNameListCtrl::NameTypeNames::declareValues() LLNameListCtrl::Params::Params() : name_column(""), - allow_calling_card_drop("allow_calling_card_drop", false) + allow_calling_card_drop("allow_calling_card_drop", false), + short_names("short_names", false) { name = "name_list"; } @@ -61,7 +64,8 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p) : LLScrollListCtrl(p), mNameColumnIndex(p.name_column.column_index), mNameColumn(p.name_column.column_name), - mAllowCallingCardDrop(p.allow_calling_card_drop) + mAllowCallingCardDrop(p.allow_calling_card_drop), + mShortNames(p.short_names) {} // public @@ -253,7 +257,8 @@ void LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition po LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata) { LLNameListCtrl::NameItem item_params; - LLParamSDParser::instance().readSD(element, item_params); + LLParamSDParser parser; + parser.readSD(element, item_params); item_params.userdata = userdata; return addNameItemRow(item_params, pos); } @@ -291,10 +296,24 @@ LLScrollListItem* LLNameListCtrl::addNameItemRow( break; case INDIVIDUAL: { - std::string name; - if (gCacheName->getFullName(id, name)) + LLAvatarName av_name; + if (id.isNull()) { - fullname = name; + fullname = LLTrans::getString("AvatarNameNobody"); + } + else if (LLAvatarNameCache::get(id, &av_name)) + { + if (mShortNames) + fullname = av_name.mDisplayName; + else + fullname = av_name.getCompleteName(); + } + else + { + // ...schedule a callback + LLAvatarNameCache::get(id, + boost::bind(&LLNameListCtrl::onAvatarNameCache, + this, _1, _2)); } break; } @@ -349,34 +368,25 @@ void LLNameListCtrl::removeNameItem(const LLUUID& agent_id) } } -// public -void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first, - const std::string& last, BOOL is_group) +void LLNameListCtrl::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) { - //llinfos << "LLNameListCtrl::refresh " << id << " '" << first << " " - // << last << "'" << llendl; - - std::string fullname; - if (!is_group) - { - fullname = first + " " + last; - } + std::string name; + if (mShortNames) + name = av_name.mDisplayName; else - { - fullname = first; - } + name = av_name.getCompleteName(); - // TODO: scan items for that ID, fix if necessary item_list::iterator iter; for (iter = getItemList().begin(); iter != getItemList().end(); iter++) { LLScrollListItem* item = *iter; - if (item->getUUID() == id) + if (item->getUUID() == agent_id) { LLScrollListCell* cell = item->getColumn(mNameColumnIndex); if (cell) { - cell->setValue(fullname); + cell->setValue(name); } } } @@ -385,19 +395,6 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first, } -// static -void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first, - const std::string& last, BOOL is_group) -{ - LLInstanceTrackerScopedGuard guard; - LLInstanceTracker<LLNameListCtrl>::instance_iter it; - for (it = guard.beginInstances(); it != guard.endInstances(); ++it) - { - LLNameListCtrl& ctrl = *it; - ctrl.refresh(id, first, last, is_group); - } -} - void LLNameListCtrl::updateColumns() { LLScrollListCtrl::updateColumns(); diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 981e3df16b..6805630ef1 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -31,6 +31,7 @@ #include "llscrolllistctrl.h" +class LLAvatarName; class LLNameListCtrl : public LLScrollListCtrl, public LLInstanceTracker<LLNameListCtrl> @@ -74,6 +75,7 @@ public: { Optional<NameColumn> name_column; Optional<bool> allow_calling_card_drop; + Optional<bool> short_names; Params(); }; @@ -99,11 +101,6 @@ public: void removeNameItem(const LLUUID& agent_id); - void refresh(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); - - static void refreshAll(const LLUUID& id, const std::string& firstname, - const std::string& lastname, BOOL is_group); - // LLView interface /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void *cargo_data, @@ -118,11 +115,13 @@ public: /*virtual*/ void mouseOverHighlightNthItem( S32 index ); private: void showInspector(const LLUUID& avatar_id, bool is_group); + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); private: S32 mNameColumnIndex; std::string mNameColumn; BOOL mAllowCallingCardDrop; + bool mShortNames; // display name only, no SLID }; /** diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 18bba6e358..58849393b4 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -272,7 +272,7 @@ LLNavigationBar::LLNavigationBar() mPurgeTPHistoryItems(false), mSaveToLocationHistory(false) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_navigation_bar.xml"); + buildFromFile( "panel_navigation_bar.xml"); // set a listener function for LoginComplete event LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this)); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 28aea7ae3d..180695e40b 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -46,6 +46,8 @@ #include "llchathistory.h" #include "llstylemap.h" +#include "llavatarnamecache.h" + #include "lldraghandle.h" #include "llbottomtray.h" @@ -55,12 +57,6 @@ static const S32 RESIZE_BAR_THICKNESS = 3; -const static std::string IM_TIME("time"); -const static std::string IM_TEXT("message"); -const static std::string IM_FROM("from"); -const static std::string IM_FROM_ID("from_id"); - - LLNearbyChat::LLNearbyChat(const LLSD& key) : LLDockableFloater(NULL, false, false, key) ,mChatHistory(NULL) @@ -185,7 +181,21 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args) if (gSavedPerAccountSettings.getBOOL("LogNearbyChat")) { - LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText); + std::string from_name = chat.mFromName; + + if (chat.mSourceType == CHAT_SOURCE_AGENT) + { + // if the chat is coming from an agent, log the complete name + LLAvatarName av_name; + LLAvatarNameCache::get(chat.mFromID, &av_name); + + if (!av_name.mIsDisplayNameDefault) + { + from_name = av_name.getCompleteName(); + } + } + + LLLogChat::saveHistory("chat", from_name, chat.mFromID, chat.mText); } } @@ -254,11 +264,23 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue) nearby_chat->updateChatHistoryStyle(); } -bool isTwoWordsName(const std::string& name) +bool isWordsName(const std::string& name) { - //checking for a single space - S32 pos = name.find(' ', 0); - return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos; + // checking to see if it's display name plus username in parentheses + S32 open_paren = name.find(" (", 0); + S32 close_paren = name.find(')', 0); + + if (open_paren != std::string::npos && + close_paren == name.length()-1) + { + return true; + } + else + { + //checking for a single space + S32 pos = name.find(' ', 0); + return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos; + } } void LLNearbyChat::loadHistory() @@ -275,11 +297,16 @@ void LLNearbyChat::loadHistory() const LLSD& msg = *it; std::string from = msg[IM_FROM]; - LLUUID from_id = LLUUID::null; - if (msg[IM_FROM_ID].isUndefined()) + LLUUID from_id; + if (msg[IM_FROM_ID].isDefined()) { - gCacheName->getUUID(from, from_id); + from_id = msg[IM_FROM_ID].asUUID(); } + else + { + std::string legacy_name = gCacheName->buildLegacyName(from); + gCacheName->getUUID(legacy_name, from_id); + } LLChat chat; chat.mFromName = from; @@ -296,7 +323,7 @@ void LLNearbyChat::loadHistory() } else if (from_id.isNull()) { - chat.mSourceType = isTwoWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT; + chat.mSourceType = isWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT; } addMessage(chat, true, do_not_log); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index a8e4a759b7..932ad75f29 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -32,6 +32,7 @@ #include "llfloaterreg.h" #include "lltrans.h" +#include "llfirstuse.h" #include "llnearbychatbar.h" #include "llbottomtray.h" #include "llagent.h" @@ -391,8 +392,7 @@ LLCtrlListInterface* LLGestureComboList::getListInterface() } LLNearbyChatBar::LLNearbyChatBar() - : LLPanel() - , mChatBox(NULL) +: mChatBox(NULL) { mSpeakerMgr = LLLocalSpeakerMgr::getInstance(); } @@ -484,6 +484,7 @@ BOOL LLNearbyChatBar::matchChatTypeTrigger(const std::string& in_str, std::strin void LLNearbyChatBar::onChatBoxKeystroke(LLLineEditor* caller, void* userdata) { + LLFirstUse::otherAvatarChatFirst(false); LLNearbyChatBar* self = (LLNearbyChatBar *)userdata; @@ -873,14 +874,14 @@ public: } else { - S32 channel = tokens[0].asInteger(); + S32 channel = tokens[0].asInteger(); // VWR-19499 Restrict function to chat channels greater than 0. if ((channel > 0) && (channel < 2147483647)) { retval = true; - // Send unescaped message, see EXT-6353. - std::string unescaped_mesg (LLURI::unescape(tokens[1].asString())); - send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel); + // Send unescaped message, see EXT-6353. + std::string unescaped_mesg (LLURI::unescape(tokens[1].asString())); + send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel); } else { diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index c80583cd0e..d2ad78f140 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -31,7 +31,9 @@ #include "llbottomtray.h" #include "llchatitemscontainerctrl.h" +#include "llfirstuse.h" #include "llfloaterscriptdebug.h" +#include "llhints.h" #include "llnearbychat.h" #include "llrecentpeople.h" @@ -56,7 +58,25 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase { LOG_CLASS(LLNearbyChatScreenChannel); public: - LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;}; + typedef std::vector<LLHandle<LLToast> > toast_vec_t; + typedef std::list<LLHandle<LLToast> > toast_list_t; + + LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) + { + mStopProcessing = false; + + LLControlVariable* ctrl = gSavedSettings.getControl("NearbyToastLifeTime").get(); + if (ctrl) + { + ctrl->getSignal()->connect(boost::bind(&LLNearbyChatScreenChannel::updateToastsLifetime, this)); + } + + ctrl = gSavedSettings.getControl("NearbyToastFadingTime").get(); + if (ctrl) + { + ctrl->getSignal()->connect(boost::bind(&LLNearbyChatScreenChannel::updateToastFadingTime, this)); + } + } void addNotification (LLSD& notification); void arrangeToasts (); @@ -76,15 +96,12 @@ public: } // hide all toasts from screen, but not remove them from a channel - virtual void hideToastsFromScreen() - { - }; // removes all toasts from a channel virtual void removeToastsFromChannel() { - for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) + for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) { - addToToastPool((*it)); + addToToastPool(it->get()); } m_active_toasts.clear(); }; @@ -101,21 +118,35 @@ protected: void deactivateToast(LLToast* toast); void addToToastPool(LLToast* toast) { + if (!toast) return; LL_DEBUGS("NearbyChat") << "Pooling toast" << llendl; toast->setVisible(FALSE); - toast->stopTimer(); + toast->stopFading(); toast->setIsHidden(true); - m_toast_pool.push_back(toast); + + // Nearby chat toasts that are hidden, not destroyed. They are collected to the toast pool, so that + // they can be used next time, this is done for performance. But if the toast lifetime was changed + // (from preferences floater (STORY-36)) while it was shown (at this moment toast isn't in the pool yet) + // changes don't take affect. + // So toast's lifetime should be updated each time it's added to the pool. Otherwise viewer would have + // to be restarted so that changes take effect. + toast->setLifetime(gSavedSettings.getS32("NearbyToastLifeTime")); + toast->setFadingTime(gSavedSettings.getS32("NearbyToastFadingTime")); + m_toast_pool.push_back(toast->getHandle()); } void createOverflowToast(S32 bottom, F32 timer); + void updateToastsLifetime(); + + void updateToastFadingTime(); + create_toast_panel_callback_t m_create_toast_panel_callback_t; bool createPoolToast(); - std::vector<LLToast*> m_active_toasts; - std::list<LLToast*> m_toast_pool; + toast_vec_t m_active_toasts; + toast_list_t m_toast_pool; bool mStopProcessing; }; @@ -148,7 +179,7 @@ private: void LLNearbyChatScreenChannel::deactivateToast(LLToast* toast) { - std::vector<LLToast*>::iterator pos = std::find(m_active_toasts.begin(), m_active_toasts.end(), toast); + toast_vec_t::iterator pos = std::find(m_active_toasts.begin(), m_active_toasts.end(), toast->getHandle()); if (pos == m_active_toasts.end()) { @@ -173,8 +204,8 @@ void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitti { // Viewer is quitting. // Immediately stop processing chat messages (EXT-1419). - mStopProcessing = true; - } + mStopProcessing = true; +} else { // The toast is being closed by user (STORM-192). @@ -185,7 +216,7 @@ void LLNearbyChatScreenChannel::onToastDestroyed(LLToast* toast, bool app_quitti } void LLNearbyChatScreenChannel::onToastFade(LLToast* toast) -{ +{ LL_DEBUGS("NearbyChat") << "Toast fading" << llendl; //fade mean we put toast to toast pool @@ -199,6 +230,27 @@ void LLNearbyChatScreenChannel::onToastFade(LLToast* toast) arrangeToasts(); } +void LLNearbyChatScreenChannel::updateToastsLifetime() +{ + S32 seconds = gSavedSettings.getS32("NearbyToastLifeTime"); + toast_list_t::iterator it; + + for(it = m_toast_pool.begin(); it != m_toast_pool.end(); ++it) + { + (*it).get()->setLifetime(seconds); + } +} + +void LLNearbyChatScreenChannel::updateToastFadingTime() +{ + S32 seconds = gSavedSettings.getS32("NearbyToastFadingTime"); + toast_list_t::iterator it; + + for(it = m_toast_pool.begin(); it != m_toast_pool.end(); ++it) + { + (*it).get()->setFadingTime(seconds); + } +} bool LLNearbyChatScreenChannel::createPoolToast() { @@ -215,9 +267,9 @@ bool LLNearbyChatScreenChannel::createPoolToast() toast->setOnFadeCallback(boost::bind(&LLNearbyChatScreenChannel::onToastFade, this, _1)); - - LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl; - m_toast_pool.push_back(toast); + + LL_DEBUGS("NearbyChat") << "Creating and pooling toast" << llendl; + m_toast_pool.push_back(toast->getHandle()); return true; } @@ -235,17 +287,20 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) { LLUUID fromID = notification["from_id"].asUUID(); // agent id or object id std::string from = notification["from"].asString(); - LLToast* toast = m_active_toasts[0]; - LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel()); - - if(panel && panel->messageID() == fromID && panel->getFromName() == from && panel->canAddText()) + LLToast* toast = m_active_toasts[0].get(); + if (toast) { - panel->addMessage(notification); - toast->reshapeToPanel(); - toast->resetTimer(); - - arrangeToasts(); - return; + LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel()); + + if(panel && panel->messageID() == fromID && panel->getFromName() == from && panel->canAddText()) + { + panel->addMessage(notification); + toast->reshapeToPanel(); + toast->startFading(); + + arrangeToasts(); + return; + } } } @@ -275,7 +330,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) //take 1st element from pool, (re)initialize it, put it in active toasts LL_DEBUGS("NearbyChat") << "Getting toast from pool" << llendl; - LLToast* toast = m_toast_pool.back(); + LLToast* toast = m_toast_pool.back().get(); m_toast_pool.pop_back(); @@ -286,28 +341,39 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) panel->init(notification); toast->reshapeToPanel(); - toast->resetTimer(); + toast->startFading(); - m_active_toasts.push_back(toast); + m_active_toasts.push_back(toast->getHandle()); arrangeToasts(); } void LLNearbyChatScreenChannel::arrangeToasts() { - if(m_active_toasts.size() == 0 || isHovering()) - return; - - hideToastsFromScreen(); + if(!isHovering()) + { + showToastsBottom(); + } - showToastsBottom(); + if (m_active_toasts.empty()) + { + LLHints::registerHintTarget("incoming_chat", LLHandle<LLView>()); + } + else + { + LLToast* toast = m_active_toasts.front().get(); + if (toast) + { + LLHints::registerHintTarget("incoming_chat", m_active_toasts.front().get()->LLView::getHandle()); + } + } } -int sort_toasts_predicate(LLToast* first,LLToast* second) +int sort_toasts_predicate(LLHandle<LLToast> first, LLHandle<LLToast> second) { - F32 v1 = first->getTimer()->getEventTimer().getElapsedTimeF32(); - F32 v2 = second->getTimer()->getEventTimer().getElapsedTimeF32(); - return v1 < v2; + F32 v1 = first.get()->getTimeLeftToLive(); + F32 v2 = second.get()->getTimeLeftToLive(); + return v1 > v2; } void LLNearbyChatScreenChannel::showToastsBottom() @@ -324,20 +390,22 @@ void LLNearbyChatScreenChannel::showToastsBottom() //calc max visible item and hide other toasts. - for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) + for(toast_vec_t::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it) { - S32 toast_top = bottom + (*it)->getRect().getHeight() + margin; + LLToast* toast = it->get(); + if (!toast) continue; + + S32 toast_top = bottom + toast->getRect().getHeight() + margin; if(toast_top > gFloaterView->getRect().getHeight()) { while(it!=m_active_toasts.end()) { - addToToastPool((*it)); + addToToastPool(it->get()); it=m_active_toasts.erase(it); } break; } - LLToast* toast = (*it); toast_rect = toast->getRect(); toast_rect.setLeftTopAndSize(getRect().mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight()); @@ -348,14 +416,17 @@ void LLNearbyChatScreenChannel::showToastsBottom() // use reverse order to provide correct z-order and avoid toast blinking - for(std::vector<LLToast*>::reverse_iterator it = m_active_toasts.rbegin(); it != m_active_toasts.rend(); ++it) + for(toast_vec_t::reverse_iterator it = m_active_toasts.rbegin(); it != m_active_toasts.rend(); ++it) + { + LLToast* toast = it->get(); + if (toast) { - LLToast* toast = (*it); toast->setIsHidden(false); toast->setVisible(TRUE); + } + } } -} void LLNearbyChatScreenChannel::reshape (S32 width, S32 height, BOOL called_from_parent) { @@ -400,8 +471,6 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) { if(chat_msg.mMuted == TRUE) return; - if(chat_msg.mSourceType == CHAT_SOURCE_AGENT && chat_msg.mFromID.notNull()) - LLRecentPeople::instance().add(chat_msg.mFromID); if(chat_msg.mText.empty()) return;//don't process empty messages @@ -505,6 +574,12 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) channel->addNotification(notification); } + if(chat_msg.mSourceType == CHAT_SOURCE_AGENT + && chat_msg.mFromID.notNull() + && chat_msg.mFromID != gAgentID) + { + LLFirstUse::otherAvatarChatFirst(); + } } void LLNearbyChatHandler::onDeleteToast(LLToast* toast) diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp index 6db8001d57..f084002385 100644 --- a/indra/newview/llnetmap.cpp +++ b/indra/newview/llnetmap.cpp @@ -5,7 +5,7 @@ * * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2001-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 @@ -31,6 +31,7 @@ // Library includes (should move below) #include "indra_constants.h" +#include "llavatarnamecache.h" #include "llmath.h" #include "llfloaterreg.h" #include "llfocusmgr.h" @@ -568,56 +569,36 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask ) return FALSE; } - std::string avatar_name; - if(mClosestAgentToCursor.notNull() && gCacheName->getFullName(mClosestAgentToCursor, avatar_name)) + // If the cursor is near an avatar on the minimap, a mini-inspector will be + // shown for the avatar, instead of the normal map tooltip. + if (handleToolTipAgent(mClosestAgentToCursor)) { - // only show tooltip if same inspector not already open - LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_avatar"); - if (!existing_inspector - || !existing_inspector->getVisible() - || existing_inspector->getKey()["avatar_id"].asUUID() != mClosestAgentToCursor) - { - LLInspector::Params p; - p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); - p.message(avatar_name); - p.image.name("Inspector_I"); - p.click_callback(boost::bind(showAvatarInspector, mClosestAgentToCursor)); - p.visible_time_near(6.f); - p.visible_time_far(3.f); - p.delay_time(0.35f); - p.wrap(false); - - LLToolTipMgr::instance().show(p); - } return TRUE; } - LLStringUtil::format_map_t args; - LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( viewPosToGlobal( x, y ) ); - if( region ) - { - args["[REGION]"] = region->getName() + "\n"; - } - else - { - args["[REGION]"] = ""; - } - - std::string msg = mToolTipMsg; - LLStringUtil::format(msg, args); - LLRect sticky_rect; - // set sticky_rect - if (region) + std::string region_name; + LLViewerRegion* region = LLWorld::getInstance()->getRegionFromPosGlobal( viewPosToGlobal( x, y ) ); + if(region) { + // set sticky_rect S32 SLOP = 4; - localPointToScreen( - x - SLOP, y - SLOP, - &(sticky_rect.mLeft), &(sticky_rect.mBottom) ); + localPointToScreen(x - SLOP, y - SLOP, &(sticky_rect.mLeft), &(sticky_rect.mBottom)); sticky_rect.mRight = sticky_rect.mLeft + 2 * SLOP; sticky_rect.mTop = sticky_rect.mBottom + 2 * SLOP; + + region_name = region->getName(); + if (!region_name.empty()) + { + region_name += "\n"; + } } + LLStringUtil::format_map_t args; + args["[REGION]"] = region_name; + std::string msg = mToolTipMsg; + LLStringUtil::format(msg, args); + LLToolTipMgr::instance().show(LLToolTip::Params() .message(msg) .sticky_rect(sticky_rect)); @@ -625,6 +606,35 @@ BOOL LLNetMap::handleToolTip( S32 x, S32 y, MASK mask ) return TRUE; } +BOOL LLNetMap::handleToolTipAgent(const LLUUID& avatar_id) +{ + LLAvatarName av_name; + if (avatar_id.isNull() || !LLAvatarNameCache::get(avatar_id, &av_name)) + { + return FALSE; + } + + // only show tooltip if same inspector not already open + LLFloater* existing_inspector = LLFloaterReg::findInstance("inspect_avatar"); + if (!existing_inspector + || !existing_inspector->getVisible() + || existing_inspector->getKey()["avatar_id"].asUUID() != avatar_id) + { + LLInspector::Params p; + p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); + p.message(av_name.getCompleteName()); + p.image.name("Inspector_I"); + p.click_callback(boost::bind(showAvatarInspector, avatar_id)); + p.visible_time_near(6.f); + p.visible_time_far(3.f); + p.delay_time(0.35f); + p.wrap(false); + + LLToolTipMgr::instance().show(p); + } + return TRUE; +} + // static void LLNetMap::showAvatarInspector(const LLUUID& avatar_id) { diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h index e25ada4c95..e053b1c177 100644 --- a/indra/newview/llnetmap.h +++ b/indra/newview/llnetmap.h @@ -38,6 +38,7 @@ class LLColor4U; class LLCoordGL; class LLImageRaw; class LLViewerTexture; +class LLFloaterMap; class LLNetMap : public LLUICtrl { @@ -55,6 +56,7 @@ public: protected: LLNetMap (const Params & p); friend class LLUICtrlFactory; + friend class LLFloaterMap; public: virtual ~LLNetMap(); @@ -86,13 +88,14 @@ private: void drawTracking( const LLVector3d& pos_global, const LLColor4& color, BOOL draw_arrow = TRUE); + BOOL handleToolTipAgent(const LLUUID& avatar_id); static void showAvatarInspector(const LLUUID& avatar_id); void createObjectImage(); -private: static bool outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y, S32 slop); +private: bool mUpdateNow; LLUIColor mBackgroundColor; diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp index dcbf6b64ce..9d824dcd59 100644 --- a/indra/newview/llnotificationalerthandler.cpp +++ b/indra/newview/llnotificationalerthandler.cpp @@ -133,7 +133,7 @@ bool LLAlertHandler::processNotification(const LLSD& notify) if(channel) channel->killToastByNotificationID(notification->getID()); } - return true; + return false; } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index 9933a8a49c..9b7fdaef82 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -104,7 +104,7 @@ bool LLGroupHandler::processNotification(const LLSD& notify) { mChannel->killToastByNotificationID(notification->getID()); } - return true; + return false; } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 060eccf5c7..28a69f2373 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -263,6 +263,29 @@ protected: void onRejectToast(LLUUID& id); }; +/** + * Handler for UI hints. + */ +class LLHintHandler : public LLSingleton<LLHintHandler> +{ +public: + LLHintHandler(); + virtual ~LLHintHandler(); + + // base interface functions + virtual bool processNotification(const LLSD& notify); +}; + +/** + * Handler for browser notifications + */ +class LLBrowserNotification : public LLSingleton<LLBrowserNotification> +{ +public: + virtual bool processNotification(const LLSD& notify); + +}; + class LLHandlerUtil { public: diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp index 4231a73af1..70d588db52 100644 --- a/indra/newview/llnotificationhandlerutil.cpp +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -107,8 +107,11 @@ void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& notif) } const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"), - REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM( - "ObjectGiveItem"), PAYMENT_RECIVED("PaymentRecived"), + REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), + OBJECT_GIVE_ITEM("ObjectGiveItem"), + OBJECT_GIVE_ITEM_UNKNOWN_USER("ObjectGiveItemUnknownUser"), + PAYMENT_RECEIVED("PaymentReceived"), + PAYMENT_SENT("PaymentSent"), ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"), USER_GIVE_ITEM("UserGiveItem"), INVENTORY_ACCEPTED("InventoryAccepted"), @@ -130,7 +133,8 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) { return GRANTED_MODIFY_RIGHTS == notification->getName() || REVOKED_MODIFY_RIGHTS == notification->getName() - || PAYMENT_RECIVED == notification->getName() + || PAYMENT_RECEIVED == notification->getName() + || PAYMENT_SENT == notification->getName() || OFFER_FRIENDSHIP == notification->getName() || FRIENDSHIP_OFFERED == notification->getName() || FRIENDSHIP_ACCEPTED == notification->getName() @@ -311,34 +315,35 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification) logToIMP2P(notification, false); } +void log_name_callback(const std::string& full_name, const std::string& from_name, + const std::string& message, const LLUUID& from_id) + +{ + LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, full_name, from_name, message, + from_id, LLUUID()); +} + // static void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_file_only) { - const std::string name = LLHandlerUtil::getSubstitutionName(notification); - - const std::string& session_name = notification->getPayload().has( - "SESSION_NAME") ? notification->getPayload()["SESSION_NAME"].asString() : name; - // don't create IM p2p session with objects, it's necessary condition to log if (notification->getName() != OBJECT_GIVE_ITEM) { LLUUID from_id = notification->getPayload()["from_id"]; - //there still appears a log history file with weird name " .txt" - if (" " == session_name || "{waiting}" == session_name || "{nobody}" == session_name) + if (from_id.isNull()) { - llwarning("Weird session name (" + session_name + ") for notification " + notification->getName(), 666) + llwarns << " from_id for notification " << notification->getName() << " is null " << llendl; + return; } if(to_file_only) { - logToIM(IM_NOTHING_SPECIAL, session_name, "", notification->getMessage(), - LLUUID(), LLUUID()); + gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, "", notification->getMessage(), LLUUID())); } else { - logToIM(IM_NOTHING_SPECIAL, session_name, INTERACTIVE_SYSTEM_FROM, notification->getMessage(), - from_id, LLUUID()); + gCacheName->get(from_id, false, boost::bind(&log_name_callback, _2, INTERACTIVE_SYSTEM_FROM, notification->getMessage(), from_id)); } } } diff --git a/indra/newview/llnotificationhinthandler.cpp b/indra/newview/llnotificationhinthandler.cpp new file mode 100644 index 0000000000..f7163cb04f --- /dev/null +++ b/indra/newview/llnotificationhinthandler.cpp @@ -0,0 +1,58 @@ +/** + * @file llnotificationhinthandler.cpp + * @brief Notification Handler Class for UI Hints + * + * $LicenseInfo:firstyear=2000&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" // must be first include + +#include "llnotificationhandler.h" +#include "llhints.h" +#include "llnotifications.h" + +using namespace LLNotificationsUI; + +LLHintHandler::LLHintHandler() +{ +} + +LLHintHandler::~LLHintHandler() +{ +} + +bool LLHintHandler::processNotification(const LLSD& notify) +{ + LLNotificationPtr notification = LLNotifications::instance().find(notify["id"].asUUID()); + + std::string sigtype = notify["sigtype"].asString(); + if (sigtype == "add" || sigtype == "load") + { + LLHints::show(notification); + } + else if (sigtype == "delete") + { + LLHints::hide(notification); + } + return false; +} diff --git a/indra/newview/llnotificationmanager.cpp b/indra/newview/llnotificationmanager.cpp index 3bbf6cea16..6988227128 100644 --- a/indra/newview/llnotificationmanager.cpp +++ b/indra/newview/llnotificationmanager.cpp @@ -60,6 +60,8 @@ void LLNotificationManager::init() LLNotificationChannel::buildChannel("AlertModal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal")); LLNotificationChannel::buildChannel("IM Notifications", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "notifytoast")); LLNotificationChannel::buildChannel("Offer", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "offer")); + LLNotificationChannel::buildChannel("Hints", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "hint")); + LLNotificationChannel::buildChannel("Browser", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "browser")); LLNotifications::instance().getChannel("Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("NotificationTips")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); @@ -68,6 +70,8 @@ void LLNotificationManager::init() LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("IM Notifications")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); LLNotifications::instance().getChannel("Offer")->connectChanged(boost::bind(&LLNotificationManager::onNotification, this, _1)); + LLNotifications::instance().getChannel("Hints")->connectChanged(boost::bind(&LLHintHandler::processNotification, LLHintHandler::getInstance(), _1)); + LLNotifications::instance().getChannel("Browser")->connectChanged(boost::bind(&LLBrowserNotification::processNotification, LLBrowserNotification::getInstance(), _1)); mNotifyHandlers["notify"] = boost::shared_ptr<LLEventHandler>(new LLScriptHandler(NT_NOTIFY, LLSD())); mNotifyHandlers["notifytip"] = boost::shared_ptr<LLEventHandler>(new LLTipHandler(NT_NOTIFY, LLSD())); diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 85f95bd0c7..68fd65be0f 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -179,7 +179,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify) } } - return true; + return false; } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index b4d28bb346..45590c3cdb 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -130,7 +130,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify) mChannel->killToastByNotificationID(notification->getID()); } } - return true; + return false; } //-------------------------------------------------------------------------- diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 94612975a2..02b217fc94 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -96,7 +96,7 @@ bool LLTipHandler::processNotification(const LLSD& notify) LLNearbyChat>("nearby_chat", LLSD()); if (nearby_chat->getVisible()) { - return true; + return false; } } @@ -121,7 +121,7 @@ bool LLTipHandler::processNotification(const LLSD& notify) // don't spawn toast for inventory accepted/declined offers if respective IM window is open (EXT-5909) if (!LLHandlerUtil::canSpawnToast(notification)) { - return true; + return false; } LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification); @@ -144,7 +144,7 @@ bool LLTipHandler::processNotification(const LLSD& notify) { mChannel->killToastByNotificationID(notification->getID()); } - return true; + return false; } //-------------------------------------------------------------------------- diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index c0f7fa4abf..6435126fc0 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -38,9 +38,11 @@ #include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "lllistcontextmenu.h" +#include "llmenubutton.h" #include "llnotificationsutil.h" #include "lloutfitobserver.h" #include "llsidetray.h" +#include "lltoggleablemenu.h" #include "lltransutil.h" #include "llviewermenu.h" #include "llvoavatar.h" @@ -63,6 +65,39 @@ bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LL return name1 < name2; } +struct outfit_accordion_tab_params : public LLInitParam::Block<outfit_accordion_tab_params, LLAccordionCtrlTab::Params> +{ + Mandatory<LLWearableItemsList::Params> wearable_list; + + outfit_accordion_tab_params() + : wearable_list("wearable_items_list") + {} +}; + +const outfit_accordion_tab_params& get_accordion_tab_params() +{ + static outfit_accordion_tab_params tab_params; + static bool initialized = false; + if (!initialized) + { + initialized = true; + + LLXMLNodePtr xmlNode; + if (LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode)) + { + LLXUIParser parser; + parser.readXUI(xmlNode, tab_params, "outfit_accordion_tab.xml"); + } + else + { + llwarns << "Failed to read xml of Outfit's Accordion Tab from outfit_accordion_tab.xml" << llendl; + } + } + + return tab_params; +} + + ////////////////////////////////////////////////////////////////////////// class LLOutfitListGearMenu @@ -80,7 +115,7 @@ public: registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this)); registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this)); registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this)); - registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this)); + registrar.add("Gear.Delete", boost::bind(&LLOutfitsList::removeSelected, mOutfitList)); registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2)); registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this)); @@ -88,23 +123,11 @@ public: 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>( + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( "menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); llassert(mMenu); } - void show(LLView* spawning_view) - { - if (!mMenu) return; - - updateItemsVisibility(); - mMenu->buildDrawLabels(); - mMenu->updateParent(LLMenuGL::sMenuContainer); - S32 menu_x = 0; - S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); - LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); - } - void updateItemsVisibility() { if (!mMenu) return; @@ -115,6 +138,8 @@ public: mMenu->arrangeAndClear(); // update menu height } + LLToggleableMenu* getMenu() { return mMenu; } + private: const LLUUID& getSelectedOutfitID() { @@ -156,12 +181,12 @@ private: void onTakeOff() { // Take off selected outfit. - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.notNull()) - { - LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); + const LLUUID& selected_outfit_id = getSelectedOutfitID(); + if (selected_outfit_id.notNull()) + { + LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id); + } } - } void onRename() { @@ -172,15 +197,6 @@ private: } } - void onDelete() - { - const LLUUID& selected_outfit_id = getSelectedOutfitID(); - if (selected_outfit_id.notNull()) - { - remove_category(&gInventory, selected_outfit_id); - } - } - void onCreate(const LLSD& data) { LLWearableType::EType type = LLWearableType::typeNameToType(data.asString()); @@ -227,14 +243,20 @@ private: return true; } - LLOutfitsList* mOutfitList; - LLMenuGL* mMenu; + LLOutfitsList* mOutfitList; + LLToggleableMenu* mMenu; }; ////////////////////////////////////////////////////////////////////////// class LLOutfitContextMenu : public LLListContextMenu { +public: + + LLOutfitContextMenu(LLOutfitsList* outfit_list) + : LLListContextMenu(), + mOutfitList(outfit_list) + {} protected: /* virtual */ LLContextMenu* createMenu() { @@ -250,7 +272,7 @@ protected: boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id)); registrar.add("Outfit.Edit", boost::bind(editOutfit)); registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id)); - registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id)); + registrar.add("Outfit.Delete", boost::bind(&LLOutfitsList::removeSelected, mOutfitList)); enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitContextMenu::onEnable, this, _2)); enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitContextMenu::onVisible, this, _2)); @@ -313,10 +335,8 @@ protected: LLAppearanceMgr::instance().renameOutfit(outfit_cat_id); } - static void deleteOutfit(const LLUUID& outfit_cat_id) - { - remove_category(&gInventory, outfit_cat_id); - } +private: + LLOutfitsList* mOutfitList; }; ////////////////////////////////////////////////////////////////////////// @@ -333,7 +353,7 @@ LLOutfitsList::LLOutfitsList() mCategoriesObserver = new LLInventoryCategoriesObserver(); mGearMenu = new LLOutfitListGearMenu(this); - mOutfitMenu = new LLOutfitContextMenu(); + mOutfitMenu = new LLOutfitContextMenu(this); } LLOutfitsList::~LLOutfitsList() @@ -353,6 +373,11 @@ BOOL LLOutfitsList::postBuild() mAccordion = getChild<LLAccordionCtrl>("outfits_accordion"); mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR); + LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + + menu_gear_btn->setMouseDownCallback(boost::bind(&LLOutfitListGearMenu::updateItemsVisibility, mGearMenu)); + menu_gear_btn->setMenu(mGearMenu->getMenu()); + return TRUE; } @@ -435,9 +460,12 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) std::string name = cat->getName(); - static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode(); - LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL); + outfit_accordion_tab_params tab_params(get_accordion_tab_params()); + LLAccordionCtrlTab* tab = LLUICtrlFactory::create<LLAccordionCtrlTab>(tab_params); if (!tab) continue; + LLWearableItemsList* wearable_list = LLUICtrlFactory::create<LLWearableItemsList>(tab_params.wearable_list); + wearable_list->setShape(tab->getLocalRect()); + tab->addChild(wearable_list); tab->setName(name); tab->setTitle(name); @@ -454,7 +482,7 @@ void LLOutfitsList::refreshList(const LLUUID& category_id) mAccordion->removeCollapsibleCtrl(tab); // kill removed tab - tab->die(); + tab->die(); continue; } @@ -602,6 +630,14 @@ void LLOutfitsList::performAction(std::string action) void LLOutfitsList::removeSelected() { + LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLOutfitsList::onOutfitsRemovalConfirmation, this, _1, _2)); +} + +void LLOutfitsList::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if (option != 0) return; // canceled + if (mSelectedOutfitUUID.notNull()) { remove_category(&gInventory, mSelectedOutfitUUID); @@ -691,13 +727,6 @@ bool LLOutfitsList::isActionEnabled(const LLSD& userdata) return false; } -// virtual -void LLOutfitsList::showGearMenu(LLView* spawning_view) -{ - if (!mGearMenu) return; - mGearMenu->show(spawning_view); -} - void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const { // Collect selected items from all selected lists. @@ -727,19 +756,6 @@ bool LLOutfitsList::hasItemSelected() ////////////////////////////////////////////////////////////////////////// // Private methods ////////////////////////////////////////////////////////////////////////// -LLXMLNodePtr LLOutfitsList::getAccordionTabXMLNode() -{ - LLXMLNodePtr xmlNode = NULL; - bool success = LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode); - if (!success) - { - llwarns << "Failed to read xml of Outfit's Accordion Tab from outfit_accordion_tab.xml" << llendl; - return NULL; - } - - return xmlNode; -} - void LLOutfitsList::computeDifference( const LLInventoryModel::cat_array_t& vcats, uuid_vec_t& vadded, diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h index faf6f7ce1e..a0598737f1 100644 --- a/indra/newview/lloutfitslist.h +++ b/indra/newview/lloutfitslist.h @@ -94,8 +94,6 @@ public: /*virtual*/ bool isActionEnabled(const LLSD& userdata); - /*virtual*/ void showGearMenu(LLView* spawning_view); - const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; } /*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; @@ -111,12 +109,8 @@ public: bool hasItemSelected(); private: - /** - * Reads xml with accordion tab and Flat list from xml file. - * - * @return LLPointer to XMLNode with accordion tab and flat list. - */ - LLXMLNodePtr getAccordionTabXMLNode(); + + void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response); /** * Wrapper for LLCommonUtils::computeDifference. @see LLCommonUtils::computeDifference diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h index 81366c5db4..2ed6b00497 100644 --- a/indra/newview/llpanelappearancetab.h +++ b/indra/newview/llpanelappearancetab.h @@ -39,8 +39,6 @@ public: virtual bool isActionEnabled(const LLSD& userdata) = 0; - virtual void showGearMenu(LLView* spawning_view) = 0; - virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {} static const std::string& getFilterSubString() { return sFilterSubString; } diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 68ca65420a..57180f63b5 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -44,7 +44,7 @@ #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "llvoiceclient.h" -#include "llnamebox.h" +#include "lltextbox.h" #include "lltrans.h" //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -218,13 +218,8 @@ void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification, void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights) { - std::string first, last; LLSD args; - if (gCacheName->getName(getAvatarId(), first, last)) - { - args["FIRST_NAME"] = first; - args["LAST_NAME"] = last; - } + args["NAME"] = LLSLURL("agent", getAvatarId(), "displayname").getSLURLString(); if (grant) { @@ -562,8 +557,7 @@ void LLPanelAvatarProfile::resetData() getChild<LLUICtrl>("homepage_edit")->setValue(LLStringUtil::null); getChild<LLUICtrl>("register_date")->setValue(LLStringUtil::null); getChild<LLUICtrl>("acc_status_text")->setValue(LLStringUtil::null); - getChild<LLUICtrl>("partner_text")->setTextArg("[FIRST]", LLStringUtil::null); - getChild<LLUICtrl>("partner_text")->setTextArg("[LAST]", LLStringUtil::null); + getChild<LLUICtrl>("partner_text")->setValue(LLStringUtil::null); } void LLPanelAvatarProfile::processProperties(void* data, EAvatarProcessorType type) @@ -654,15 +648,14 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data) void LLPanelAvatarProfile::fillPartnerData(const LLAvatarData* avatar_data) { - LLNameBox* name_box = getChild<LLNameBox>("partner_text"); + LLTextBox* partner_text = getChild<LLTextBox>("partner_text"); if (avatar_data->partner_id.notNull()) { - name_box->setNameID(avatar_data->partner_id, FALSE); + partner_text->setText(LLSLURL("agent", avatar_data->partner_id, "inspect").getSLURLString()); } else { - name_box->setNameID(LLUUID::null, FALSE); - name_box->setText(getString("no_partner_text")); + partner_text->setText(getString("no_partner_text")); } } diff --git a/indra/newview/llpanelavatartag.cpp b/indra/newview/llpanelavatartag.cpp index d174b8da96..4ac818eb26 100644 --- a/indra/newview/llpanelavatartag.cpp +++ b/indra/newview/llpanelavatartag.cpp @@ -37,7 +37,7 @@ LLPanelAvatarTag::LLPanelAvatarTag(const LLUUID& key, const std::string im_time) , mAvatarId(LLUUID::null) // , mFadeTimer() { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_tag.xml"); + buildFromFile( "panel_avatar_tag.xml"); setLeftButtonClickCallback(boost::bind(&LLPanelAvatarTag::onClick, this)); setAvatarId(key); setTime(im_time); @@ -80,7 +80,7 @@ void LLPanelAvatarTag::setAvatarId(const LLUUID& avatar_id) { mIcon->setValue(avatar_id); } - setName(std::string(mIcon->getFirstName()+ " "+ mIcon->getLastName())); + setName(std::string(mIcon->getFullName())); } boost::signals2::connection LLPanelAvatarTag::setLeftButtonClickCallback( diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp index fd2e961cb7..81e199d85b 100644 --- a/indra/newview/llpanelblockedlist.cpp +++ b/indra/newview/llpanelblockedlist.cpp @@ -29,6 +29,7 @@ #include "llpanelblockedlist.h" // library include +#include "llavatarname.h" #include "llfloater.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" @@ -180,10 +181,10 @@ void LLPanelBlockedList::onBlockByNameClick() LLFloaterGetBlockedObjectName::show(&LLPanelBlockedList::callbackBlockByName); } -void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const uuid_vec_t& ids) +void LLPanelBlockedList::callbackBlockPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) { if (names.empty() || ids.empty()) return; - LLMute mute(ids[0], names[0], LLMute::AGENT); + LLMute mute(ids[0], names[0].getLegacyName(), LLMute::AGENT); LLMuteList::getInstance()->add(mute); showPanelAndSelect(mute.mID); } diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h index eb9f082d87..74ad82e32d 100644 --- a/indra/newview/llpanelblockedlist.h +++ b/indra/newview/llpanelblockedlist.h @@ -36,7 +36,8 @@ // class LLLineEditor; // class LLMessageSystem; // class LLUUID; - class LLScrollListCtrl; +class LLAvatarName; +class LLScrollListCtrl; class LLPanelBlockedList : public LLPanel, public LLMuteListObserver @@ -72,7 +73,7 @@ private: void onPickBtnClick(); void onBlockByNameClick(); - void callbackBlockPicked(const std::vector<std::string>& names, const uuid_vec_t& ids); + void callbackBlockPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names); static void callbackBlockByName(const std::string& text); private: diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp index bf7214eb3b..6889b98ab1 100644 --- a/indra/newview/llpanelclassified.cpp +++ b/indra/newview/llpanelclassified.cpp @@ -138,7 +138,7 @@ LLPanelClassifiedInfo::~LLPanelClassifiedInfo() LLPanelClassifiedInfo* LLPanelClassifiedInfo::create() { LLPanelClassifiedInfo* panel = new LLPanelClassifiedInfo(); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_classified_info.xml"); + panel->buildFromFile("panel_classified_info.xml"); return panel; } @@ -611,7 +611,7 @@ LLPanelClassifiedEdit::~LLPanelClassifiedEdit() LLPanelClassifiedEdit* LLPanelClassifiedEdit::create() { LLPanelClassifiedEdit* panel = new LLPanelClassifiedEdit(); - LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_edit_classified.xml"); + panel->buildFromFile("panel_edit_classified.xml"); return panel; } diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp index 2660814afc..4ccdaa78f3 100644 --- a/indra/newview/llpanelgenerictip.cpp +++ b/indra/newview/llpanelgenerictip.cpp @@ -36,7 +36,7 @@ LLPanelGenericTip::LLPanelGenericTip( const LLNotificationPtr& notification) : LLPanelTipToast(notification) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_generic_tip.xml"); + buildFromFile( "panel_generic_tip.xml"); getChild<LLUICtrl>("message")->setValue(notification->getMessage()); diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp index 62ed7acb15..76b85d5bec 100644 --- a/indra/newview/llpanelgroup.cpp +++ b/indra/newview/llpanelgroup.cpp @@ -597,7 +597,7 @@ void LLPanelGroup::showNotice(const std::string& subject, //static void LLPanelGroup::refreshCreatedGroup(const LLUUID& group_id) { - LLPanelGroup* panel = LLSideTray::getInstance()->findChild<LLPanelGroup>("panel_group_info_sidetray"); + LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray"); if(!panel) return; panel->setGroupID(group_id); @@ -612,7 +612,7 @@ void LLPanelGroup::showNotice(const std::string& subject, const std::string& inventory_name, LLOfferInfo* inventory_offer) { - LLPanelGroup* panel = LLSideTray::getInstance()->findChild<LLPanelGroup>("panel_group_info_sidetray"); + LLPanelGroup* panel = LLSideTray::getInstance()->getPanel<LLPanelGroup>("panel_group_info_sidetray"); if(!panel) return; diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp index 840b98213d..ec340dc258 100644 --- a/indra/newview/llpanelgroupgeneral.cpp +++ b/indra/newview/llpanelgroupgeneral.cpp @@ -40,7 +40,6 @@ #include "llavataractions.h" #include "llgroupactions.h" #include "lllineeditor.h" -#include "llnamebox.h" #include "llnamelistctrl.h" #include "llnotificationsutil.h" #include "llscrolllistitem.h" @@ -206,7 +205,7 @@ void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group) { mInsignia->setCommitCallback(onCommitAny, this); } - mFounderName = getChild<LLNameBox>("founder_name"); + mFounderName = getChild<LLTextBox>("founder_name"); mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor"); @@ -638,7 +637,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc) if (mEditCharter) mEditCharter->setEnabled(mAllowEdit && can_change_ident); if (mGroupNameEditor) mGroupNameEditor->setVisible(FALSE); - if (mFounderName) mFounderName->setNameID(gdatap->mFounderID,FALSE); + if (mFounderName) mFounderName->setText(LLSLURL("agent", gdatap->mFounderID, "inspect").getSLURLString()); if (mInsignia) { if (gdatap->mInsigniaID.notNull()) @@ -693,7 +692,8 @@ void LLPanelGroupGeneral::updateMembers() LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); if (!mListVisibleMembers || !gdatap - || !gdatap->isMemberDataComplete()) + || !gdatap->isMemberDataComplete() + || gdatap->mMembers.empty()) { return; } @@ -740,7 +740,7 @@ void LLPanelGroupGeneral::updateMembers() sSDTime += sd_timer.getElapsedTimeF32(); element_timer.reset(); - LLScrollListItem* member_row = mListVisibleMembers->addElement(row);//, ADD_SORTED); + LLScrollListItem* member_row = mListVisibleMembers->addElement(row); if ( member->isOwner() ) { diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h index cbf173f845..88c092c461 100644 --- a/indra/newview/llpanelgroupgeneral.h +++ b/indra/newview/llpanelgroupgeneral.h @@ -37,7 +37,6 @@ class LLButton; class LLNameListCtrl; class LLCheckBoxCtrl; class LLComboBox; -class LLNameBox; class LLSpinCtrl; class LLPanelGroupGeneral : public LLPanelGroupTab @@ -91,7 +90,7 @@ private: // Group information (include any updates in updateChanged) LLLineEditor *mGroupNameEditor; - LLNameBox *mFounderName; + LLTextBox *mFounderName; LLTextureCtrl *mInsignia; LLTextEditor *mEditCharter; diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index 535b2a9e2d..ca48e8561b 100644 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -28,6 +28,7 @@ #include "llpanelgroupinvite.h" #include "llagent.h" +#include "llavatarnamecache.h" #include "llfloateravatarpicker.h" #include "llbutton.h" #include "llcallingcard.h" @@ -62,9 +63,13 @@ public: static void callbackClickAdd(void* userdata); static void callbackClickRemove(void* userdata); static void callbackSelect(LLUICtrl* ctrl, void* userdata); - static void callbackAddUsers(const std::vector<std::string>& names, - const uuid_vec_t& agent_ids, + static void callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data); + + static void onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name, + void* user_data); + bool inviteOwnerCallback(const LLSD& notification, const LLSD& response); public: @@ -287,7 +292,7 @@ void LLPanelGroupInvite::impl::callbackClickAdd(void* userdata) LLFloater* parentp; parentp = gFloaterView->getParentFloater(panelp); - parentp->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(impl::callbackAddUsers, _1, _2, + parentp->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(impl::callbackAddUsers, _1, panelp->mImplementation), TRUE)); } @@ -353,23 +358,45 @@ void LLPanelGroupInvite::impl::callbackClickOK(void* userdata) if ( selfp ) selfp->submitInvitations(); } + + //static -void LLPanelGroupInvite::impl::callbackAddUsers(const std::vector<std::string>& names, - const uuid_vec_t& ids, - void* user_data) +void LLPanelGroupInvite::impl::callbackAddUsers(const uuid_vec_t& agent_ids, void* user_data) +{ + std::vector<std::string> names; + for (S32 i = 0; i < (S32)agent_ids.size(); i++) + { + LLAvatarNameCache::get(agent_ids[i], + boost::bind(&LLPanelGroupInvite::impl::onAvatarNameCache, _1, _2, user_data)); + } + +} + +void LLPanelGroupInvite::impl::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name, + void* user_data) { impl* selfp = (impl*) user_data; - if ( selfp) selfp->addUsers(names, ids); + if (selfp) + { + std::vector<std::string> names; + uuid_vec_t agent_ids; + agent_ids.push_back(agent_id); + names.push_back(av_name.getCompleteName()); + + selfp->addUsers(names, agent_ids); + } } + LLPanelGroupInvite::LLPanelGroupInvite(const LLUUID& group_id) : LLPanel(), mImplementation(new impl(group_id)), mPendingUpdate(FALSE) { // Pass on construction of this panel to the control factory. - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_invite.xml"); + buildFromFile( "panel_group_invite.xml"); } LLPanelGroupInvite::~LLPanelGroupInvite() @@ -398,16 +425,18 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids) std::vector<std::string> names; for (S32 i = 0; i < (S32)agent_ids.size(); i++) { + std::string fullname; LLUUID agent_id = agent_ids[i]; LLViewerObject* dest = gObjectList.findObject(agent_id); - std::string fullname; if(dest && dest->isAvatar()) { LLNameValue* nvfirst = dest->getNVPair("FirstName"); LLNameValue* nvlast = dest->getNVPair("LastName"); if(nvfirst && nvlast) { - fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString()); + fullname = LLCacheName::buildFullName( + nvfirst->getString(), nvlast->getString()); + } if (!fullname.empty()) { @@ -430,8 +459,7 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids) { // actually it should happen, just in case gCacheName->get(LLUUID(agent_id), false, boost::bind( - &LLPanelGroupInvite::addUserCallback, this, _1, _2, - _3)); + &LLPanelGroupInvite::addUserCallback, this, _1, _2)); // for this special case! //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence // removed id will be added in callback @@ -447,16 +475,16 @@ void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids) mImplementation->addUsers(names, agent_ids); } -void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name) +void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& full_name) { std::vector<std::string> names; uuid_vec_t agent_ids; - std::string full_name = first_name + " " + last_name; agent_ids.push_back(id); - names.push_back(first_name + " " + last_name); + names.push_back(full_name); mImplementation->addUsers(names, agent_ids); } + void LLPanelGroupInvite::draw() { LLPanel::draw(); diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h index 01e7315486..a7bfd2226e 100644 --- a/indra/newview/llpanelgroupinvite.h +++ b/indra/newview/llpanelgroupinvite.h @@ -40,7 +40,7 @@ public: /** * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers(). */ - void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name); + void addUserCallback(const LLUUID& id, const std::string& full_name); void clear(); void update(); diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp index d4736d22ae..8d8d9bc1c4 100644 --- a/indra/newview/llpanelgrouplandmoney.cpp +++ b/indra/newview/llpanelgrouplandmoney.cpp @@ -522,7 +522,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg) row["columns"][4]["column"] = "hidden"; row["columns"][4]["value"] = hidden; - mGroupParcelsp->addElement(row, ADD_SORTED); + mGroupParcelsp->addElement(row); } } } diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp index a24dbf6681..cdf6e51bf8 100644 --- a/indra/newview/llpanelgroupnotices.cpp +++ b/indra/newview/llpanelgroupnotices.cpp @@ -30,6 +30,7 @@ #include "llview.h" +#include "llavatarnamecache.h" #include "llinventory.h" #include "llviewerinventory.h" #include "llinventorydefines.h" @@ -540,6 +541,12 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg) msg->getU8("Data","AssetType",asset_type,i); msg->getU32("Data","Timestamp",timestamp,i); + // we only have the legacy name here, convert it to a username + if (LLAvatarNameCache::useDisplayNames()) + { + name = LLCacheName::buildUsername(name); + } + LLSD row; row["id"] = id; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 579a271ce8..d1362d7922 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -49,6 +49,7 @@ #include "llviewertexturelist.h" #include "llviewerwindow.h" #include "llfocusmgr.h" +#include "llviewercontrol.h" #include "roles_constants.h" @@ -742,10 +743,12 @@ LLPanelGroupMembersSubTab::LLPanelGroupMembersSubTab() mHasMatch(FALSE), mNumOwnerAdditions(0) { + mUdpateSessionID = LLUUID::null; } LLPanelGroupMembersSubTab::~LLPanelGroupMembersSubTab() { + gSavedSettings.setString("GroupMembersSortOrder", mMembersList->getSortColumnName()); } BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root) @@ -772,6 +775,17 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root) // Show the member's profile on double click. mMembersList->setDoubleClickCallback(onMemberDoubleClick, this); mMembersList->setContextMenu(LLScrollListCtrl::MENU_AVATAR); + + LLSD row; + row["columns"][0]["column"] = "name"; + row["columns"][1]["column"] = "donated"; + row["columns"][2]["column"] = "online"; + mMembersList->addElement(row); + std::string order_by = gSavedSettings.getString("GroupMembersSortOrder"); + if(!order_by.empty()) + { + mMembersList->sortByColumn(order_by, TRUE); + } LLButton* button = parent->getChild<LLButton>("member_invite", recurse); if ( button ) @@ -1110,11 +1124,7 @@ void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, c for (uuid_vec_t::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i) { LLSD args; - std::string name; - - gCacheName->getFullName(*i, name); - - args["AVATAR_NAME"] = name; + args["AVATAR_NAME"] = LLSLURL("agent", *i, "displayname").getSLURLString(); args["GROUP_NAME"] = group_data->mName; LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args)); @@ -1533,6 +1543,10 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc) mMemberProgress = gdatap->mMembers.begin(); mPendingMemberUpdate = TRUE; mHasMatch = FALSE; + // Generate unique ID for current updateMembers()- see onNameCache for details. + // Using unique UUID is perhaps an overkill but this way we are perfectly safe + // from coincidences. + mUdpateSessionID.generate(); } else { @@ -1560,6 +1574,63 @@ void LLPanelGroupMembersSubTab::update(LLGroupChange gc) } } +void LLPanelGroupMembersSubTab::addMemberToList(LLUUID id, LLGroupMemberData* data) +{ + if (!data) return; + LLUIString donated = getString("donation_area"); + donated.setArg("[AREA]", llformat("%d", data->getContribution())); + + LLSD row; + row["id"] = id; + + row["columns"][0]["column"] = "name"; + // value is filled in by name list control + + row["columns"][1]["column"] = "donated"; + row["columns"][1]["value"] = donated.getString(); + + row["columns"][2]["column"] = "online"; + row["columns"][2]["value"] = data->getOnlineStatus(); + row["columns"][2]["font"] = "SANSSERIF_SMALL"; + + mMembersList->addElement(row); + + mHasMatch = TRUE; +} + +void LLPanelGroupMembersSubTab::onNameCache(const LLUUID& update_id, const LLUUID& id) +{ + // Update ID is used to determine whether member whose id is passed + // into onNameCache() was passed after current or previous user-initiated update. + // This is needed to avoid probable duplication of members in list after changing filter + // or adding of members of another group if gets for their names were called on + // previous update. If this id is from get() called from older update, + // we do nothing. + if (mUdpateSessionID != update_id) return; + + LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID); + if (!gdatap) + { + llwarns << "LLPanelGroupMembersSubTab::updateMembers() -- No group data!" << llendl; + return; + } + + std::string fullname; + gCacheName->getFullName(id, fullname); + + LLGroupMemberData* data; + // trying to avoid unnecessary hash lookups + if (matchesSearchFilter(fullname) && ((data = gdatap->mMembers[id]) != NULL)) + { + addMemberToList(id, data); + if(!mMembersList->getEnabled()) + { + mMembersList->setEnabled(TRUE); + } + } + +} + void LLPanelGroupMembersSubTab::updateMembers() { mPendingMemberUpdate = FALSE; @@ -1584,12 +1655,13 @@ void LLPanelGroupMembersSubTab::updateMembers() //cleanup list only for first iretation if(mMemberProgress == gdatap->mMembers.begin()) + { mMembersList->deleteAllItems(); + } LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end(); - LLUIString donated = getString("donation_area"); - + S32 i = 0; for( ; mMemberProgress != end && i<UPDATE_MEMBERS_PER_FRAME; ++mMemberProgress, ++i) @@ -1597,38 +1669,19 @@ void LLPanelGroupMembersSubTab::updateMembers() if (!mMemberProgress->second) continue; // Do filtering on name if it is already in the cache. - bool add_member = true; - std::string fullname; if (gCacheName->getFullName(mMemberProgress->first, fullname)) { - if ( !matchesSearchFilter(fullname) ) + if (matchesSearchFilter(fullname)) { - add_member = false; + addMemberToList(mMemberProgress->first, mMemberProgress->second); } } - - if (add_member) + else { - donated.setArg("[AREA]", llformat("%d", mMemberProgress->second->getContribution())); - - LLSD row; - row["id"] = (*mMemberProgress).first; - - row["columns"][0]["column"] = "name"; - // value is filled in by name list control - - row["columns"][1]["column"] = "donated"; - row["columns"][1]["value"] = donated.getString(); - - row["columns"][2]["column"] = "online"; - row["columns"][2]["value"] = mMemberProgress->second->getOnlineStatus(); - row["columns"][2]["font"] = "SANSSERIF_SMALL"; - - LLScrollListItem* member = mMembersList->addElement(row);//, ADD_SORTED); - - LLUUID id = member->getUUID(); - mHasMatch = TRUE; + // If name is not cached, onNameCache() should be called when it is cached and add this member to list. + gCacheName->get(mMemberProgress->first, FALSE, boost::bind(&LLPanelGroupMembersSubTab::onNameCache, + this, mUdpateSessionID, _1)); } } diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index 6a773f1ebb..270259c16f 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -187,6 +187,9 @@ public: virtual void setGroupID(const LLUUID& id); + void addMemberToList(LLUUID id, LLGroupMemberData* data); + void onNameCache(const LLUUID& update_id, const LLUUID& id); + protected: typedef std::map<LLUUID, LLRoleMemberChangeType> role_change_data_map_t; typedef std::map<LLUUID, role_change_data_map_t*> member_role_changes_map_t; @@ -207,6 +210,9 @@ protected: BOOL mPendingMemberUpdate; BOOL mHasMatch; + // This id is generated after each user initiated member list update(opening Roles or changing filter) + LLUUID mUdpateSessionID; + member_role_changes_map_t mMemberRoleChangeData; U32 mNumOwnerAdditions; diff --git a/indra/newview/llpanelhome.cpp b/indra/newview/llpanelhome.cpp index 93c4e0c9c7..b03bab3127 100644 --- a/indra/newview/llpanelhome.cpp +++ b/indra/newview/llpanelhome.cpp @@ -61,7 +61,6 @@ BOOL LLPanelHome::postBuild() std::string url = LLViewerHome::getHomeURL(); mBrowser->addObserver(this); - mBrowser->setTrusted(true); mBrowser->setHomePageUrl(url); } diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index 7489c02d8d..0cc5dcda82 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -180,7 +180,7 @@ void LLPanelIMControlPanel::onViewProfileButtonClicked() void LLPanelIMControlPanel::onAddFriendButtonClicked() { LLAvatarIconCtrl* avatar_icon = getChild<LLAvatarIconCtrl>("avatar_icon"); - std::string full_name = avatar_icon->getFirstName() + " " + avatar_icon->getLastName(); + std::string full_name = avatar_icon->getFullName(); LLAvatarActions::requestFriendshipDialog(mAvatarID, full_name); } @@ -231,6 +231,15 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id) getChildView("share_btn")->setEnabled(FALSE); getChildView("teleport_btn")->setEnabled(FALSE); getChildView("pay_btn")->setEnabled(FALSE); + + getChild<LLTextBox>("avatar_name")->setValue(im_session->mName); + getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName); + } + else + { + // If the participant is an avatar, fetch the currect name + gCacheName->get(mAvatarID, false, + boost::bind(&LLPanelIMControlPanel::onNameCache, this, _1, _2, _3)); } } @@ -246,6 +255,16 @@ void LLPanelIMControlPanel::changed(U32 mask) } } +void LLPanelIMControlPanel::onNameCache(const LLUUID& id, const std::string& full_name, bool is_group) +{ + if ( id == mAvatarID ) + { + std::string avatar_name = full_name; + getChild<LLTextBox>("avatar_name")->setValue(avatar_name); + getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name); + } +} + LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id): mParticipantList(NULL) { diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 45ada3ae1d..3bbe24ecb9 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -83,6 +83,9 @@ public: // LLFriendObserver trigger virtual void changed(U32 mask); +protected: + void onNameCache(const LLUUID& id, const std::string& full_name, bool is_group); + private: void onViewProfileButtonClicked(); void onAddFriendButtonClicked(); diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index b69cee9586..87acd83b23 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -39,6 +39,7 @@ #include "llagent.h" #include "llagentui.h" #include "lllandmarkactions.h" +#include "llslurl.h" #include "llviewerinventory.h" #include "llviewerparcelmgr.h" #include "llviewerregion.h" @@ -246,13 +247,10 @@ void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem) ////////////////// if (pItem->getCreatorUUID().notNull()) { - std::string name; + // IDEVO LLUUID creator_id = pItem->getCreatorUUID(); - if (!gCacheName->getFullName(creator_id, name)) - { - gCacheName->get(creator_id, FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mCreator, _2, _3)); - } + std::string name = + LLSLURL("agent", creator_id, "inspect").getSLURLString(); mCreator->setText(name); } else @@ -269,20 +267,12 @@ void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem) if (perm.isGroupOwned()) { LLUUID group_id = perm.getGroup(); - if (!gCacheName->getGroupName(group_id, name)) - { - gCacheName->get(group_id, TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3)); - } + name = LLSLURL("group", group_id, "inspect").getSLURLString(); } else { LLUUID owner_id = perm.getOwner(); - if (!gCacheName->getFullName(owner_id, name)) - { - gCacheName->get(owner_id, FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mOwner, _2, _3)); - } + name = LLSLURL("agent", owner_id, "inspect").getSLURLString(); } mOwner->setText(name); } diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index 24bf67a000..d25b8e0e02 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -47,9 +47,11 @@ #include "llinventorymodelbackgroundfetch.h" #include "llinventorypanel.h" #include "lllandmarkactions.h" +#include "llmenubutton.h" #include "llplacesinventorybridge.h" #include "llplacesinventorypanel.h" #include "llsidetray.h" +#include "lltoggleablemenu.h" #include "llviewermenu.h" #include "llviewerregion.h" @@ -191,13 +193,14 @@ LLLandmarksPanel::LLLandmarksPanel() , mLibraryInventoryPanel(NULL) , mCurrentSelectedList(NULL) , mListCommands(NULL) + , mGearButton(NULL) , mGearFolderMenu(NULL) , mGearLandmarkMenu(NULL) { mInventoryObserver = new LLLandmarksPanelObserver(this); gInventory.addObserver(mInventoryObserver); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_landmarks.xml"); + buildFromFile( "panel_landmarks.xml"); } LLLandmarksPanel::~LLLandmarksPanel() @@ -685,7 +688,9 @@ void LLLandmarksPanel::initListCommandsHandlers() { mListCommands = getChild<LLPanel>("bottom_panel"); - mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); + mGearButton = getChild<LLMenuButton>(OPTIONS_BUTTON_NAME); + mGearButton->setMouseDownCallback(boost::bind(&LLLandmarksPanel::onActionsButtonClick, this)); + mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this)); LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME); @@ -702,8 +707,8 @@ void LLLandmarksPanel::initListCommandsHandlers() mCommitCallbackRegistrar.add("Places.LandmarksGear.Folding.Action", boost::bind(&LLLandmarksPanel::onFoldingAction, this, _2)); mEnableCallbackRegistrar.add("Places.LandmarksGear.Check", boost::bind(&LLLandmarksPanel::isActionChecked, this, _2)); mEnableCallbackRegistrar.add("Places.LandmarksGear.Enable", boost::bind(&LLLandmarksPanel::isActionEnabled, this, _2)); - mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); - mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME)); @@ -722,7 +727,7 @@ void LLLandmarksPanel::updateListCommands() void LLLandmarksPanel::onActionsButtonClick() { - LLMenuGL* menu = mGearFolderMenu; + LLToggleableMenu* menu = mGearFolderMenu; LLFolderViewItem* cur_item = NULL; if(mCurrentSelectedList) @@ -741,7 +746,7 @@ void LLLandmarksPanel::onActionsButtonClick() } } - showActionMenu(menu,OPTIONS_BUTTON_NAME); + mGearButton->setMenu(menu); } void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name) @@ -750,7 +755,10 @@ void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_ { menu->buildDrawLabels(); menu->updateParent(LLMenuGL::sMenuContainer); - LLView* spawning_view = getChild<LLView> (spawning_view_name); + menu->arrangeAndClear(); + + LLView* spawning_view = getChild<LLView>(spawning_view_name); + S32 menu_x, menu_y; //show menu in co-ordinates of panel spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this); @@ -1013,9 +1021,9 @@ 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) - { + } + else if ("rename" == command_name) + { LLFolderViewItem* selected_item = getCurSelectedItem(); if (!selected_item) return false; @@ -1245,7 +1253,12 @@ void LLLandmarksPanel::doProcessParcelInfo(LLLandmark* landmark, landmark->getGlobalPos(landmark_global_pos); // let's toggle pick panel into panel places - LLPanel* panel_places = LLSideTray::getInstance()->getChild<LLPanel>("panel_places");//-> sidebar_places + LLPanel* panel_places = LLSideTray::getInstance()->getPanel("panel_places");//-> sidebar_places + if (!panel_places) + { + llassert(NULL != panel_places); + return; + } panel_places->addChild(panel_pick); LLRect paren_rect(panel_places->getRect()); panel_pick->reshape(paren_rect.getWidth(),paren_rect.getHeight(), TRUE); diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h index 0d4402d8cb..8dcbca0440 100644 --- a/indra/newview/llpanellandmarks.h +++ b/indra/newview/llpanellandmarks.h @@ -39,7 +39,9 @@ class LLAccordionCtrlTab; class LLFolderViewItem; +class LLMenuButton; class LLMenuGL; +class LLToggleableMenu; class LLInventoryPanel; class LLPlacesInventoryPanel; @@ -155,8 +157,9 @@ private: LLPlacesInventoryPanel* mLandmarksInventoryPanel; LLPlacesInventoryPanel* mMyInventoryPanel; LLPlacesInventoryPanel* mLibraryInventoryPanel; - LLMenuGL* mGearLandmarkMenu; - LLMenuGL* mGearFolderMenu; + LLMenuButton* mGearButton; + LLToggleableMenu* mGearLandmarkMenu; + LLToggleableMenu* mGearFolderMenu; LLMenuGL* mMenuAdd; LLPlacesInventoryPanel* mCurrentSelectedList; LLInventoryObserver* mInventoryObserver; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index be1afbd8d7..467aefc60f 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -187,7 +187,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, // Logo mLogoImage = LLUI::getUIImage("startup_logo"); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_login.xml"); + buildFromFile( "panel_login.xml"); #if USE_VIEWER_AUTH //leave room for the login menu bar @@ -205,7 +205,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, } #if !USE_VIEWER_AUTH - getChild<LLLineEditor>("username_edit")->setPrevalidate(LLTextValidate::validateASCIIPrintableNoPipe); getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this); // change z sort of clickable text to be behind buttons @@ -257,13 +256,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, // Clear the browser's cache to avoid any potential for the cache messing up the login screen. web_browser->clearCache(); - // Need to handle login secondlife:///app/ URLs - web_browser->setTrusted( true ); - - // don't make it a tab stop until SL-27594 is fixed - web_browser->setTabStop(FALSE); - // web_browser->navigateToLocalPage( "loading", "loading.html" ); - reshapeBrowser(); // kick off a request to grab the url manually @@ -508,8 +500,16 @@ void LLPanelLogin::setFields(LLPointer<LLCredential> credential, LLSD identifier = credential->getIdentifier(); if((std::string)identifier["type"] == "agent") { - sInstance->getChild<LLUICtrl>("username_edit")->setValue((std::string)identifier["first_name"] + " " + - (std::string)identifier["last_name"]); + std::string firstname = identifier["first_name"].asString(); + std::string lastname = identifier["last_name"].asString(); + std::string login_id = firstname; + if (!lastname.empty() && lastname != "Resident") + { + // support traditional First Last name SLURLs + login_id += " "; + login_id += lastname; + } + sInstance->getChild<LLUICtrl>("username_edit")->setValue(login_id); } else if((std::string)identifier["type"] == "account") { @@ -573,7 +573,8 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential, LL_INFOS2("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL; // determine if the username is a first/last form or not. size_t separator_index = username.find_first_of(' '); - if (separator_index == username.npos) + if (separator_index == username.npos + && !LLGridManager::getInstance()->isSystemGrid()) { LL_INFOS2("Credentials", "Authentication") << "account: " << username << LL_ENDL; // single username, so this is a 'clear' identifier @@ -590,9 +591,23 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential, } else { + // Be lenient in terms of what separators we allow for two-word names + // and allow legacy users to login with firstname.lastname + separator_index = username.find_first_of(" ._"); std::string first = username.substr(0, separator_index); - std::string last = username.substr(separator_index, username.npos); + std::string last; + if (separator_index != username.npos) + { + last = username.substr(separator_index+1, username.npos); LLStringUtil::trim(last); + } + else + { + // ...on Linden grids, single username users as considered to have + // last name "Resident" + // *TODO: Make login.cgi support "account_name" like above + last = "Resident"; + } if (last.find_first_of(' ') == last.npos) { @@ -812,7 +827,7 @@ void LLPanelLogin::loadLoginPage() curl_free(curl_version); // Grid - char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLoginID().c_str(), 0); + char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLabel().c_str(), 0); oStr << "&grid=" << curl_grid; curl_free(curl_grid); gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid()); @@ -1104,9 +1119,10 @@ void LLPanelLogin::updateServerCombo() { if (!grid_choice->first.empty()) { - server_choice_combo->add(grid_choice->second, grid_choice->first, ADD_SORTED); + server_choice_combo->add(grid_choice->second, grid_choice->first); } } + server_choice_combo->sortByName(); server_choice_combo->addSeparator(ADD_TOP); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 27e054af34..17433a557b 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -39,12 +39,14 @@ #include "llinventorypanel.h" #include "llfiltereditor.h" #include "llfloaterreg.h" +#include "llmenubutton.h" #include "lloutfitobserver.h" #include "llpreviewtexture.h" #include "llresmgr.h" #include "llscrollcontainer.h" #include "llsdserialize.h" #include "llspinctrl.h" +#include "lltoggleablemenu.h" #include "lltooldraganddrop.h" #include "llviewermenu.h" #include "llviewertexturelist.h" @@ -192,6 +194,8 @@ BOOL LLPanelMainInventory::postBuild() mFilterEditor->setCommitCallback(boost::bind(&LLPanelMainInventory::onFilterEdit, this, _2)); } + mGearMenuButton = getChild<LLMenuButton>("options_gear_btn"); + initListCommandsHandlers(); // *TODO:Get the cost info from the server @@ -325,15 +329,23 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata) if (sort_field == "name") { U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order & ~LLInventoryFilter::SO_DATE ); - + order &= ~LLInventoryFilter::SO_DATE; + + getActivePanel()->setSortOrder( order ); + + gSavedSettings.setU32("InventorySortOrder", order); + gSavedSettings.setBOOL("Inventory.SortByName", TRUE ); gSavedSettings.setBOOL("Inventory.SortByDate", FALSE ); } else if (sort_field == "date") { U32 order = getActivePanel()->getSortOrder(); - getActivePanel()->setSortOrder( order | LLInventoryFilter::SO_DATE ); + order |= LLInventoryFilter::SO_DATE; + + getActivePanel()->setSortOrder( order ); + + gSavedSettings.setU32("InventorySortOrder", order); gSavedSettings.setBOOL("Inventory.SortByName", FALSE ); gSavedSettings.setBOOL("Inventory.SortByDate", TRUE ); @@ -371,6 +383,8 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata) gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); } getActivePanel()->setSortOrder( order ); + + gSavedSettings.setU32("InventorySortOrder", order); } } @@ -642,7 +656,7 @@ LLFloaterInventoryFinder::LLFloaterInventoryFinder(LLPanelMainInventory* invento mPanelMainInventory(inventory_view), mFilter(inventory_view->getPanel()->getFilter()) { - LLUICtrlFactory::getInstance()->buildFloater(this, "floater_inventory_view_finder.xml", NULL); + buildFromFile("floater_inventory_view_finder.xml"); updateElementsFromFilter(); } @@ -900,7 +914,6 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data) void LLPanelMainInventory::initListCommandsHandlers() { - childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this)); childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this)); childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this)); @@ -912,8 +925,10 @@ void LLPanelMainInventory::initListCommandsHandlers() )); mCommitCallbackRegistrar.add("Inventory.GearDefault.Custom.Action", boost::bind(&LLPanelMainInventory::onCustomAction, this, _2)); + mEnableCallbackRegistrar.add("Inventory.GearDefault.Check", boost::bind(&LLPanelMainInventory::isActionChecked, this, _2)); mEnableCallbackRegistrar.add("Inventory.GearDefault.Enable", boost::bind(&LLPanelMainInventory::isActionEnabled, this, _2)); - mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mGearMenuButton->setMenu(mMenuGearDefault); mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory_add.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); // Update the trash button when selected item(s) get worn or taken off. @@ -927,11 +942,6 @@ void LLPanelMainInventory::updateListCommands() mTrashButton->setEnabled(trash_enabled); } -void LLPanelMainInventory::onGearButtonClick() -{ - showActionMenu(mMenuGearDefault,"options_gear_btn"); -} - void LLPanelMainInventory::onAddButtonClick() { setUploadCostIfNeeded(); @@ -1001,6 +1011,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata) const LLSD arg = "date"; setSortBy(arg); } + if (command_name == "sort_system_folders_to_top") + { + const LLSD arg = "systemfolderstotop"; + setSortBy(arg); + } if (command_name == "show_filters") { toggleFindOptions(); @@ -1174,6 +1189,31 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata) return TRUE; } +BOOL LLPanelMainInventory::isActionChecked(const LLSD& userdata) +{ + const std::string command_name = userdata.asString(); + + if (command_name == "sort_by_name") + { + U32 order = getActivePanel()->getSortOrder(); + return ~order & LLInventoryFilter::SO_DATE; + } + + if (command_name == "sort_by_recent") + { + U32 order = getActivePanel()->getSortOrder(); + return order & LLInventoryFilter::SO_DATE; + } + + if (command_name == "sort_system_folders_to_top") + { + U32 order = getActivePanel()->getSortOrder(); + return order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP; + } + + return FALSE; +} + bool LLPanelMainInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept) { *accept = ACCEPT_NO; diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index fb31206870..c2b78ff9ea 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -40,7 +40,10 @@ class LLSaveFolderState; class LLFilterEditor; class LLTabContainer; class LLFloaterInventoryFinder; +class LLMenuButton; class LLMenuGL; +class LLToggleableMenu; +class LLFloater; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class LLPanelMainInventory @@ -128,12 +131,12 @@ private: protected: void initListCommandsHandlers(); void updateListCommands(); - void onGearButtonClick(); void onAddButtonClick(); void showActionMenu(LLMenuGL* menu, std::string spawning_view_name); void onTrashButtonClick(); void onClipboardAction(const LLSD& userdata); BOOL isActionEnabled(const LLSD& command_name); + BOOL isActionChecked(const LLSD& userdata); void onCustomAction(const LLSD& command_name); bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept); /** @@ -142,8 +145,9 @@ protected: void setUploadCostIfNeeded(); private: LLDragAndDropButton* mTrashButton; - LLMenuGL* mMenuGearDefault; + LLToggleableMenu* mMenuGearDefault; LLMenuGL* mMenuAdd; + LLMenuButton* mGearMenuButton; bool mNeedUploadCost; // List Commands // diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp index 5cd4cea96d..5ea94e0611 100644 --- a/indra/newview/llpanelme.cpp +++ b/indra/newview/llpanelme.cpp @@ -26,17 +26,28 @@ #include "llviewerprecompiledheaders.h" +#include "llpanelme.h" + +// Viewer includes #include "llpanelprofile.h" #include "llavatarconstants.h" -#include "llpanelme.h" #include "llagent.h" #include "llagentcamera.h" #include "llagentwearables.h" -#include "lliconctrl.h" +#include "llfirstuse.h" +#include "llfloaterreg.h" +#include "llhints.h" #include "llsidetray.h" +#include "llviewercontrol.h" +#include "llviewerdisplayname.h" + +// Linden libraries +#include "llavatarnamecache.h" // IDEVO +#include "lliconctrl.h" +#include "llnotifications.h" +#include "llnotificationsutil.h" // IDEVO #include "lltabcontainer.h" #include "lltexturectrl.h" -#include "llviewercontrol.h" #define PICKER_SECOND_LIFE "2nd_life_pic" #define PICKER_FIRST_LIFE "real_world_pic" @@ -162,9 +173,11 @@ void LLPanelMe::onCancelClicked() LLPanelMyProfileEdit::LLPanelMyProfileEdit() : LLPanelMyProfile() { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_edit_profile.xml"); + buildFromFile( "panel_edit_profile.xml"); setAvatarId(gAgent.getID()); + + LLAvatarNameCache::addUseDisplayNamesCallback(boost::bind(&LLPanelMyProfileEdit::onAvatarNameChanged, this)); } void LLPanelMyProfileEdit::onOpen(const LLSD& key) @@ -174,7 +187,52 @@ void LLPanelMyProfileEdit::onOpen(const LLSD& key) // Disable editing until data is loaded, or edited fields will be overwritten when data // is loaded. enableEditing(false); + + // force new avatar name fetch so we have latest update time + LLAvatarNameCache::fetch(gAgent.getID()); LLPanelMyProfile::onOpen(getAvatarId()); + + LLAvatarName av_name; + if (LLAvatarNameCache::useDisplayNames()) + { + if (LLAvatarNameCache::get(gAgent.getID(), &av_name) && av_name.mIsDisplayNameDefault) + { + LLFirstUse::setDisplayName(); + } + else + { + LLFirstUse::setDisplayName(false); + } + } + + if (LLAvatarNameCache::useDisplayNames()) + { + getChild<LLUICtrl>("user_label")->setVisible( true ); + getChild<LLUICtrl>("user_slid")->setVisible( true ); + getChild<LLUICtrl>("display_name_label")->setVisible( true ); + getChild<LLUICtrl>("set_name")->setVisible( true ); + getChild<LLUICtrl>("set_name")->setEnabled( true ); + getChild<LLUICtrl>("solo_user_name")->setVisible( false ); + getChild<LLUICtrl>("solo_username_label")->setVisible( false ); + } + else + { + getChild<LLUICtrl>("user_label")->setVisible( false ); + getChild<LLUICtrl>("user_slid")->setVisible( false ); + getChild<LLUICtrl>("display_name_label")->setVisible( false ); + getChild<LLUICtrl>("set_name")->setVisible( false ); + getChild<LLUICtrl>("set_name")->setEnabled( false ); + getChild<LLUICtrl>("solo_user_name")->setVisible( true ); + getChild<LLUICtrl>("solo_username_label")->setVisible( true ); + } +} + +void LLPanelMyProfileEdit::onClose(const LLSD& key) +{ + if (LLAvatarNameCache::useDisplayNames()) + { + LLFirstUse::setDisplayName(false); + } } void LLPanelMyProfileEdit::processProperties(void* data, EAvatarProcessorType type) @@ -207,15 +265,63 @@ void LLPanelMyProfileEdit::processProfileProperties(const LLAvatarData* avatar_d getChild<LLUICtrl>("show_in_search_checkbox")->setValue((BOOL)(avatar_data->flags & AVATAR_ALLOW_PUBLISH)); - std::string first, last; - BOOL found = gCacheName->getName(avatar_data->avatar_id, first, last); - if (found) + LLAvatarNameCache::get(avatar_data->avatar_id, + boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2)); +} + +void LLPanelMyProfileEdit::onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name) +{ + getChild<LLUICtrl>("user_name")->setValue( av_name.mDisplayName ); + getChild<LLUICtrl>("user_slid")->setValue( av_name.mUsername ); + getChild<LLUICtrl>("user_name_small")->setValue( av_name.mDisplayName ); + getChild<LLUICtrl>("solo_user_name")->setValue( av_name.mDisplayName ); + + + if (LLAvatarNameCache::useDisplayNames()) { - getChild<LLUICtrl>("name_text")->setTextArg("[FIRST]", first); - getChild<LLUICtrl>("name_text")->setTextArg("[LAST]", last); + getChild<LLUICtrl>("user_label")->setVisible( true ); + getChild<LLUICtrl>("user_slid")->setVisible( true ); + getChild<LLUICtrl>("display_name_label")->setVisible( true ); + getChild<LLUICtrl>("set_name")->setVisible( true ); + getChild<LLUICtrl>("set_name")->setEnabled( true ); + + getChild<LLUICtrl>("solo_user_name")->setVisible( false ); + getChild<LLUICtrl>("solo_username_label")->setVisible( false ); + + // show smaller display name if too long to display in regular size + if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth()) + { + getChild<LLUICtrl>("user_name_small")->setVisible( true ); + getChild<LLUICtrl>("user_name")->setVisible( false ); + } + else + { + getChild<LLUICtrl>("user_name_small")->setVisible( false ); + getChild<LLUICtrl>("user_name")->setVisible( true ); + } + } + else + { + getChild<LLUICtrl>("user_label")->setVisible( false ); + getChild<LLUICtrl>("user_slid")->setVisible( false ); + getChild<LLUICtrl>("display_name_label")->setVisible( false ); + getChild<LLUICtrl>("set_name")->setVisible( false ); + getChild<LLUICtrl>("set_name")->setEnabled( false ); + + getChild<LLUICtrl>("solo_user_name")->setVisible( true ); + getChild<LLUICtrl>("user_name_small")->setVisible( false ); + getChild<LLUICtrl>("user_name")->setVisible( false ); + getChild<LLUICtrl>("solo_username_label")->setVisible( true ); } } + +void LLPanelMyProfileEdit::onAvatarNameChanged() +{ + LLAvatarNameCache::get(getAvatarId(), + boost::bind(&LLPanelMyProfileEdit::onNameCache, this, _1, _2)); +} + BOOL LLPanelMyProfileEdit::postBuild() { initTexturePickerMouseEvents(); @@ -223,6 +329,11 @@ BOOL LLPanelMyProfileEdit::postBuild() getChild<LLUICtrl>("partner_edit_link")->setTextArg("[URL]", getString("partner_edit_link_url")); getChild<LLUICtrl>("my_account_link")->setTextArg("[URL]", getString("my_account_link_url")); + getChild<LLUICtrl>("set_name")->setCommitCallback( + boost::bind(&LLPanelMyProfileEdit::onClickSetName, this)); + + LLHints::registerHintTarget("set_display_name", getChild<LLUICtrl>("set_name")->getHandle()); + LLViewerDisplayName::addNameChangedCallback(boost::bind(&LLPanelMyProfileEdit::onAvatarNameChanged, this)); return LLPanelAvatarProfile::postBuild(); } /** @@ -250,8 +361,12 @@ void LLPanelMyProfileEdit::resetData() { LLPanelMyProfile::resetData(); - getChild<LLUICtrl>("name_text")->setTextArg("[FIRST]", LLStringUtil::null); - getChild<LLUICtrl>("name_text")->setTextArg("[LAST]", LLStringUtil::null); + //childSetTextArg("name_text", "[FIRST]", LLStringUtil::null); + //childSetTextArg("name_text", "[LAST]", LLStringUtil::null); + getChild<LLUICtrl>("user_name")->setValue( LLSD() ); + getChild<LLUICtrl>("user_slid")->setValue( LLSD() ); + getChild<LLUICtrl>("solo_user_name")->setValue( LLSD() ); + getChild<LLUICtrl>("user_name_small")->setValue( LLSD() ); } void LLPanelMyProfileEdit::onTexturePickerMouseEnter(LLUICtrl* ctrl) @@ -263,6 +378,43 @@ void LLPanelMyProfileEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl) mTextureEditIconMap[ctrl->getName()]->setVisible(FALSE); } +void LLPanelMyProfileEdit::onClickSetName() +{ + LLAvatarNameCache::get(getAvatarId(), + boost::bind(&LLPanelMyProfileEdit::onAvatarNameCache, + this, _1, _2)); + + LLFirstUse::setDisplayName(false); +} + +void LLPanelMyProfileEdit::onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name) +{ + if (av_name.mDisplayName.empty()) + { + // something is wrong, tell user to try again later + LLNotificationsUtil::add("SetDisplayNameFailedGeneric"); + return; + } + + llinfos << "name-change now " << LLDate::now() << " next_update " + << LLDate(av_name.mNextUpdate) << llendl; + F64 now_secs = LLDate::now().secondsSinceEpoch(); + + if (now_secs < av_name.mNextUpdate) + { + // if the update time is more than a year in the future, it means updates have been blocked + // show a more general message + const int YEAR = 60*60*24*365; + if (now_secs + YEAR < av_name.mNextUpdate) + { + LLNotificationsUtil::add("SetDisplayNameBlocked"); + return; + } + } + + LLFloaterReg::showInstance("display_name"); +} + void LLPanelMyProfileEdit::enableEditing(bool enable) { getChildView("2nd_life_pic")->setEnabled(enable); diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h index 984ba1e9a2..d5b2fee869 100644 --- a/indra/newview/llpanelme.h +++ b/indra/newview/llpanelme.h @@ -28,8 +28,9 @@ #define LL_LLPANELMEPROFILE_H #include "llpanel.h" -#include "llpanelavatar.h" +#include "llpanelprofile.h" +class LLAvatarName; class LLPanelMyProfileEdit; class LLPanelProfile; class LLIconCtrl; @@ -77,17 +78,23 @@ public: /*virtual*/BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ void onClose(const LLSD& key); + + void onAvatarNameChanged(); protected: /*virtual*/void resetData(); void processProfileProperties(const LLAvatarData* avatar_data); + void onNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); private: void initTexturePickerMouseEvents(); void onTexturePickerMouseEnter(LLUICtrl* ctrl); void onTexturePickerMouseLeave(LLUICtrl* ctrl); + void onClickSetName(); + void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); /** * Enabled/disables controls to prevent overwriting edited data upon receiving @@ -95,6 +102,8 @@ private: */ void enableEditing(bool enable); + + private: // map TexturePicker name => Edit Icon pointer should be visible while hovering Texture Picker typedef std::map<std::string, LLIconCtrl*> texture_edit_icon_map_t; diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 92c8365a70..2856ea9db1 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -74,7 +74,7 @@ LLPanelMediaSettingsGeneral::LLPanelMediaSettingsGeneral() : mMediaEditable(false) { // build dialog from XML - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_general.xml"); + buildFromFile( "panel_media_settings_general.xml"); } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmediasettingspermissions.cpp b/indra/newview/llpanelmediasettingspermissions.cpp index 339376cbf6..cb0b7789ff 100644 --- a/indra/newview/llpanelmediasettingspermissions.cpp +++ b/indra/newview/llpanelmediasettingspermissions.cpp @@ -59,7 +59,7 @@ LLPanelMediaSettingsPermissions::LLPanelMediaSettingsPermissions() : mPermsWorldControl( 0 ) { // build dialog from XML - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_permissions.xml"); + buildFromFile( "panel_media_settings_permissions.xml"); } //////////////////////////////////////////////////////////////////////////////// @@ -101,16 +101,16 @@ void LLPanelMediaSettingsPermissions::draw() if(mPermsGroupName) { mPermsGroupName->setNameID(group_id, true); - }; + } } else { if(mPermsGroupName) { mPermsGroupName->setNameID(LLUUID::null, TRUE); - mPermsGroupName->refresh(LLUUID::null, LLStringUtil::null, LLStringUtil::null, true); - }; - }; + mPermsGroupName->refresh(LLUUID::null, std::string(), true); + } + } } //////////////////////////////////////////////////////////////////////////////// @@ -192,7 +192,7 @@ void LLPanelMediaSettingsPermissions::initValues( void* userdata, const LLSD& me data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() ); }; }; - + // *NOTE: If any of a particular flavor is tentative, we have to disable // them all because of an architectural issue: namely that we represent // these as a bit field, and we can't selectively apply only one bit to all selected diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index a0d4c2f761..b588e8f930 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -53,7 +53,7 @@ LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() : mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this)); // build dialog from XML - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml"); + buildFromFile( "panel_media_settings_security.xml"); } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index 811d70ade3..fcc67d6840 100644 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -96,7 +96,7 @@ LLPanelNearByMedia::LLPanelNearByMedia() mCommitCallbackRegistrar.add("SelectedMediaCtrl.Zoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaZoom, this)); mCommitCallbackRegistrar.add("SelectedMediaCtrl.Unzoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaUnzoom, this)); - LLUICtrlFactory::instance().buildPanel(this, "panel_nearby_media.xml"); + buildFromFile( "panel_nearby_media.xml"); } LLPanelNearByMedia::~LLPanelNearByMedia() diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index d756a1b931..a0c320ba19 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -1695,10 +1695,10 @@ void LLPanelObject::sendPosition(BOOL btn_down) LLVector3 newpos(mCtrlPosX->get(), mCtrlPosY->get(), mCtrlPosZ->get()); LLViewerRegion* regionp = mObject->getRegion(); - + // Clamp the Z height const F32 height = newpos.mV[VZ]; - const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject); + const F32 min_height = LLWorld::getInstance()->getMinAllowedZ(mObject, mObject->getPositionGlobal()); const F32 max_height = LLWorld::getInstance()->getRegionMaxHeight(); if (!mObject->isAttachment()) diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp index 2f1300e0f2..8202dfe9a3 100644 --- a/indra/newview/llpanelonlinestatus.cpp +++ b/indra/newview/llpanelonlinestatus.cpp @@ -35,7 +35,7 @@ LLPanelOnlineStatus::LLPanelOnlineStatus( LLPanelTipToast(notification) { - LLUICtrlFactory::getInstance()->buildPanel(this, + buildFromFile( "panel_online_status_toast.xml"); diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index 54b0805a6c..ce9b1c66d7 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -56,11 +56,13 @@ #include "llinventorymodel.h" #include "llinventorymodelbackgroundfetch.h" #include "llloadingindicator.h" +#include "llmenubutton.h" #include "llpaneloutfitsinventory.h" #include "lluiconstants.h" #include "llsaveoutfitcombobtn.h" #include "llscrolllistctrl.h" #include "lltextbox.h" +#include "lltoggleablemenu.h" #include "lltrans.h" #include "lluictrlfactory.h" #include "llsdutil.h" @@ -151,13 +153,13 @@ std::string LLShopURLDispatcher::resolveURL(LLAssetType::EType asset_type, ESex class LLPanelOutfitEditGearMenu { public: - static LLMenuGL* create() + static LLToggleableMenu* create() { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("Wearable.Create", boost::bind(onCreate, _2)); - LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( "menu_cof_gear.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); llassert(menu); if (menu) @@ -218,7 +220,7 @@ private: class LLAddWearablesGearMenu : public LLInitClass<LLAddWearablesGearMenu> { public: - static LLMenuGL* create(LLWearableItemsList* flat_list, LLInventoryPanel* inventory_panel) + static LLToggleableMenu* create(LLWearableItemsList* flat_list, LLInventoryPanel* inventory_panel) { LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar; @@ -233,7 +235,7 @@ public: enable_registrar.add("AddWearable.Gear.Check", boost::bind(onCheck, flat_list_handle, inventory_panel_handle, _2)); enable_registrar.add("AddWearable.Gear.Visible", boost::bind(onVisible, inventory_panel_handle, _2)); - LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + LLToggleableMenu* menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( "menu_add_wearable_gear.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance()); @@ -403,7 +405,10 @@ LLPanelOutfitEdit::LLPanelOutfitEdit() mAddWearablesPanel(NULL), mFolderViewFilterCmbBox(NULL), mListViewFilterCmbBox(NULL), - mPlusBtn(NULL) + mWearableListManager(NULL), + mPlusBtn(NULL), + mWearablesGearMenuBtn(NULL), + mGearMenuBtn(NULL) { mSavedFolderState = new LLSaveFolderState(); mSavedFolderState->setApply(FALSE); @@ -428,6 +433,7 @@ LLPanelOutfitEdit::LLPanelOutfitEdit() LLPanelOutfitEdit::~LLPanelOutfitEdit() { + delete mWearableListManager; delete mSavedFolderState; delete mCOFDragAndDropObserver; @@ -478,14 +484,15 @@ BOOL LLPanelOutfitEdit::postBuild() childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL); childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL); childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL); - childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); - childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL); childSetCommitCallback("shop_btn_1", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); childSetCommitCallback("shop_btn_2", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL); setVisibleCallback(boost::bind(&LLPanelOutfitEdit::onVisibilityChange, this, _2)); - mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list"); + mWearablesGearMenuBtn = getChild<LLMenuButton>("wearables_gear_menu_btn"); + mGearMenuBtn = getChild<LLMenuButton>("gear_menu_btn"); + + mCOFWearables = findChild<LLCOFWearables>("cof_wearables_list"); mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this)); mCOFWearables->getCOFCallbacks().mAddWearable = boost::bind(&LLPanelOutfitEdit::onAddWearableClicked, this); @@ -557,6 +564,13 @@ BOOL LLPanelOutfitEdit::postBuild() mWearableItemsList->setComparator(mWearableListViewItemsComparator); + // Creating "Add Wearables" panel gear menu after initialization of mWearableItemsList and mInventoryItemsPanel. + mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); + mWearablesGearMenuBtn->setMenu(mAddWearablesGearMenu); + + mGearMenu = LLPanelOutfitEditGearMenu::create(); + mGearMenuBtn->setMenu(mGearMenu); + mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this)); return TRUE; } @@ -912,7 +926,7 @@ void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void) { LLUUID id_to_remove = mCOFWearables->getSelectedUUID(); LLWearableType::EType type = getWearableTypeByItemUUID(id_to_remove); - + LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove); if (!mCOFWearables->getSelectedItem()) @@ -1031,7 +1045,7 @@ void LLPanelOutfitEdit::filterWearablesBySelectedItem(void) LLUUID selected_item_id = mWearableItemsList->getSelectedUUID(); LLViewerInventoryItem* item = gInventory.getLinkedItem(selected_item_id); if(item) - { + { showFilteredWearablesListView(item->getWearableType()); return; } @@ -1256,37 +1270,6 @@ void LLPanelOutfitEdit::resetAccordionState() } } -void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button) -{ - LLMenuGL* menu = NULL; - - if (mAddWearablesPanel->getVisible()) - { - if (!mAddWearablesGearMenu) - { - mAddWearablesGearMenu = LLAddWearablesGearMenu::create(mWearableItemsList, mInventoryItemsPanel); - } - - menu = mAddWearablesGearMenu; - } - else - { - if (!mGearMenu) - { - mGearMenu = LLPanelOutfitEditGearMenu::create(); - } - - menu = mGearMenu; - } - - if (!menu) return; - - menu->arrangeAndClear(); // update menu height - S32 menu_y = menu->getRect().getHeight() + clicked_button->getRect().getHeight(); - menu->buildDrawLabels(); - LLMenuGL::showPopup(clicked_button, menu, 0, menu_y); -} - void LLPanelOutfitEdit::onAddMoreButtonClicked() { toggleAddWearablesPanel(); diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h index 2dca986e33..fd366e9cbc 100644 --- a/indra/newview/llpaneloutfitedit.h +++ b/indra/newview/llpaneloutfitedit.h @@ -54,6 +54,7 @@ class LLScrollListCtrl; class LLToggleableMenu; class LLFilterEditor; class LLFilteredWearableListManager; +class LLMenuButton; class LLMenuGL; class LLFindNonLinksByMask; class LLFindWearablesOfType; @@ -186,8 +187,6 @@ public: std::string& tooltip_msg); private: - - void onGearButtonClick(LLUICtrl* clicked_button); void onAddMoreButtonClicked(); void showFilteredWearablesListView(LLWearableType::EType type); void onOutfitChanging(bool started); @@ -234,12 +233,12 @@ private: std::vector<LLFilterItem*> mListViewItemTypes; LLCOFWearables* mCOFWearables; - LLMenuGL* mGearMenu; - LLMenuGL* mAddWearablesGearMenu; + LLToggleableMenu* mGearMenu; + LLToggleableMenu* mAddWearablesGearMenu; bool mInitialized; std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn; - - + LLMenuButton* mWearablesGearMenuBtn; + LLMenuButton* mGearMenuBtn; }; diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp index c6a7bd88a0..a90f864ae2 100644 --- a/indra/newview/llpaneloutfitsinventory.cpp +++ b/indra/newview/llpaneloutfitsinventory.cpp @@ -217,15 +217,6 @@ void LLPanelOutfitsInventory::onSave() //payload["ids"].append(*it); LLNotificationsUtil::add("SaveOutfitAs", args, payload, boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1, _2)); - - //) - -/* - LLOutfitSaveAsDialog* save_as_dialog = LLFloaterReg::showTypedInstance<LLOutfitSaveAsDialog>("outfit_save_as", LLSD(outfit_name), TRUE); - if (save_as_dialog) - { - save_as_dialog->setSaveAsCommit(boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1 )); - }*/ } //static @@ -241,9 +232,7 @@ void LLPanelOutfitsInventory::initListCommandsHandlers() { mListCommands = getChild<LLPanel>("bottom_panel"); mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this)); - mMyOutfitsPanel->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this)); mMyOutfitsPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this)); - mCurrentOutfitPanel->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this)); } void LLPanelOutfitsInventory::updateListCommands() @@ -267,27 +256,9 @@ void LLPanelOutfitsInventory::updateListCommands() } } -void LLPanelOutfitsInventory::showGearMenu() -{ - if (!mActivePanel) return; - - LLView* spawning_view = getChild<LLView>("options_gear_btn"); - mActivePanel->showGearMenu(spawning_view); -} - void LLPanelOutfitsInventory::onTrashButtonClick() { - LLNotificationsUtil::add("DeleteOutfits", LLSD(), LLSD(), boost::bind(&LLPanelOutfitsInventory::onOutfitsRemovalConfirmation, this, _1, _2)); -} - -void LLPanelOutfitsInventory::onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if (option != 0) return; // canceled - mMyOutfitsPanel->removeSelected(); - updateListCommands(); - updateVerbs(); } bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) @@ -302,10 +273,10 @@ bool LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata) void LLPanelOutfitsInventory::initTabPanels() { - mCurrentOutfitPanel = getChild<LLPanelWearing>(COF_TAB_NAME); + mCurrentOutfitPanel = findChild<LLPanelWearing>(COF_TAB_NAME); mCurrentOutfitPanel->setSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); - mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME); + mMyOutfitsPanel = findChild<LLOutfitsList>(OUTFITS_TAB_NAME); mMyOutfitsPanel->setSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this)); mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs"); diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h index f1ca1dbfeb..a7917b457c 100644 --- a/indra/newview/llpaneloutfitsinventory.h +++ b/indra/newview/llpaneloutfitsinventory.h @@ -89,7 +89,6 @@ protected: void onWearButtonClick(); void showGearMenu(); void onTrashButtonClick(); - void onOutfitsRemovalConfirmation(const LLSD& notification, const LLSD& response); bool isActionEnabled(const LLSD& userdata); void setWearablesLoading(bool val); void onWearablesLoaded(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index d096b17145..71c812efe2 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -27,12 +27,15 @@ #include "llviewerprecompiledheaders.h" // libs +#include "llavatarname.h" #include "llfloaterreg.h" +#include "llmenubutton.h" #include "llmenugl.h" #include "llnotificationsutil.h" #include "lleventtimer.h" #include "llfiltereditor.h" #include "lltabcontainer.h" +#include "lltoggleablemenu.h" #include "lluictrlfactory.h" #include "llpanelpeople.h" @@ -463,7 +466,11 @@ LLPanelPeople::LLPanelPeople() mAllFriendList(NULL), mNearbyList(NULL), mRecentList(NULL), - mGroupList(NULL) + mGroupList(NULL), + mNearbyGearButton(NULL), + mFriendsGearButton(NULL), + mGroupsGearButton(NULL), + mRecentGearButton(NULL) { mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this)); mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this)); @@ -599,11 +606,6 @@ BOOL LLPanelPeople::postBuild() buttonSetAction("teleport_btn", boost::bind(&LLPanelPeople::onTeleportButtonClicked, this)); buttonSetAction("share_btn", boost::bind(&LLPanelPeople::onShareButtonClicked, this)); - getChild<LLPanel>(NEARBY_TAB_NAME)->childSetAction("nearby_view_sort_btn",boost::bind(&LLPanelPeople::onNearbyViewSortButtonClicked, this)); - getChild<LLPanel>(RECENT_TAB_NAME)->childSetAction("recent_viewsort_btn",boost::bind(&LLPanelPeople::onRecentViewSortButtonClicked, this)); - getChild<LLPanel>(FRIENDS_TAB_NAME)->childSetAction("friends_viewsort_btn",boost::bind(&LLPanelPeople::onFriendsViewSortButtonClicked, this)); - getChild<LLPanel>(GROUP_TAB_NAME)->childSetAction("groups_viewsort_btn",boost::bind(&LLPanelPeople::onGroupsViewSortButtonClicked, this)); - // Must go after setting commit callback and initializing all pointers to children. mTabContainer->selectTabByName(NEARBY_TAB_NAME); @@ -623,24 +625,41 @@ BOOL LLPanelPeople::postBuild() enable_registrar.add("People.Recent.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onRecentViewSortMenuItemCheck, this, _2)); enable_registrar.add("People.Nearby.ViewSort.CheckItem", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemCheck, this, _2)); + mNearbyGearButton = getChild<LLMenuButton>("nearby_view_sort_btn"); + mFriendsGearButton = getChild<LLMenuButton>("friends_viewsort_btn"); + mGroupsGearButton = getChild<LLMenuButton>("groups_viewsort_btn"); + mRecentGearButton = getChild<LLMenuButton>("recent_viewsort_btn"); + LLMenuGL* plus_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_group_plus.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mGroupPlusMenuHandle = plus_menu->getHandle(); - LLMenuGL* nearby_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_nearby_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + LLToggleableMenu* nearby_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_nearby_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); if(nearby_view_sort) + { mNearbyViewSortMenuHandle = nearby_view_sort->getHandle(); + mNearbyGearButton->setMenu(nearby_view_sort); + } - LLMenuGL* friend_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_friends_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + LLToggleableMenu* friend_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_friends_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); if(friend_view_sort) + { mFriendsViewSortMenuHandle = friend_view_sort->getHandle(); + mFriendsGearButton->setMenu(friend_view_sort); + } - LLMenuGL* group_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_groups_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + LLToggleableMenu* group_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_groups_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); if(group_view_sort) + { mGroupsViewSortMenuHandle = group_view_sort->getHandle(); + mGroupsGearButton->setMenu(group_view_sort); + } - LLMenuGL* recent_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_people_recent_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + LLToggleableMenu* recent_view_sort = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_people_recent_view_sort.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); if(recent_view_sort) + { mRecentViewSortMenuHandle = recent_view_sort->getHandle(); + mRecentGearButton->setMenu(recent_view_sort); + } LLVoiceClient::getInstance()->addObserver(this); @@ -910,7 +929,7 @@ void LLPanelPeople::showGroupMenu(LLMenuGL* menu) // Calculate its coordinates. // (assumes that groups panel is the current tab) - LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel"); + LLPanel* bottom_panel = mTabContainer->getCurrentPanel()->getChild<LLPanel>("bottom_panel"); LLPanel* parent_panel = mTabContainer->getCurrentPanel(); menu->arrangeAndClear(); S32 menu_height = menu->getRect().getHeight(); @@ -1150,12 +1169,10 @@ void LLPanelPeople::onActivateButtonClicked() } // static -void LLPanelPeople::onAvatarPicked( - const std::vector<std::string>& names, - const uuid_vec_t& ids) +void LLPanelPeople::onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names) { if (!names.empty() && !ids.empty()) - LLAvatarActions::requestFriendshipDialog(ids[0], names[0]); + LLAvatarActions::requestFriendshipDialog(ids[0], names[0].getCompleteName()); } void LLPanelPeople::onGroupPlusButtonClicked() @@ -1347,38 +1364,6 @@ void LLPanelPeople::onMoreButtonClicked() // *TODO: not implemented yet } -void LLPanelPeople::onFriendsViewSortButtonClicked() -{ - LLMenuGL* menu = (LLMenuGL*)mFriendsViewSortMenuHandle.get(); - if (!menu) - return; - showGroupMenu(menu); -} - -void LLPanelPeople::onGroupsViewSortButtonClicked() -{ - LLMenuGL* menu = (LLMenuGL*)mGroupsViewSortMenuHandle.get(); - if (!menu) - return; - showGroupMenu(menu); -} - -void LLPanelPeople::onRecentViewSortButtonClicked() -{ - LLMenuGL* menu = (LLMenuGL*)mRecentViewSortMenuHandle.get(); - if (!menu) - return; - showGroupMenu(menu); -} - -void LLPanelPeople::onNearbyViewSortButtonClicked() -{ - LLMenuGL* menu = (LLMenuGL*)mNearbyViewSortMenuHandle.get(); - if (!menu) - return; - showGroupMenu(menu); -} - void LLPanelPeople::onOpen(const LLSD& key) { std::string tab_name = key["people_panel_tab_name"]; diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index d0913ee756..4412aed062 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -32,10 +32,12 @@ #include "llcallingcard.h" // for avatar tracker #include "llvoiceclient.h" -class LLFilterEditor; -class LLTabContainer; class LLAvatarList; +class LLAvatarName; +class LLFilterEditor; class LLGroupList; +class LLMenuButton; +class LLTabContainer; class LLPanelPeople : public LLPanel @@ -100,10 +102,6 @@ private: void onShareButtonClicked(); void onMoreButtonClicked(); void onActivateButtonClicked(); - void onRecentViewSortButtonClicked(); - void onNearbyViewSortButtonClicked(); - void onFriendsViewSortButtonClicked(); - void onGroupsViewSortButtonClicked(); void onAvatarListDoubleClicked(LLUICtrl* ctrl); void onAvatarListCommitted(LLAvatarList* list); void onGroupPlusButtonClicked(); @@ -122,9 +120,7 @@ private: bool onNearbyViewSortMenuItemCheck(const LLSD& userdata); // misc callbacks - static void onAvatarPicked( - const std::vector<std::string>& names, - const uuid_vec_t& ids); + static void onAvatarPicked(const uuid_vec_t& ids, const std::vector<LLAvatarName> names); void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list); @@ -157,6 +153,11 @@ private: Updater* mNearbyListUpdater; Updater* mRecentListUpdater; + LLMenuButton* mNearbyGearButton; + LLMenuButton* mFriendsGearButton; + LLMenuButton* mGroupsGearButton; + LLMenuButton* mRecentGearButton; + std::string mFilterSubString; std::string mFilterSubStringOrig; }; diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp index e35574be6c..59130236f2 100644 --- a/indra/newview/llpanelpermissions.cpp +++ b/indra/newview/llpanelpermissions.cpp @@ -379,7 +379,7 @@ void LLPanelPermissions::refresh() if (mLabelGroupName) { mLabelGroupName->setNameID(LLUUID::null, TRUE); - mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE); + mLabelGroupName->refresh(LLUUID::null, std::string(), true); mLabelGroupName->setEnabled(FALSE); } } diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 7615a93a49..271728220c 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -74,7 +74,7 @@ LLPanelPickInfo* LLPanelPickInfo::create() { LLPanelPickInfo* panel = new LLPanelPickInfo(); - LLUICtrlFactory::getInstance()->buildPanel(panel, XML_PANEL_PICK_INFO); + panel->buildFromFile(XML_PANEL_PICK_INFO); return panel; } @@ -344,7 +344,7 @@ void LLPanelPickInfo::onClickBack() LLPanelPickEdit* LLPanelPickEdit::create() { LLPanelPickEdit* panel = new LLPanelPickEdit(); - LLUICtrlFactory::getInstance()->buildPanel(panel, XML_PANEL_EDIT_PICK); + panel->buildFromFile(XML_PANEL_EDIT_PICK); return panel; } diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index a5c3c9faef..ccef563544 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -229,9 +229,9 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) LLAvatarPicks* avatar_picks = static_cast<LLAvatarPicks*>(data); if(avatar_picks && getAvatarId() == avatar_picks->target_id) { - std::string name, second_name; - gCacheName->getName(getAvatarId(),name,second_name); - getChild<LLUICtrl>("pick_title")->setTextArg("[NAME]", name); + std::string full_name; + gCacheName->getFullName(getAvatarId(), full_name); + getChild<LLUICtrl>("pick_title")->setTextArg("[NAME]", full_name); // Save selection, to be able to edit same item after saving changes. See EXT-3023. LLUUID selected_id = mPicksList->getSelectedValue()[PICK_ID]; @@ -1039,7 +1039,7 @@ LLPickItem::LLPickItem() , mSnapshotID(LLUUID::null) , mNeedData(true) { - LLUICtrlFactory::getInstance()->buildPanel(this,"panel_pick_list_item.xml"); + buildFromFile("panel_pick_list_item.xml"); } LLPickItem::~LLPickItem() @@ -1169,7 +1169,7 @@ LLClassifiedItem::LLClassifiedItem(const LLUUID& avatar_id, const LLUUID& classi , mAvatarId(avatar_id) , mClassifiedId(classified_id) { - LLUICtrlFactory::getInstance()->buildPanel(this,"panel_classifieds_list_item.xml"); + buildFromFile("panel_classifieds_list_item.xml"); LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this); LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId()); diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index bbaffda2f2..9cbb512e70 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -28,6 +28,7 @@ #include "llpanelplaceinfo.h" +#include "llavatarname.h" #include "llsdutil.h" #include "llsdutil_math.h" @@ -304,9 +305,15 @@ void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* } // static -void LLPanelPlaceInfo::nameUpdatedCallback(LLTextBox* text, - const std::string& first, - const std::string& last) +void LLPanelPlaceInfo::onNameCache(LLTextBox* text, const std::string& full_name) { - text->setText(first + " " + last); + text->setText(full_name); +} + +// static +void LLPanelPlaceInfo::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name, + LLTextBox* text) +{ + text->setText( av_name.getCompleteName() ); } diff --git a/indra/newview/llpanelplaceinfo.h b/indra/newview/llpanelplaceinfo.h index 1e0975a898..64f0b6b550 100644 --- a/indra/newview/llpanelplaceinfo.h +++ b/indra/newview/llpanelplaceinfo.h @@ -34,6 +34,7 @@ #include "llremoteparcelrequest.h" +class LLAvatarName; class LLExpandableTextBox; class LLIconCtrl; class LLInventoryItem; @@ -96,9 +97,10 @@ public: void createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel); protected: - static void nameUpdatedCallback(LLTextBox* text, - const std::string& first, - const std::string& last); + static void onNameCache(LLTextBox* text, const std::string& full_name); + static void onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name, + LLTextBox* text); /** * mParcelID is valid only for remote places, in other cases it's null. See resetLocation() diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 801db1e741..68ecb0165c 100644 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -28,6 +28,7 @@ #include "llpanelplaceprofile.h" +#include "llavatarnamecache.h" #include "llparcel.h" #include "message.h" @@ -45,6 +46,7 @@ #include "llappviewer.h" #include "llcallbacklist.h" #include "llbuycurrencyhtml.h" +#include "llslurl.h" #include "llstatusbar.h" #include "llviewercontrol.h" #include "llviewerparcelmgr.h" @@ -430,11 +432,11 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, if(!parcel->getGroupID().isNull()) { // FIXME: Using parcel group as region group. - gCacheName->get(parcel->getGroupID(), TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionGroupText, _2, _3)); + gCacheName->getGroup(parcel->getGroupID(), + boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2)); - gCacheName->get(parcel->getGroupID(), TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); + gCacheName->getGroup(parcel->getGroupID(), + boost::bind(&LLPanelPlaceInfo::onNameCache, mParcelOwner, _2)); } else { @@ -446,10 +448,12 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, else { // Figure out the owner's name - gCacheName->get(parcel->getOwnerID(), FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mParcelOwner, _2, _3)); - gCacheName->get(region->getOwner(), FALSE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mRegionOwnerText, _2, _3)); + std::string parcel_owner = + LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString(); + mParcelOwner->setText(parcel_owner); + LLAvatarNameCache::get(region->getOwner(), + boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, + _1, _2, mRegionOwnerText)); } if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus()) @@ -471,9 +475,10 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID(); if(auth_buyer_id.notNull()) { - gCacheName->get(auth_buyer_id, TRUE, - boost::bind(&LLPanelPlaceInfo::nameUpdatedCallback, mSaleToText, _2, _3)); - + LLAvatarNameCache::get(auth_buyer_id, + boost::bind(&LLPanelPlaceInfo::onAvatarNameCache, + _1, _2, mSaleToText)); + // Show sales info to a specific person or a group he belongs to. if (auth_buyer_id != gAgent.getID() && !gAgent.isInGroup(auth_buyer_id)) { diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 5aed1e55e3..f0e60386b6 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -37,6 +37,7 @@ #include "llcombobox.h" #include "llfiltereditor.h" +#include "llfirstuse.h" #include "llfloaterreg.h" #include "llnotificationsutil.h" #include "lltabcontainer.h" @@ -246,7 +247,7 @@ LLPanelPlaces::LLPanelPlaces() LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback( boost::bind(&LLPanelPlaces::updateVerbs, this)); - //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() + //buildFromFile( "panel_places.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() } LLPanelPlaces::~LLPanelPlaces() @@ -321,8 +322,8 @@ BOOL LLPanelPlaces::postBuild() mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false)); } - mPlaceProfile = getChild<LLPanelPlaceProfile>("panel_place_profile"); - mLandmarkInfo = getChild<LLPanelLandmarkInfo>("panel_landmark_info"); + mPlaceProfile = findChild<LLPanelPlaceProfile>("panel_place_profile"); + mLandmarkInfo = findChild<LLPanelLandmarkInfo>("panel_landmark_info"); if (!mPlaceProfile || !mLandmarkInfo) return FALSE; @@ -346,6 +347,8 @@ BOOL LLPanelPlaces::postBuild() void LLPanelPlaces::onOpen(const LLSD& key) { + LLFirstUse::notUsingDestinationGuide(false); + if (!mPlaceProfile || !mLandmarkInfo) return; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index f198a411a3..b04971f980 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -114,7 +114,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() : mCommitCallbackRegistrar.add("MediaCtrl.SkipBack", boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this)); mCommitCallbackRegistrar.add("MediaCtrl.SkipForward", boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this)); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_prim_media_controls.xml"); + buildFromFile( "panel_prim_media_controls.xml"); mInactivityTimer.reset(); mFadeTimer.stop(); mCurrentZoom = ZOOM_NONE; @@ -1173,7 +1173,7 @@ void LLPanelPrimMediaControls::setCurrentURL() // if (media_address_combo && mCurrentURL != "about:blank") // { // media_address_combo->remove(mCurrentURL); -// media_address_combo->add(mCurrentURL, ADD_SORTED); +// media_address_combo->add(mCurrentURL); // media_address_combo->selectByValue(mCurrentURL); // } #else // USE_COMBO_BOX_FOR_MEDIA_URL diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 65b9e76a4e..4e63563979 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -127,11 +127,11 @@ BOOL LLPanelProfile::postBuild() getTabCtrl()->setCommitCallback(boost::bind(&LLPanelProfile::onTabSelected, this, _2)); - LLPanelPicks* panel_picks = getChild<LLPanelPicks>(PANEL_PICKS); + LLPanelPicks* panel_picks = findChild<LLPanelPicks>(PANEL_PICKS); panel_picks->setProfilePanel(this); getTabContainer()[PANEL_PICKS] = panel_picks; - getTabContainer()[PANEL_PROFILE] = getChild<LLPanelAvatarProfile>(PANEL_PROFILE); + getTabContainer()[PANEL_PROFILE] = findChild<LLPanelAvatarProfile>(PANEL_PROFILE); return TRUE; } diff --git a/indra/newview/llpanelprofile.h b/indra/newview/llpanelprofile.h index 0546c18583..d2bcee8076 100644 --- a/indra/newview/llpanelprofile.h +++ b/indra/newview/llpanelprofile.h @@ -27,7 +27,6 @@ #ifndef LL_LLPANELPROFILE_H #define LL_LLPANELPROFILE_H -#include "llviewerprecompiledheaders.h" #include "llpanel.h" #include "llpanelavatar.h" diff --git a/indra/newview/llpanelprofileview.cpp b/indra/newview/llpanelprofileview.cpp index c0f504fef6..7635aedf58 100644 --- a/indra/newview/llpanelprofileview.cpp +++ b/indra/newview/llpanelprofileview.cpp @@ -26,11 +26,13 @@ #include "llviewerprecompiledheaders.h" +#include "llpanelprofileview.h" + #include "llavatarconstants.h" +#include "llavatarnamecache.h" // IDEVO +#include "llclipboard.h" #include "lluserrelations.h" -#include "llpanelprofileview.h" - #include "llavatarpropertiesprocessor.h" #include "llcallingcard.h" #include "llpanelavatar.h" @@ -98,11 +100,15 @@ void LLPanelProfileView::onOpen(const LLSD& key) if(id.notNull() && getAvatarId() != id) { setAvatarId(id); + + // clear name fields, which might have old data + getChild<LLUICtrl>("user_name")->setValue( LLSD() ); + getChild<LLUICtrl>("user_slid")->setValue( LLSD() ); } // Update the avatar name. - gCacheName->get(getAvatarId(), FALSE, - boost::bind(&LLPanelProfileView::onAvatarNameCached, this, _1, _2, _3, _4)); + LLAvatarNameCache::get(getAvatarId(), + boost::bind(&LLPanelProfileView::onAvatarNameCache, this, _1, _2)); updateOnlineStatus(); @@ -114,7 +120,7 @@ BOOL LLPanelProfileView::postBuild() { LLPanelProfile::postBuild(); - getTabContainer()[PANEL_NOTES] = getChild<LLPanelAvatarNotes>(PANEL_NOTES); + getTabContainer()[PANEL_NOTES] = findChild<LLPanelAvatarNotes>(PANEL_NOTES); //*TODO remove this, according to style guide we don't use status combobox getTabContainer()[PANEL_PROFILE]->getChildView("online_me_status_text")->setVisible( FALSE); @@ -124,7 +130,8 @@ BOOL LLPanelProfileView::postBuild() mStatusText->setVisible(false); childSetCommitCallback("back",boost::bind(&LLPanelProfileView::onBackBtnClick,this),NULL); - + childSetCommitCallback("copy_to_clipboard",boost::bind(&LLPanelProfileView::onCopyToClipboard,this),NULL); + return TRUE; } @@ -144,6 +151,12 @@ void LLPanelProfileView::onBackBtnClick() } } +void LLPanelProfileView::onCopyToClipboard() +{ + std::string name = getChild<LLUICtrl>("user_name")->getValue().asString() + " (" + getChild<LLUICtrl>("user_slid")->getValue().asString() + ")"; + gClipboard.copyFromString(utf8str_to_wstring(name)); +} + bool LLPanelProfileView::isGrantedToSeeOnlineStatus() { const LLRelationship* relationship = LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); @@ -192,10 +205,43 @@ void LLPanelProfileView::processOnlineStatus(bool online) mStatusText->setValue(status); } -void LLPanelProfileView::onAvatarNameCached(const LLUUID& id, const std::string& first_name, const std::string& last_name, BOOL is_group) +void LLPanelProfileView::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) { - llassert(getAvatarId() == id); - getChild<LLUICtrl>("user_name", FALSE)->setValue(first_name + " " + last_name); + getChild<LLUICtrl>("user_name")->setValue( av_name.mDisplayName ); + getChild<LLUICtrl>("user_name_small")->setValue( av_name.mDisplayName ); + getChild<LLUICtrl>("user_slid")->setValue( av_name.mUsername ); + + // show smaller display name if too long to display in regular size + if (getChild<LLTextBox>("user_name")->getTextPixelWidth() > getChild<LLTextBox>("user_name")->getRect().getWidth()) + { + getChild<LLUICtrl>("user_name_small")->setVisible( true ); + getChild<LLUICtrl>("user_name")->setVisible( false ); + } + else + { + getChild<LLUICtrl>("user_name_small")->setVisible( false ); + getChild<LLUICtrl>("user_name")->setVisible( true ); + } + + if (LLAvatarNameCache::useDisplayNames()) + { + getChild<LLUICtrl>("user_label")->setVisible( true ); + getChild<LLUICtrl>("user_slid")->setVisible( true ); + getChild<LLUICtrl>("display_name_label")->setVisible( true ); + getChild<LLUICtrl>("copy_to_clipboard")->setVisible( true ); + getChild<LLUICtrl>("copy_to_clipboard")->setEnabled( true ); + getChild<LLUICtrl>("solo_username_label")->setVisible( false ); + } + else + { + getChild<LLUICtrl>("user_label")->setVisible( false ); + getChild<LLUICtrl>("user_slid")->setVisible( false ); + getChild<LLUICtrl>("display_name_label")->setVisible( false ); + getChild<LLUICtrl>("copy_to_clipboard")->setVisible( false ); + getChild<LLUICtrl>("copy_to_clipboard")->setEnabled( false ); + getChild<LLUICtrl>("solo_username_label")->setVisible( true ); + } } // EOF diff --git a/indra/newview/llpanelprofileview.h b/indra/newview/llpanelprofileview.h index 9972b085d8..c6d921fdc4 100644 --- a/indra/newview/llpanelprofileview.h +++ b/indra/newview/llpanelprofileview.h @@ -33,6 +33,7 @@ #include "llagent.h" #include "lltooldraganddrop.h" +class LLAvatarName; class LLPanelProfile; class LLPanelProfileTab; class LLTextBox; @@ -73,6 +74,7 @@ public: protected: void onBackBtnClick(); + void onCopyToClipboard(); bool isGrantedToSeeOnlineStatus(); /** @@ -93,11 +95,11 @@ protected: private: // LLCacheName will call this function when avatar name is loaded from server. // This is required to display names that have not been cached yet. - void onAvatarNameCached( - const LLUUID& id, - const std::string& first_name, - const std::string& last_name, - BOOL is_group); +// void onNameCache( +// const LLUUID& id, +// const std::string& full_name, +// bool is_group); + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); LLTextBox* mStatusText; AvatarStatusObserver* mAvatarStatusObserver; diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index a7cbf52290..fff8ccb912 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llfloaterreg.h" +#include "llmenubutton.h" #include "llfloaterworldmap.h" #include "llpanelteleporthistory.h" @@ -40,6 +41,7 @@ #include "llflatlistview.h" #include "llnotificationsutil.h" #include "lltextbox.h" +#include "lltoggleablemenu.h" #include "llviewermenu.h" #include "lllandmarkactions.h" #include "llclipboard.h" @@ -126,7 +128,7 @@ LLTeleportHistoryFlatItem::LLTeleportHistoryFlatItem(S32 index, LLTeleportHistor mRegionName(region_name), mHighlight(hl) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_teleport_history_item.xml"); + buildFromFile( "panel_teleport_history_item.xml"); } LLTeleportHistoryFlatItem::~LLTeleportHistoryFlatItem() @@ -375,9 +377,10 @@ LLTeleportHistoryPanel::LLTeleportHistoryPanel() mHistoryAccordion(NULL), mAccordionTabMenu(NULL), mLastSelectedFlatlList(NULL), - mLastSelectedItemIndex(-1) + mLastSelectedItemIndex(-1), + mMenuGearButton(NULL) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_teleport_history.xml"); + buildFromFile( "panel_teleport_history.xml"); } LLTeleportHistoryPanel::~LLTeleportHistoryPanel() @@ -439,8 +442,6 @@ BOOL LLTeleportHistoryPanel::postBuild() } } - getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this)); - LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar; registrar.add("TeleportHistory.ExpandAllFolders", boost::bind(&LLTeleportHistoryPanel::onExpandAllFolders, this)); @@ -448,9 +449,14 @@ BOOL LLTeleportHistoryPanel::postBuild() registrar.add("TeleportHistory.ClearTeleportHistory", boost::bind(&LLTeleportHistoryPanel::onClearTeleportHistory, this)); mEnableCallbackRegistrar.add("TeleportHistory.GearMenu.Enable", boost::bind(&LLTeleportHistoryPanel::isActionEnabled, this, _2)); - LLMenuGL* gear_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_teleport_history_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mMenuGearButton = getChild<LLMenuButton>("gear_btn"); + + LLToggleableMenu* gear_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_teleport_history_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());; if(gear_menu) + { mGearMenuHandle = gear_menu->getHandle(); + mMenuGearButton->setMenu(gear_menu); + } return TRUE; } @@ -985,27 +991,6 @@ LLFlatListView* LLTeleportHistoryPanel::getFlatListViewFromTab(LLAccordionCtrlTa return NULL; } -void LLTeleportHistoryPanel::onGearButtonClicked() -{ - LLMenuGL* menu = (LLMenuGL*)mGearMenuHandle.get(); - if (!menu) - return; - - // Shows the menu at the top of the button bar. - - // Calculate its coordinates. - LLPanel* bottom_panel = getChild<LLPanel>("bottom_panel"); - menu->arrangeAndClear(); - S32 menu_height = menu->getRect().getHeight(); - S32 menu_x = -2; // *HACK: compensates HPAD in showPopup() - S32 menu_y = bottom_panel->getRect().mTop + menu_height; - - // Actually show the menu. - menu->buildDrawLabels(); - menu->updateParent(LLMenuGL::sMenuContainer); - LLMenuGL::showPopup(this, menu, menu_x, menu_y); -} - bool LLTeleportHistoryPanel::isActionEnabled(const LLSD& userdata) const { S32 tabs_cnt = mItemContainers.size(); diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index b5a025b39b..3d29454d15 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -38,6 +38,7 @@ class LLTeleportHistoryStorage; class LLAccordionCtrl; class LLAccordionCtrlTab; class LLFlatListView; +class LLMenuButton; class LLTeleportHistoryPanel : public LLPanelPlacesTab { @@ -94,7 +95,6 @@ private: void showTeleportHistory(); void handleItemSelect(LLFlatListView* ); LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *); - void onGearButtonClicked(); bool isActionEnabled(const LLSD& userdata) const; void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); @@ -118,6 +118,7 @@ private: ContextMenu mContextMenu; LLContextMenu* mAccordionTabMenu; LLHandle<LLView> mGearMenuHandle; + LLMenuButton* mMenuGearButton; }; diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp index 0d17fb3e82..a9ca7314ce 100644 --- a/indra/newview/llpaneltopinfobar.cpp +++ b/indra/newview/llpaneltopinfobar.cpp @@ -66,7 +66,7 @@ LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0) LLUICtrl::CommitCallbackRegistry::currentRegistrar() .add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2)); - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_topinfo_bar.xml"); + buildFromFile( "panel_topinfo_bar.xml"); } LLPanelTopInfoBar::~LLPanelTopInfoBar() diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llpanelvoicedevicesettings.cpp index 34277001ee..aef870d352 100644 --- a/indra/newview/llfloatervoicedevicesettings.cpp +++ b/indra/newview/llpanelvoicedevicesettings.cpp @@ -1,5 +1,5 @@ /** - * @file llfloatervoicedevicesettings.cpp + * @file llpanelvoicedevicesettings.cpp * @author Richard Nelson * @brief Voice communication set-up * @@ -27,13 +27,10 @@ #include "llviewerprecompiledheaders.h" -#include "llfloatervoicedevicesettings.h" +#include "llpanelvoicedevicesettings.h" // Viewer includes -#include "llbutton.h" #include "llcombobox.h" -#include "llfocusmgr.h" -#include "lliconctrl.h" #include "llsliderctrl.h" #include "llviewercontrol.h" #include "llvoiceclient.h" @@ -70,8 +67,10 @@ BOOL LLPanelVoiceDeviceSettings::postBuild() // set mic volume tuning slider based on last mic volume setting volume_slider->setValue(mMicVolume); - childSetCommitCallback("voice_input_device", onCommitInputDevice, this); - childSetCommitCallback("voice_output_device", onCommitOutputDevice, this); + getChild<LLComboBox>("voice_input_device")->setCommitCallback( + boost::bind(&LLPanelVoiceDeviceSettings::onCommitInputDevice, this)); + getChild<LLComboBox>("voice_output_device")->setCommitCallback( + boost::bind(&LLPanelVoiceDeviceSettings::onCommitOutputDevice, this)); return TRUE; } @@ -303,91 +302,20 @@ void LLPanelVoiceDeviceSettings::cleanup() LLVoiceChannel::resume(); } -// static -void LLPanelVoiceDeviceSettings::onCommitInputDevice(LLUICtrl* ctrl, void* user_data) +void LLPanelVoiceDeviceSettings::onCommitInputDevice() { if(LLVoiceClient::getInstance()) { - LLVoiceClient::getInstance()->setCaptureDevice(ctrl->getValue().asString()); + LLVoiceClient::getInstance()->setCaptureDevice( + getChild<LLComboBox>("voice_input_device")->getValue().asString()); } } -// static -void LLPanelVoiceDeviceSettings::onCommitOutputDevice(LLUICtrl* ctrl, void* user_data) +void LLPanelVoiceDeviceSettings::onCommitOutputDevice() { if(LLVoiceClient::getInstance()) { - LLVoiceClient::getInstance()->setRenderDevice(ctrl->getValue().asString()); + LLVoiceClient::getInstance()->setRenderDevice( + getChild<LLComboBox>("voice_input_device")->getValue().asString()); } } - -// -// LLFloaterVoiceDeviceSettings -// - -LLFloaterVoiceDeviceSettings::LLFloaterVoiceDeviceSettings(const LLSD& seed) - : LLFloater(seed), - mDevicePanel(NULL) -{ - mFactoryMap["device_settings"] = LLCallbackMap(createPanelVoiceDeviceSettings, this); - // do not automatically open singleton floaters (as result of getInstance()) -// BOOL no_open = FALSE; -// Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_device_settings.xml", no_open); -} -BOOL LLFloaterVoiceDeviceSettings::postBuild() -{ - center(); - return TRUE; -} - -// virtual -void LLFloaterVoiceDeviceSettings::onOpen(const LLSD& key) -{ - if(mDevicePanel) - { - mDevicePanel->initialize(); - } -} - -// virtual -void LLFloaterVoiceDeviceSettings::onClose(bool app_settings) -{ - if(mDevicePanel) - { - mDevicePanel->apply(); - mDevicePanel->cleanup(); - } -} - -void LLFloaterVoiceDeviceSettings::apply() -{ - if (mDevicePanel) - { - mDevicePanel->apply(); - } -} - -void LLFloaterVoiceDeviceSettings::cancel() -{ - if (mDevicePanel) - { - mDevicePanel->cancel(); - } -} - -void LLFloaterVoiceDeviceSettings::draw() -{ - if (mDevicePanel) - { - mDevicePanel->refresh(); - } - LLFloater::draw(); -} - -// static -void* LLFloaterVoiceDeviceSettings::createPanelVoiceDeviceSettings(void* user_data) -{ - LLFloaterVoiceDeviceSettings* floaterp = (LLFloaterVoiceDeviceSettings*)user_data; - floaterp->mDevicePanel = new LLPanelVoiceDeviceSettings(); - return floaterp->mDevicePanel; -} diff --git a/indra/newview/llfloatervoicedevicesettings.h b/indra/newview/llpanelvoicedevicesettings.h index 5f892972de..636b8b9948 100644 --- a/indra/newview/llfloatervoicedevicesettings.h +++ b/indra/newview/llpanelvoicedevicesettings.h @@ -25,10 +25,10 @@ * $/LicenseInfo$ */ -#ifndef LL_LLFLOATERVOICEDEVICESETTINGS_H -#define LL_LLFLOATERVOICEDEVICESETTINGS_H +#ifndef LL_LLPANELVOICEDEVICESETTINGS_H +#define LL_LLPANELVOICEDEVICESETTINGS_H -#include "llfloater.h" +#include "llpanel.h" class LLPanelVoiceDeviceSettings : public LLPanel { @@ -47,8 +47,8 @@ public: /*virtual*/ void handleVisibilityChange ( BOOL new_visibility ); protected: - static void onCommitInputDevice(LLUICtrl* ctrl, void* user_data); - static void onCommitOutputDevice(LLUICtrl* ctrl, void* user_data); + void onCommitInputDevice(); + void onCommitOutputDevice(); F32 mMicVolume; std::string mInputDevice; @@ -58,26 +58,4 @@ protected: BOOL mDevicesUpdated; }; -class LLFloaterVoiceDeviceSettings : public LLFloater -{ - friend class LLFloaterReg; - -public: - - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - /*virtual*/ void onClose(bool app_settings); - /*virtual*/ void draw(); - void apply(); - void cancel(); -private: - LLFloaterVoiceDeviceSettings(const LLSD& seed); - -protected: - static void* createPanelVoiceDeviceSettings(void* user_data); - -protected: - LLPanelVoiceDeviceSettings* mDevicePanel; -}; - -#endif // LL_LLFLOATERVOICEDEVICESETTINGS_H +#endif // LL_LLPANELVOICEDEVICESETTINGS_H diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp index f2772b5d88..aea7b33d7f 100644 --- a/indra/newview/llpanelvolumepulldown.cpp +++ b/indra/newview/llpanelvolumepulldown.cpp @@ -54,7 +54,7 @@ LLPanelVolumePulldown::LLPanelVolumePulldown() mCommitCallbackRegistrar.add("Vol.setControlFalse", boost::bind(&LLPanelVolumePulldown::setControlFalse, this, _2)); mCommitCallbackRegistrar.add("Vol.GoAudioPrefs", boost::bind(&LLPanelVolumePulldown::onAdvancedButtonClick, this, _2)); - LLUICtrlFactory::instance().buildPanel(this, "panel_volume_pulldown.xml"); + buildFromFile( "panel_volume_pulldown.xml"); } BOOL LLPanelVolumePulldown::postBuild() diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 860470cd73..911a9e5dda 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -28,10 +28,13 @@ #include "llpanelwearing.h" +#include "lltoggleablemenu.h" + #include "llappearancemgr.h" #include "llinventoryfunctions.h" #include "llinventorymodel.h" #include "llinventoryobserver.h" +#include "llmenubutton.h" #include "llsidetray.h" #include "llviewermenu.h" #include "llwearableitemslist.h" @@ -58,21 +61,12 @@ public: enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2)); - mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>( + mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>( "menu_wearing_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); llassert(mMenu); } - void show(LLView* spawning_view) - { - if (!mMenu) return; - - mMenu->buildDrawLabels(); - mMenu->updateParent(LLMenuGL::sMenuContainer); - S32 menu_x = 0; - S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight(); - LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y); - } + LLToggleableMenu* getMenu() { return mMenu; } private: @@ -87,8 +81,8 @@ private: } } - LLMenuGL* mMenu; - LLPanelWearing* mPanelWearing; + LLToggleableMenu* mMenu; + LLPanelWearing* mPanelWearing; }; ////////////////////////////////////////////////////////////////////////// @@ -189,6 +183,10 @@ BOOL LLPanelWearing::postBuild() mCOFItemsList = getChild<LLWearableItemsList>("cof_items_list"); mCOFItemsList->setRightMouseDownCallback(boost::bind(&LLPanelWearing::onWearableItemsListRightClick, this, _1, _2, _3)); + LLMenuButton* menu_gear_btn = getChild<LLMenuButton>("options_gear_btn"); + + menu_gear_btn->setMenu(mGearMenu->getMenu()); + return TRUE; } @@ -253,13 +251,6 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata) return false; } -// virtual -void LLPanelWearing::showGearMenu(LLView* spawning_view) -{ - if (!mGearMenu) return; - mGearMenu->show(spawning_view); -} - boost::signals2::connection LLPanelWearing::setSelectionChangeCallback(commit_callback_t cb) { if (!mCOFItemsList) return boost::signals2::connection(); diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index 1fa97735b1..157b2c4c5f 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -58,8 +58,6 @@ public: /*virtual*/ bool isActionEnabled(const LLSD& userdata); - /*virtual*/ void showGearMenu(LLView* spawning_view); - /*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const; boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb); diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index c8aa9ac91e..54053cf89f 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -197,17 +197,20 @@ private: uuid_set_t mAvalineCallers; }; -LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/, - bool exclude_agent /*= true*/, bool can_toggle_icons /*= true*/): +LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, + LLAvatarList* avatar_list, + bool use_context_menu/* = true*/, + bool exclude_agent /*= true*/, + bool can_toggle_icons /*= true*/) : mSpeakerMgr(data_source), mAvatarList(avatar_list), - mSortOrder(E_SORT_BY_NAME) -, mParticipantListMenu(NULL) -, mExcludeAgent(exclude_agent) -, mValidateSpeakerCallback(NULL) + mParticipantListMenu(NULL), + mExcludeAgent(exclude_agent), + mValidateSpeakerCallback(NULL) { + mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1), - boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1)); + boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1)); mSpeakerAddListener = new SpeakerAddListener(*this); mSpeakerRemoveListener = new SpeakerRemoveListener(*this); @@ -331,11 +334,18 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) if ( item ) { std::string name = item->getAvatarName(); + std::string tooltip = item->getAvatarToolTip(); size_t found = name.find(moderator_indicator); if (found != std::string::npos) { name.erase(found, moderator_indicator_len); - item->setName(name); + item->setAvatarName(name); + } + found = tooltip.find(moderator_indicator); + if (found != tooltip.npos) + { + tooltip.erase(found, moderator_indicator_len); + item->setAvatarToolTip(tooltip); } } } @@ -351,12 +361,20 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) if ( item ) { std::string name = item->getAvatarName(); + std::string tooltip = item->getAvatarToolTip(); size_t found = name.find(moderator_indicator); if (found == std::string::npos) { name += " "; name += moderator_indicator; - item->setName(name); + item->setAvatarName(name); + } + found = tooltip.find(moderator_indicator); + if (found == std::string::npos) + { + tooltip += " "; + tooltip += moderator_indicator; + item->setAvatarToolTip(tooltip); } } } @@ -378,15 +396,15 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param) } /* -Seems this method is not necessary after onAvalineCallerRemoved was implemented; + Seems this method is not necessary after onAvalineCallerRemoved was implemented; -It does nothing because list item is always created with correct class type for Avaline caller. -For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client -session. -This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call. + It does nothing because list item is always created with correct class type for Avaline caller. + For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client + session. + This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call. -Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself. -Asked in EXT-4301. + Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself. + Asked in EXT-4301. */ void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id) { @@ -428,16 +446,19 @@ void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id) void LLParticipantList::setSortOrder(EParticipantSortOrder order) { - if ( mSortOrder != order ) + const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder"); + + if ( speaker_sort_order != order ) { - mSortOrder = order; + gSavedSettings.setU32("SpeakerParticipantDefaultOrder", (U32)order); sort(); } } -LLParticipantList::EParticipantSortOrder LLParticipantList::getSortOrder() +const LLParticipantList::EParticipantSortOrder LLParticipantList::getSortOrder() const { - return mSortOrder; + const U32 speaker_sort_order = gSavedSettings.getU32("SpeakerParticipantDefaultOrder"); + return EParticipantSortOrder(speaker_sort_order); } void LLParticipantList::setValidateSpeakerCallback(validate_speaker_callback_t cb) @@ -536,28 +557,29 @@ void LLParticipantList::sort() if ( !mAvatarList ) return; - switch ( mSortOrder ) { - case E_SORT_BY_NAME : - // if mExcludeAgent == true , then no need to keep agent on top of the list - if(mExcludeAgent) - { - mAvatarList->sortByName(); - } - else - { - mAvatarList->setComparator(&AGENT_ON_TOP_NAME_COMPARATOR); + switch ( getSortOrder() ) + { + case E_SORT_BY_NAME : + // if mExcludeAgent == true , then no need to keep agent on top of the list + if(mExcludeAgent) + { + mAvatarList->sortByName(); + } + else + { + mAvatarList->setComparator(&AGENT_ON_TOP_NAME_COMPARATOR); + mAvatarList->sort(); + } + break; + case E_SORT_BY_RECENT_SPEAKERS: + if (mSortByRecentSpeakers.isNull()) + mSortByRecentSpeakers = new LLAvatarItemRecentSpeakerComparator(*this); + mAvatarList->setComparator(mSortByRecentSpeakers.get()); mAvatarList->sort(); - } - break; - case E_SORT_BY_RECENT_SPEAKERS: - if (mSortByRecentSpeakers.isNull()) - mSortByRecentSpeakers = new LLAvatarItemRecentSpeakerComparator(*this); - mAvatarList->setComparator(mSortByRecentSpeakers.get()); - mAvatarList->sort(); - break; - default : - llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl; - return; + break; + default : + llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl; + return; } } @@ -630,7 +652,7 @@ bool LLParticipantList::SpeakerClearListener::handleEvent(LLPointer<LLOldEvents: // bool LLParticipantList::SpeakerModeratorUpdateListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) { - return mParent.onModeratorUpdateEvent(event, userdata); + return mParent.onModeratorUpdateEvent(event, userdata); } bool LLParticipantList::SpeakerMuteListener::handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata) @@ -852,7 +874,7 @@ void LLParticipantList::LLParticipantListMenu::confirmMuteAllCallback(const LLSD const LLUUID& session_id = payload["session_id"]; LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> ( - LLIMModel::getInstance()->getSpeakerManager(session_id)); + LLIMModel::getInstance()->getSpeakerManager(session_id)); if (speaker_manager) { speaker_manager->moderateVoiceAllParticipants(false); @@ -910,9 +932,9 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& } /* -Processed menu items with such parameters: - can_allow_text_chat - can_moderate_voice + Processed menu items with such parameters: + can_allow_text_chat + can_moderate_voice */ bool LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem(const LLSD& userdata) { @@ -963,11 +985,11 @@ bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& } else if(item == "is_sorted_by_name") { - return E_SORT_BY_NAME == mParent.mSortOrder; + return E_SORT_BY_NAME == mParent.getSortOrder(); } else if(item == "is_sorted_by_recent_speakers") { - return E_SORT_BY_RECENT_SPEAKERS == mParent.mSortOrder; + return E_SORT_BY_RECENT_SPEAKERS == mParent.getSortOrder(); } return false; diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 722a749d19..e0b3d42c25 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -24,6 +24,9 @@ * $/LicenseInfo$ */ +#ifndef LL_PARTICIPANTLIST_H +#define LL_PARTICIPANTLIST_H + #include "llviewerprecompiledheaders.h" #include "llevent.h" #include "llavatarlist.h" // for LLAvatarItemRecentSpeakerComparator @@ -37,239 +40,247 @@ class LLAvalineUpdater; class LLParticipantList { LOG_CLASS(LLParticipantList); +public: + + typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t; + + LLParticipantList(LLSpeakerMgr* data_source, + LLAvatarList* avatar_list, + bool use_context_menu = true, + bool exclude_agent = true, + bool can_toggle_icons = true); + ~LLParticipantList(); + void setSpeakingIndicatorsVisible(BOOL visible); + + enum EParticipantSortOrder + { + E_SORT_BY_NAME = 0, + E_SORT_BY_RECENT_SPEAKERS = 1, + }; + + /** + * Adds specified avatar ID to the existing list if it is not Agent's ID + * + * @param[in] avatar_id - Avatar UUID to be added into the list + */ + void addAvatarIDExceptAgent(const LLUUID& avatar_id); + + /** + * Set and sort Avatarlist by given order + */ + void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME); + const EParticipantSortOrder getSortOrder() const; + + /** + * Refreshes the participant list if it's in sort by recent speaker order. + */ + void updateRecentSpeakersOrder(); + + /** + * Set a callback to be called before adding a speaker. Invalid speakers will not be added. + * + * If the callback is unset all speakers are considered as valid. + * + * @see onAddItemEvent() + */ + void setValidateSpeakerCallback(validate_speaker_callback_t cb); + +protected: + /** + * LLSpeakerMgr event handlers + */ + bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + + /** + * Sorts the Avatarlist by stored order + */ + void sort(); + + /** + * List of listeners implementing LLOldEvents::LLSimpleListener. + * There is no way to handle all the events in one listener as LLSpeakerMgr registers + * listeners in such a way that one listener can handle only one type of event + **/ + class BaseSpeakerListener : public LLOldEvents::LLSimpleListener + { public: + BaseSpeakerListener(LLParticipantList& parent) : mParent(parent) {} + protected: + LLParticipantList& mParent; + }; - typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t; - - LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true, bool can_toggle_icons = true); - ~LLParticipantList(); - void setSpeakingIndicatorsVisible(BOOL visible); - - typedef enum e_participant_sort_oder { - E_SORT_BY_NAME = 0, - E_SORT_BY_RECENT_SPEAKERS = 1, - } EParticipantSortOrder; + class SpeakerAddListener : public BaseSpeakerListener + { + public: + SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} + /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + }; - /** - * Adds specified avatar ID to the existing list if it is not Agent's ID - * - * @param[in] avatar_id - Avatar UUID to be added into the list - */ - void addAvatarIDExceptAgent(const LLUUID& avatar_id); + class SpeakerRemoveListener : public BaseSpeakerListener + { + public: + SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} + /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + }; - /** - * Set and sort Avatarlist by given order - */ - void setSortOrder(EParticipantSortOrder order = E_SORT_BY_NAME); - EParticipantSortOrder getSortOrder(); + class SpeakerClearListener : public BaseSpeakerListener + { + public: + SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} + /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + }; - /** - * Refreshes the participant list if it's in sort by recent speaker order. - */ - void updateRecentSpeakersOrder(); + class SpeakerModeratorUpdateListener : public BaseSpeakerListener + { + public: + SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} + /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + }; + + class SpeakerMuteListener : public BaseSpeakerListener + { + public: + SpeakerMuteListener(LLParticipantList& parent) : BaseSpeakerListener(parent) {} - /** - * Set a callback to be called before adding a speaker. Invalid speakers will not be added. - * - * If the callback is unset all speakers are considered as valid. - * - * @see onAddItemEvent() - */ - void setValidateSpeakerCallback(validate_speaker_callback_t cb); + /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + }; + /** + * Menu used in the participant list. + */ + class LLParticipantListMenu : public LLListContextMenu + { + public: + LLParticipantListMenu(LLParticipantList& parent):mParent(parent){}; + /*virtual*/ LLContextMenu* createMenu(); + /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); protected: + LLParticipantList& mParent; + private: + bool enableContextMenuItem(const LLSD& userdata); + bool enableModerateContextMenuItem(const LLSD& userdata); + bool checkContextMenuItem(const LLSD& userdata); + + void sortParticipantList(const LLSD& userdata); + void toggleAllowTextChat(const LLSD& userdata); + void toggleMute(const LLSD& userdata, U32 flags); + void toggleMuteText(const LLSD& userdata); + void toggleMuteVoice(const LLSD& userdata); + /** - * LLSpeakerMgr event handlers + * Return true if Agent is group moderator(and moderator of group call). */ - bool onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - bool onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - bool onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - bool onModeratorUpdateEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - bool onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); + bool isGroupModerator(); + // Voice moderation support /** - * Sorts the Avatarlist by stored order + * Check whether specified by argument avatar is muted for group chat or not. */ - void sort(); - - //List of listeners implementing LLOldEvents::LLSimpleListener. - //There is no way to handle all the events in one listener as LLSpeakerMgr registers listeners in such a way - //that one listener can handle only one type of event - class BaseSpeakerListner : public LLOldEvents::LLSimpleListener - { - public: - BaseSpeakerListner(LLParticipantList& parent) : mParent(parent) {} - protected: - LLParticipantList& mParent; - }; - - class SpeakerAddListener : public BaseSpeakerListner - { - public: - SpeakerAddListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} - /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - }; - - class SpeakerRemoveListener : public BaseSpeakerListner - { - public: - SpeakerRemoveListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} - /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - }; - - class SpeakerClearListener : public BaseSpeakerListner - { - public: - SpeakerClearListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} - /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - }; - - class SpeakerModeratorUpdateListener : public BaseSpeakerListner - { - public: - SpeakerModeratorUpdateListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} - /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - }; - - class SpeakerMuteListener : public BaseSpeakerListner - { - public: - SpeakerMuteListener(LLParticipantList& parent) : BaseSpeakerListner(parent) {} - - /*virtual*/ bool handleEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata); - }; + bool isMuted(const LLUUID& avatar_id); /** - * Menu used in the participant list. + * Processes Voice moderation menu items. + * + * It calls either moderateVoiceParticipant() or moderateVoiceParticipant() depend on + * passed parameter. + * + * @param userdata can be "selected" or "others". + * + * @see moderateVoiceParticipant() + * @see moderateVoiceAllParticipants() */ - class LLParticipantListMenu : public LLListContextMenu - { - public: - LLParticipantListMenu(LLParticipantList& parent):mParent(parent){}; - /*virtual*/ LLContextMenu* createMenu(); - /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y); - protected: - LLParticipantList& mParent; - private: - bool enableContextMenuItem(const LLSD& userdata); - bool enableModerateContextMenuItem(const LLSD& userdata); - bool checkContextMenuItem(const LLSD& userdata); - - void sortParticipantList(const LLSD& userdata); - void toggleAllowTextChat(const LLSD& userdata); - void toggleMute(const LLSD& userdata, U32 flags); - void toggleMuteText(const LLSD& userdata); - void toggleMuteVoice(const LLSD& userdata); - - /** - * Return true if Agent is group moderator(and moderator of group call). - */ - bool isGroupModerator(); - - // Voice moderation support - /** - * Check whether specified by argument avatar is muted for group chat or not. - */ - bool isMuted(const LLUUID& avatar_id); - - /** - * Processes Voice moderation menu items. - * - * It calls either moderateVoiceParticipant() or moderateVoiceParticipant() depend on - * passed parameter. - * - * @param userdata can be "selected" or "others". - * - * @see moderateVoiceParticipant() - * @see moderateVoiceAllParticipants() - */ - void moderateVoice(const LLSD& userdata); - - /** - * Mutes/Unmutes avatar for current group voice chat. - * - * It only marks avatar as muted for session and does not use local Agent's Block list. - * It does not mute Agent itself. - * - * @param[in] avatar_id UUID of avatar to be processed - * @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted. - * - * @see moderateVoiceAllParticipants() - */ - void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute); - - /** - * Mutes/Unmutes all avatars for current group voice chat. - * - * It only marks avatars as muted for session and does not use local Agent's Block list. - * - * @param[in] unmute if true - avatars will be muted, otherwise - unmuted. - * - * @see moderateVoiceParticipant() - */ - void moderateVoiceAllParticipants(bool unmute); - - static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response); - }; + void moderateVoice(const LLSD& userdata); /** - * Comparator for comparing avatar items by last spoken time + * Mutes/Unmutes avatar for current group voice chat. + * + * It only marks avatar as muted for session and does not use local Agent's Block list. + * It does not mute Agent itself. + * + * @param[in] avatar_id UUID of avatar to be processed + * @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted. + * + * @see moderateVoiceAllParticipants() */ - class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator, public LLRefCount - { - LOG_CLASS(LLAvatarItemRecentSpeakerComparator); - public: - LLAvatarItemRecentSpeakerComparator(LLParticipantList& parent):mParent(parent){}; - virtual ~LLAvatarItemRecentSpeakerComparator() {}; - protected: - virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const; - private: - LLParticipantList& mParent; - }; - - private: - void onAvatarListDoubleClicked(LLUICtrl* ctrl); - void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); - - void onAvalineCallerFound(const LLUUID& participant_id); - void onAvalineCallerRemoved(const LLUUID& participant_id); + void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute); /** - * Adjusts passed participant to work properly. + * Mutes/Unmutes all avatars for current group voice chat. * - * Adds SpeakerMuteListener to process moderation actions. - */ - void adjustParticipant(const LLUUID& speaker_id); - - LLSpeakerMgr* mSpeakerMgr; - LLAvatarList* mAvatarList; - - std::set<LLUUID> mModeratorList; - std::set<LLUUID> mModeratorToRemoveList; - - LLPointer<SpeakerAddListener> mSpeakerAddListener; - LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener; - LLPointer<SpeakerClearListener> mSpeakerClearListener; - LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener; - LLPointer<SpeakerMuteListener> mSpeakerMuteListener; - - LLParticipantListMenu* mParticipantListMenu; - - EParticipantSortOrder mSortOrder; - /* - * This field manages an adding a new avatar_id in the mAvatarList - * If true, then agent_id wont be added into mAvatarList - * Also by default this field is controlling a sort procedure, @c sort() + * It only marks avatars as muted for session and does not use local Agent's Block list. + * + * @param[in] unmute if true - avatars will be muted, otherwise - unmuted. + * + * @see moderateVoiceParticipant() */ - bool mExcludeAgent; + void moderateVoiceAllParticipants(bool unmute); - // boost::connections - boost::signals2::connection mAvatarListDoubleClickConnection; - boost::signals2::connection mAvatarListRefreshConnection; - boost::signals2::connection mAvatarListReturnConnection; - boost::signals2::connection mAvatarListToggleIconsConnection; + static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response); + }; - LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers; - validate_speaker_callback_t mValidateSpeakerCallback; - LLAvalineUpdater* mAvalineUpdater; + /** + * Comparator for comparing avatar items by last spoken time + */ + class LLAvatarItemRecentSpeakerComparator : public LLAvatarItemNameComparator, public LLRefCount + { + LOG_CLASS(LLAvatarItemRecentSpeakerComparator); + public: + LLAvatarItemRecentSpeakerComparator(LLParticipantList& parent):mParent(parent){}; + virtual ~LLAvatarItemRecentSpeakerComparator() {}; + protected: + virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const; + private: + LLParticipantList& mParent; + }; + +private: + void onAvatarListDoubleClicked(LLUICtrl* ctrl); + void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); + + void onAvalineCallerFound(const LLUUID& participant_id); + void onAvalineCallerRemoved(const LLUUID& participant_id); + + /** + * Adjusts passed participant to work properly. + * + * Adds SpeakerMuteListener to process moderation actions. + */ + void adjustParticipant(const LLUUID& speaker_id); + + LLSpeakerMgr* mSpeakerMgr; + LLAvatarList* mAvatarList; + + std::set<LLUUID> mModeratorList; + std::set<LLUUID> mModeratorToRemoveList; + + LLPointer<SpeakerAddListener> mSpeakerAddListener; + LLPointer<SpeakerRemoveListener> mSpeakerRemoveListener; + LLPointer<SpeakerClearListener> mSpeakerClearListener; + LLPointer<SpeakerModeratorUpdateListener> mSpeakerModeratorListener; + LLPointer<SpeakerMuteListener> mSpeakerMuteListener; + + LLParticipantListMenu* mParticipantListMenu; + + /** + * This field manages an adding a new avatar_id in the mAvatarList + * If true, then agent_id wont be added into mAvatarList + * Also by default this field is controlling a sort procedure, @c sort() + */ + bool mExcludeAgent; + + // boost::connections + boost::signals2::connection mAvatarListDoubleClickConnection; + boost::signals2::connection mAvatarListRefreshConnection; + boost::signals2::connection mAvatarListReturnConnection; + boost::signals2::connection mAvatarListToggleIconsConnection; + + LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers; + validate_speaker_callback_t mValidateSpeakerCallback; + LLAvalineUpdater* mAvalineUpdater; }; + +#endif // LL_PARTICIPANTLIST_H diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp index 408270a1a0..29e262199e 100644 --- a/indra/newview/llplacesinventorypanel.cpp +++ b/indra/newview/llplacesinventorypanel.cpp @@ -205,24 +205,6 @@ BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask) return LLFolderView::handleRightMouseDown(x, y, mask); } -BOOL LLPlacesFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg) -{ - // Don't accept anything except landmarks and folders to be dropped - // in places folder view. See STORM-296. - if (cargo_type != DAD_LANDMARK && cargo_type != DAD_CATEGORY) - { - *accept = ACCEPT_NO; - return FALSE; - } - - return LLFolderView::handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, - accept, tooltip_msg); -} - void LLPlacesFolderView::setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle) { mMenuHandlesByInventoryType[asset_type] = menu_handle; diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h index a44776d18b..6641871a0b 100644 --- a/indra/newview/llplacesinventorypanel.h +++ b/indra/newview/llplacesinventorypanel.h @@ -70,12 +70,6 @@ public: */ /*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask ); - /*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, - EDragAndDropType cargo_type, - void* cargo_data, - EAcceptance* accept, - std::string& tooltip_msg); - void setupMenuHandle(LLInventoryType::EType asset_type, LLHandle<LLView> menu_handle); void setParentLandmarksPanel(LLLandmarksPanel* panel) diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp index b328f65349..8e8b530e13 100644 --- a/indra/newview/llpreviewanim.cpp +++ b/indra/newview/llpreviewanim.cpp @@ -43,7 +43,6 @@ extern LLAgent gAgent; LLPreviewAnim::LLPreviewAnim(const LLSD& key) : LLPreview( key ) { - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_preview_animation.xml", FALSE); } // static diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp index 3f4edbaf97..16284d1a7e 100644 --- a/indra/newview/llpreviewgesture.cpp +++ b/indra/newview/llpreviewgesture.cpp @@ -311,9 +311,6 @@ LLPreviewGesture::LLPreviewGesture(const LLSD& key) NONE_LABEL = LLTrans::getString("---"); SHIFT_LABEL = LLTrans::getString("KBShift"); CTRL_LABEL = LLTrans::getString("KBCtrl"); - - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_gesture.xml", FALSE); - } diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index e85a6a7094..9f3ee6ac5d 100644 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -71,7 +71,6 @@ LLPreviewNotecard::LLPreviewNotecard(const LLSD& key) //const LLUUID& item_id, { mAssetID = item->getAssetUUID(); } - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_preview_notecard.xml", FALSE); } LLPreviewNotecard::~LLPreviewNotecard() diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 60c030e95f..330e809c53 100644 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -34,11 +34,13 @@ #include "llcheckboxctrl.h" #include "llcombobox.h" #include "lldir.h" +#include "llexternaleditor.h" #include "llfloaterreg.h" #include "llinventorydefines.h" #include "llinventorymodel.h" #include "llkeyboard.h" #include "lllineeditor.h" +#include "lllivefile.h" #include "llhelp.h" #include "llnotificationsutil.h" #include "llresmgr.h" @@ -116,6 +118,54 @@ static bool have_script_upload_cap(LLUUID& object_id) } /// --------------------------------------------------------------------------- +/// LLLiveLSLFile +/// --------------------------------------------------------------------------- +class LLLiveLSLFile : public LLLiveFile +{ +public: + LLLiveLSLFile(std::string file_path, LLLiveLSLEditor* parent); + ~LLLiveLSLFile(); + + void ignoreNextUpdate() { mIgnoreNextUpdate = true; } + +protected: + /*virtual*/ bool loadFile(); + + LLLiveLSLEditor* mParent; + bool mIgnoreNextUpdate; +}; + +LLLiveLSLFile::LLLiveLSLFile(std::string file_path, LLLiveLSLEditor* parent) +: mParent(parent) +, mIgnoreNextUpdate(false) +, LLLiveFile(file_path, 1.0) +{ +} + +LLLiveLSLFile::~LLLiveLSLFile() +{ + LLFile::remove(filename()); +} + +bool LLLiveLSLFile::loadFile() +{ + if (mIgnoreNextUpdate) + { + mIgnoreNextUpdate = false; + return true; + } + + if (!mParent->loadScriptText(filename())) + { + return false; + } + + // Disable sync to avoid recursive load->save->load calls. + mParent->saveIfNeeded(false); + return true; +} + +/// --------------------------------------------------------------------------- /// LLFloaterScriptSearch /// --------------------------------------------------------------------------- class LLFloaterScriptSearch : public LLFloater @@ -154,7 +204,7 @@ LLFloaterScriptSearch::LLFloaterScriptSearch(LLScriptEdCore* editor_core) : LLFloater(LLSD()), mEditorCore(editor_core) { - LLUICtrlFactory::getInstance()->buildFloater(this,"floater_script_search.xml", NULL); + buildFromFile("floater_script_search.xml"); sInstance = this; @@ -281,6 +331,7 @@ LLScriptEdCore::LLScriptEdCore( const LLHandle<LLFloater>& floater_handle, void (*load_callback)(void*), void (*save_callback)(void*, BOOL), + void (*edit_callback)(void*), void (*search_replace_callback) (void* userdata), void* userdata, S32 bottom_pad) @@ -290,6 +341,7 @@ LLScriptEdCore::LLScriptEdCore( mEditor( NULL ), mLoadCallback( load_callback ), mSaveCallback( save_callback ), + mEditCallback( edit_callback ), mSearchReplaceCallback( search_replace_callback ), mUserdata( userdata ), mForceClose( FALSE ), @@ -329,6 +381,7 @@ BOOL LLScriptEdCore::postBuild() childSetCommitCallback("lsl errors", &LLScriptEdCore::onErrorList, this); childSetAction("Save_btn", boost::bind(&LLScriptEdCore::doSave,this,FALSE)); + childSetAction("Edit_btn", boost::bind(&LLScriptEdCore::onEditButtonClick, this)); initMenu(); @@ -674,7 +727,7 @@ void LLScriptEdCore::onBtnDynamicHelp() if (!live_help_floater) { live_help_floater = new LLFloater(LLSD()); - LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL); + live_help_floater->buildFromFile("floater_lsl_guide.xml", NULL); LLFloater* parent = dynamic_cast<LLFloater*>(getParent()); llassert(parent); if (parent) @@ -809,6 +862,13 @@ void LLScriptEdCore::doSave( BOOL close_after_save ) } } +void LLScriptEdCore::onEditButtonClick() +{ + if (mEditCallback) + { + mEditCallback(mUserdata); + } +} void LLScriptEdCore::onBtnUndoChanges() { @@ -949,6 +1009,7 @@ void* LLPreviewLSL::createScriptEdPanel(void* userdata) self->getHandle(), LLPreviewLSL::onLoad, LLPreviewLSL::onSave, + NULL, // no edit callback LLPreviewLSL::onSearchReplace, self, 0); @@ -962,7 +1023,6 @@ LLPreviewLSL::LLPreviewLSL(const LLSD& key ) mPendingUploads(0) { mFactoryMap["script panel"] = LLCallbackMap(LLPreviewLSL::createScriptEdPanel, this); - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_script_preview.xml", FALSE); } // virtual @@ -1418,6 +1478,7 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata) self->getHandle(), &LLLiveLSLEditor::onLoad, &LLLiveLSLEditor::onSave, + &LLLiveLSLEditor::onEdit, &LLLiveLSLEditor::onSearchReplace, self, 0); @@ -1434,10 +1495,10 @@ LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) : mCloseAfterSave(FALSE), mPendingUploads(0), mIsModifiable(FALSE), + mLiveFile(NULL), mIsNew(false) { mFactoryMap["script ed panel"] = LLCallbackMap(LLLiveLSLEditor::createScriptEdPanel, this); - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_live_lsleditor.xml", FALSE); } BOOL LLLiveLSLEditor::postBuild() @@ -1460,6 +1521,7 @@ BOOL LLLiveLSLEditor::postBuild() LLLiveLSLEditor::~LLLiveLSLEditor() { + delete mLiveFile; } // virtual @@ -1641,38 +1703,39 @@ void LLLiveLSLEditor::onLoadComplete(LLVFS *vfs, const LLUUID& asset_id, delete xored_id; } -// unused -// void LLLiveLSLEditor::loadScriptText(const std::string& filename) -// { -// if(!filename) -// { -// llerrs << "Filename is Empty!" << llendl; -// return; -// } -// LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ -// if(file) -// { -// // read in the whole file -// fseek(file, 0L, SEEK_END); -// long file_length = ftell(file); -// fseek(file, 0L, SEEK_SET); -// char* buffer = new char[file_length+1]; -// size_t nread = fread(buffer, 1, file_length, file); -// if (nread < (size_t) file_length) -// { -// llwarns << "Short read" << llendl; -// } -// buffer[nread] = '\0'; -// fclose(file); -// mScriptEd->mEditor->setText(LLStringExplicit(buffer)); -// mScriptEd->mEditor->makePristine(); -// delete[] buffer; -// } -// else -// { -// llwarns << "Error opening " << filename << llendl; -// } -// } + bool LLLiveLSLEditor::loadScriptText(const std::string& filename) + { + if (filename.empty()) + { + llwarns << "Empty file name" << llendl; + return false; + } + + LLFILE* file = LLFile::fopen(filename, "rb"); /*Flawfinder: ignore*/ + if (!file) + { + llwarns << "Error opening " << filename << llendl; + return false; + } + + // read in the whole file + fseek(file, 0L, SEEK_END); + size_t file_length = (size_t) ftell(file); + fseek(file, 0L, SEEK_SET); + char* buffer = new char[file_length+1]; + size_t nread = fread(buffer, 1, file_length, file); + if (nread < file_length) + { + llwarns << "Short read" << llendl; + } + buffer[nread] = '\0'; + fclose(file); + mScriptEd->mEditor->setText(LLStringExplicit(buffer)); + //mScriptEd->mEditor->makePristine(); + delete[] buffer; + + return true; + } void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type) { @@ -1827,9 +1890,8 @@ LLLiveLSLSaveData::LLLiveLSLSaveData(const LLUUID& id, mItem = new LLViewerInventoryItem(item); } -void LLLiveLSLEditor::saveIfNeeded() +void LLLiveLSLEditor::saveIfNeeded(bool sync) { - llinfos << "LLLiveLSLEditor::saveIfNeeded()" << llendl; LLViewerObject* object = gObjectList.findObject(mObjectUUID); if(!object) { @@ -1879,9 +1941,74 @@ void LLLiveLSLEditor::saveIfNeeded() mItem->setAssetUUID(asset_id); mItem->setTransactionID(tid); - // write out the data, and store it in the asset database + writeToFile(filename); + + if (sync) + { + // Sync with external ed2itor. + std::string tmp_file = getTmpFileName(); + llstat s; + if (LLFile::stat(tmp_file, &s) == 0) // file exists + { + if (mLiveFile) mLiveFile->ignoreNextUpdate(); + writeToFile(tmp_file); + } + } + + // save it out to asset server + std::string url = object->getRegion()->getCapability("UpdateScriptTask"); + getWindow()->incBusyCount(); + mPendingUploads++; + BOOL is_running = getChild<LLCheckBoxCtrl>( "running")->get(); + if (!url.empty()) + { + uploadAssetViaCaps(url, filename, mObjectUUID, mItemUUID, is_running); + } + else if (gAssetStorage) + { + uploadAssetLegacy(filename, object, tid, is_running); + } +} + +void LLLiveLSLEditor::openExternalEditor() +{ + LLViewerObject* object = gObjectList.findObject(mObjectUUID); + if(!object) + { + LLNotificationsUtil::add("SaveScriptFailObjectNotFound"); + return; + } + + delete mLiveFile; // deletes file + + // Save the script to a temporary file. + std::string filename = getTmpFileName(); + writeToFile(filename); + + // Start watching file changes. + mLiveFile = new LLLiveLSLFile(filename, this); + mLiveFile->addToEventTimer(); + + // Open it in external editor. + { + LLExternalEditor ed; + + if (!ed.setCommand("LL_SCRIPT_EDITOR")) + { + std::string msg = "Select an editor by setting the environment variable LL_SCRIPT_EDITOR " + "or the ExternalEditor setting"; // *TODO: localize + LLNotificationsUtil::add("GenericAlert", LLSD().with("MESSAGE", msg)); + return; + } + + ed.run(filename); + } +} + +bool LLLiveLSLEditor::writeToFile(const std::string& filename) +{ LLFILE* fp = LLFile::fopen(filename, "wb"); - if(!fp) + if (!fp) { llwarns << "Unable to write to " << filename << llendl; @@ -1889,33 +2016,25 @@ void LLLiveLSLEditor::saveIfNeeded() row["columns"][0]["value"] = "Error writing to local file. Is your hard drive full?"; row["columns"][0]["font"] = "SANSSERIF_SMALL"; mScriptEd->mErrorList->addElement(row); - return; + return false; } + std::string utf8text = mScriptEd->mEditor->getText(); // Special case for a completely empty script - stuff in one space so it can store properly. See SL-46889 - if ( utf8text.size() == 0 ) + if (utf8text.size() == 0) { utf8text = " "; } fputs(utf8text.c_str(), fp); fclose(fp); - fp = NULL; - - // save it out to asset server - std::string url = object->getRegion()->getCapability("UpdateScriptTask"); - getWindow()->incBusyCount(); - mPendingUploads++; - BOOL is_running = getChild<LLCheckBoxCtrl>( "running")->get(); - if (!url.empty()) - { - uploadAssetViaCaps(url, filename, mObjectUUID, mItemUUID, is_running); - } - else if (gAssetStorage) - { - uploadAssetLegacy(filename, object, tid, is_running); - } + return true; +} + +std::string LLLiveLSLEditor::getTmpFileName() +{ + return std::string(LLFile::tmpdir()) + "sl_script_" + mObjectUUID.asString() + ".lsl"; } void LLLiveLSLEditor::uploadAssetViaCaps(const std::string& url, @@ -2140,6 +2259,14 @@ void LLLiveLSLEditor::onSave(void* userdata, BOOL close_after_save) self->saveIfNeeded(); } + +// static +void LLLiveLSLEditor::onEdit(void* userdata) +{ + LLLiveLSLEditor* self = (LLLiveLSLEditor*)userdata; + self->openExternalEditor(); +} + // static void LLLiveLSLEditor::processScriptRunningReply(LLMessageSystem* msg, void**) { diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index f4b31e5962..d35c6b8528 100644 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -35,6 +35,7 @@ #include "lliconctrl.h" #include "llframetimer.h" +class LLLiveLSLFile; class LLMessageSystem; class LLTextEditor; class LLButton; @@ -62,6 +63,7 @@ public: const LLHandle<LLFloater>& floater_handle, void (*load_callback)(void* userdata), void (*save_callback)(void* userdata, BOOL close_after_save), + void (*edit_callback)(void*), void (*search_replace_callback)(void* userdata), void* userdata, S32 bottom_pad = 0); // pad below bottom row of buttons @@ -80,6 +82,8 @@ public: bool handleSaveChangesDialog(const LLSD& notification, const LLSD& response); bool handleReloadFromServerDialog(const LLSD& notification, const LLSD& response); + void onEditButtonClick(); + static void onCheckLock(LLUICtrl*, void*); static void onHelpComboCommit(LLUICtrl* ctrl, void* userdata); static void onClickBack(void* userdata); @@ -114,6 +118,7 @@ private: LLTextEditor* mEditor; void (*mLoadCallback)(void* userdata); void (*mSaveCallback)(void* userdata, BOOL close_after_save); + void (*mEditCallback)(void* userdata); void (*mSearchReplaceCallback) (void* userdata); void* mUserdata; LLComboBox *mFunctions; @@ -179,6 +184,7 @@ protected: // Used to view and edit an LSL that is attached to an object. class LLLiveLSLEditor : public LLPreview { + friend class LLLiveLSLFile; public: LLLiveLSLEditor(const LLSD& key); ~LLLiveLSLEditor(); @@ -202,7 +208,10 @@ private: virtual void loadAsset(); void loadAsset(BOOL is_new); - void saveIfNeeded(); + void saveIfNeeded(bool sync = true); + void openExternalEditor(); + std::string getTmpFileName(); + bool writeToFile(const std::string& filename); void uploadAssetViaCaps(const std::string& url, const std::string& filename, const LLUUID& task_id, @@ -218,6 +227,7 @@ private: static void onSearchReplace(void* userdata); static void onLoad(void* userdata); static void onSave(void* userdata, BOOL close_after_save); + static void onEdit(void* userdata); static void onLoadComplete(LLVFS *vfs, const LLUUID& asset_uuid, LLAssetType::EType type, @@ -227,7 +237,7 @@ private: static void onRunningCheckboxClicked(LLUICtrl*, void* userdata); static void onReset(void* userdata); -// void loadScriptText(const std::string& filename); // unused + bool loadScriptText(const std::string& filename); void loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType::EType type); static void onErrorList(LLUICtrl*, void* user_data); @@ -253,6 +263,7 @@ private: LLCheckBoxCtrl* mMonoCheckbox; BOOL mIsModifiable; + LLLiveLSLFile* mLiveFile; }; #endif // LL_LLPREVIEWSCRIPT_H diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 6b53b45990..33d2d015ad 100644 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -45,7 +45,6 @@ const F32 SOUND_GAIN = 1.0f; LLPreviewSound::LLPreviewSound(const LLSD& key) : LLPreview( key ) { - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this,"floater_preview_sound.xml", FALSE); } // virtual diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index 1155f35de8..fd6b326ef1 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -77,7 +77,6 @@ LLPreviewTexture::LLPreviewTexture(const LLSD& key) { mPreviewToSave = TRUE; } - //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_texture.xml", FALSE); } LLPreviewTexture::~LLPreviewTexture() diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp index cde99f8d7c..e9504cbba0 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -41,6 +41,7 @@ #include "llagent.h" #include "llbutton.h" #include "llfocusmgr.h" +#include "llnotifications.h" #include "llprogressbar.h" #include "llstartup.h" #include "llviewercontrol.h" @@ -90,6 +91,8 @@ BOOL LLProgressView::postBuild() // hidden initially, until we need it LLPanel::setVisible(FALSE); + LLNotifications::instance().getChannel("AlertModal")->connectChanged(boost::bind(&LLProgressView::onAlertModal, this, _1)); + sInstance = this; return TRUE; } @@ -128,15 +131,10 @@ void LLProgressView::setVisible(BOOL visible) if (getVisible() && !visible) { mFadeTimer.start(); - // hiding progress view, so show menu bars - LLUI::getRootView()->getChildView("menu_bar_holder")->setVisible(TRUE); } // showing progress view else if (!getVisible() && visible) { - // showing progress view, so hide menu bars - LLUI::getRootView()->getChildView("menu_bar_holder")->setVisible(FALSE); - setFocus(TRUE); mFadeTimer.stop(); mProgressTimer.start(); @@ -294,3 +292,18 @@ bool LLProgressView::handleUpdate(const LLSD& event_data) } return false; } + +bool LLProgressView::onAlertModal(const LLSD& notify) +{ + // if the progress view is visible, it will obscure the notification window + // in this case, we want to auto-accept WebLaunchExternalTarget notifications + if (isInVisibleChain() && notify["sigtype"].asString() == "add") + { + LLNotificationPtr notifyp = LLNotifications::instance().find(notify["id"].asUUID()); + if (notifyp && notifyp->getName() == "WebLaunchExternalTarget") + { + notifyp->respondWithDefault(); + } + } + return false; +} diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h index 01d5e16534..be1744f08a 100644 --- a/indra/newview/llprogressview.h +++ b/indra/newview/llprogressview.h @@ -59,6 +59,7 @@ public: static void onCancelButtonClicked( void* ); static void onClickMessage(void*); + bool onAlertModal(const LLSD& sd); protected: LLProgressBar* mProgressBar; diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 5c923a0409..61f4897ed0 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -253,8 +253,8 @@ void LLScreenChannel::addToast(const LLToast::Params& p) if(mControlHovering) { new_toast_elem.toast->setOnToastHoverCallback(boost::bind(&LLScreenChannel::onToastHover, this, _1, _2)); - new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopFadingToasts, this)); - new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startFadingToasts, this)); + new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopFadingToast, this, new_toast_elem.toast)); + new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startFadingToast, this, new_toast_elem.toast)); } if(show_toast) @@ -339,7 +339,6 @@ void LLScreenChannel::deleteToast(LLToast* toast) if(mHoveredToast == toast) { mHoveredToast = NULL; - startFadingToasts(); } // close the toast @@ -370,7 +369,7 @@ void LLScreenChannel::loadStoredToastsToChannel() for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it) { (*it).toast->setIsHidden(false); - (*it).toast->resetTimer(); + (*it).toast->startFading(); mToastList.push_back((*it)); } @@ -395,7 +394,7 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id) } toast->setIsHidden(false); - toast->resetTimer(); + toast->startFading(); mToastList.push_back((*it)); redrawToasts(); @@ -478,7 +477,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel) toast->removeChild(old_panel); delete old_panel; toast->insertPanel(panel); - toast->resetTimer(); + toast->startFading(); redrawToasts(); } } @@ -589,7 +588,7 @@ void LLScreenChannel::showToastsBottom() mHiddenToastsNum = 0; for(; it != mToastList.rend(); it++) { - (*it).toast->stopTimer(); + (*it).toast->stopFading(); (*it).toast->setVisible(FALSE); mHiddenToastsNum++; } @@ -698,38 +697,23 @@ void LLScreenChannel::closeStartUpToast() } } -void LLNotificationsUI::LLScreenChannel::stopFadingToasts() +void LLNotificationsUI::LLScreenChannel::stopFadingToast(LLToast* toast) { - if (!mToastList.size()) return; + if (!toast || toast != mHoveredToast) return; - if (!mHoveredToast) return; - - std::vector<ToastElem>::iterator it = mToastList.begin(); - while (it != mToastList.end()) - { - ToastElem& elem = *it; - elem.toast->stopFading(); - ++it; - } + // Pause fade timer of the hovered toast. + toast->stopFading(); } -void LLNotificationsUI::LLScreenChannel::startFadingToasts() +void LLNotificationsUI::LLScreenChannel::startFadingToast(LLToast* toast) { - if (!mToastList.size()) return; - - //because onMouseLeave is processed after onMouseEnter - if (isHovering()) return; - - std::vector<ToastElem>::iterator it = mToastList.begin(); - while (it != mToastList.end()) + if (!toast || toast == mHoveredToast) { - ToastElem& elem = *it; - if (elem.toast->getVisible()) - { - elem.toast->startFading(); - } - ++it; + return; } + + // Reset its fade timer. + toast->startFading(); } //-------------------------------------------------------------------------- diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index 6cf6d97550..a1fdd6e32c 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -193,11 +193,11 @@ public: void closeStartUpToast(); - /** Stop fading all toasts */ - virtual void stopFadingToasts(); + /** Stop fading given toast */ + virtual void stopFadingToast(LLToast* toast); - /** Start fading all toasts */ - virtual void startFadingToasts(); + /** Start fading given toast */ + virtual void startFadingToast(LLToast* toast); // get StartUp Toast's state static bool getStartUpToastShown() { return mWasStartUpToastShown; } diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp index 2334f0cde5..170e23e4c5 100644 --- a/indra/newview/llscriptfloater.cpp +++ b/indra/newview/llscriptfloater.cpp @@ -32,11 +32,13 @@ #include "llchannelmanager.h" #include "llchiclet.h" #include "llfloaterreg.h" +#include "lllslconstants.h" #include "llnotifications.h" #include "llnotificationsutil.h" #include "llscreenchannel.h" #include "llsyswellwindow.h" #include "lltoastnotifypanel.h" +#include "lltoastscripttextbox.h" #include "lltrans.h" #include "llviewerwindow.h" #include "llimfloater.h" @@ -151,10 +153,18 @@ void LLScriptFloater::createForm(const LLUUID& notification_id) // create new form LLRect toast_rect = getRect(); - // LLToastNotifyPanel will fit own content in vertical direction, - // but it needs an initial rect to properly calculate its width - // Use an initial rect of the script floater to make the floater window more configurable. - mScriptForm = new LLToastNotifyPanel(notification, toast_rect); + if (isScriptTextbox(notification)) + { + mScriptForm = new LLToastScriptTextbox(notification); + } + else + { + // LLToastNotifyPanel will fit own content in vertical direction, + // but it needs an initial rect to properly calculate its width + // Use an initial rect of the script floater to make the floater + // window more configurable. + mScriptForm = new LLToastNotifyPanel(notification, toast_rect); + } addChild(mScriptForm); // position form on floater @@ -564,4 +574,32 @@ void LLScriptFloaterManager::setFloaterVisible(const LLUUID& notification_id, bo } } +////////////////////////////////////////////////////////////////// + +bool LLScriptFloater::isScriptTextbox(LLNotificationPtr notification) +{ + // get a form for the notification + LLNotificationFormPtr form(notification->getForm()); + + if (form) + { + // get number of elements in the form + int num_options = form->getNumElements(); + + // if ANY of the buttons have the magic lltextbox string as + // name, then treat the whole dialog as a simple text entry + // box (i.e. mixed button and textbox forms are not supported) + for (int i=0; i<num_options; ++i) + { + LLSD form_element = form->getElement(i); + if (form_element["name"].asString() == TEXTBOX_MAGIC_TOKEN) + { + return true; + } + } + } + + return false; +} + // EOF diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h index da70bb4334..dc52baa115 100644 --- a/indra/newview/llscriptfloater.h +++ b/indra/newview/llscriptfloater.h @@ -28,6 +28,7 @@ #define LL_SCRIPTFLOATER_H #include "lltransientdockablefloater.h" +#include "llnotificationptr.h" class LLToastNotifyPanel; @@ -203,6 +204,8 @@ protected: void dockToChiclet(bool dock); private: + bool isScriptTextbox(LLNotificationPtr notification); + LLToastNotifyPanel* mScriptForm; LLUUID mNotificationId; LLUUID mObjectId; diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp index 2d8c9b0fec..05b273cd29 100644 --- a/indra/newview/llscrollingpanelparam.cpp +++ b/indra/newview/llscrollingpanelparam.cpp @@ -56,7 +56,7 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param mAllowModify(allow_modify), mWearable(wearable) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml"); + buildFromFile( "panel_scrolling_param.xml"); // *HACK To avoid hard coding texture position, lets use border's position for texture. LLViewBorder* left_border = getChild<LLViewBorder>("left_border"); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 9260abb2ac..da891d1c51 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -181,6 +181,7 @@ template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance(); //----------------------------------------------------------------------------- LLSelectMgr::LLSelectMgr() : mHideSelectedObjects(LLCachedControl<bool>(gSavedSettings, "HideSelectedObjects", FALSE)), + mRenderHighlightSelections(LLCachedControl<bool>(gSavedSettings, "RenderHighlightSelections", TRUE)), mAllowSelectAvatar( LLCachedControl<bool>(gSavedSettings, "AllowSelectAvatar", FALSE)), mDebugSelectMgr(LLCachedControl<bool>(gSavedSettings, "DebugSelectMgr", FALSE)) { @@ -4898,7 +4899,7 @@ void LLSelectMgr::updateSelectionSilhouette(LLObjectSelectionHandle object_handl } void LLSelectMgr::renderSilhouettes(BOOL for_hud) { - if (!mRenderSilhouettes) + if (!mRenderSilhouettes || !mRenderHighlightSelections) { return; } diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index e6db264377..7478ed5f9a 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -347,6 +347,7 @@ public: static LLColor4 sContextSilhouetteColor; LLCachedControl<bool> mHideSelectedObjects; + LLCachedControl<bool> mRenderHighlightSelections; LLCachedControl<bool> mAllowSelectAvatar; LLCachedControl<bool> mDebugSelectMgr; diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp index b4c1516f71..31ea542743 100644 --- a/indra/newview/llsidepanelinventory.cpp +++ b/indra/newview/llsidepanelinventory.cpp @@ -31,6 +31,7 @@ #include "llappearancemgr.h" #include "llavataractions.h" #include "llbutton.h" +#include "llfirstuse.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" #include "llinventorypanel.h" @@ -50,7 +51,7 @@ LLSidepanelInventory::LLSidepanelInventory() mPanelMainInventory(NULL) { - //LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() + //buildFromFile( "panel_inventory.xml"); // Called from LLRegisterPanelClass::defaultPanelClassBuilder() } LLSidepanelInventory::~LLSidepanelInventory() @@ -84,7 +85,7 @@ BOOL LLSidepanelInventory::postBuild() mOverflowBtn = mInventoryPanel->getChild<LLButton>("overflow_btn"); mOverflowBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onOverflowButtonClicked, this)); - mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + mPanelMainInventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2)); LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs"); tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this)); @@ -102,7 +103,7 @@ BOOL LLSidepanelInventory::postBuild() // UI elements from item panel { - mItemPanel = getChild<LLSidepanelItemInfo>("sidepanel__item_panel"); + mItemPanel = findChild<LLSidepanelItemInfo>("sidepanel__item_panel"); LLButton* back_btn = mItemPanel->getChild<LLButton>("back_btn"); back_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onBackButtonClicked, this)); @@ -110,7 +111,7 @@ BOOL LLSidepanelInventory::postBuild() // UI elements from task panel { - mTaskPanel = getChild<LLSidepanelTaskInfo>("sidepanel__task_panel"); + mTaskPanel = findChild<LLSidepanelTaskInfo>("sidepanel__task_panel"); if (mTaskPanel) { LLButton* back_btn = mTaskPanel->getChild<LLButton>("back_btn"); @@ -123,6 +124,8 @@ BOOL LLSidepanelInventory::postBuild() void LLSidepanelInventory::onOpen(const LLSD& key) { + LLFirstUse::newInventory(false); + if(key.size() == 0) return; @@ -168,7 +171,7 @@ void LLSidepanelInventory::onShopButtonClicked() void LLSidepanelInventory::performActionOnSelection(const std::string &action) { - LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); if (!current_item) { @@ -179,8 +182,26 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action) void LLSidepanelInventory::onWearButtonClicked() { - performActionOnSelection("wear"); - performActionOnSelection("attach"); + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); + if (!panel_main_inventory) + { + llassert(panel_main_inventory != NULL); + return; + } + + // Get selected items set. + const std::set<LLUUID> selected_uuids_set = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); + if (selected_uuids_set.empty()) return; // nothing selected + + // Convert the set to a vector. + uuid_vec_t selected_uuids_vec; + for (std::set<LLUUID>::const_iterator it = selected_uuids_set.begin(); it != selected_uuids_set.end(); ++it) + { + selected_uuids_vec.push_back(*it); + } + + // Wear all selected items. + wear_multiple(selected_uuids_vec, true); } void LLSidepanelInventory::onPlayButtonClicked() @@ -283,7 +304,7 @@ void LLSidepanelInventory::updateVerbs() case LLInventoryType::IT_OBJECT: case LLInventoryType::IT_ATTACHMENT: mWearBtn->setVisible(TRUE); - mWearBtn->setEnabled(get_can_item_be_worn(item->getLinkedUUID())); + mWearBtn->setEnabled(canWearSelected()); mShopBtn->setVisible(FALSE); break; case LLInventoryType::IT_SOUND: @@ -306,25 +327,46 @@ void LLSidepanelInventory::updateVerbs() bool LLSidepanelInventory::canShare() { LLPanelMainInventory* panel_main_inventory = - mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); - LLFolderView* root_folder = - panel_main_inventory->getActivePanel()->getRootFolder(); + if (!panel_main_inventory) + { + llwarns << "Failed to get the main inventory panel" << llendl; + return false; + } - LLFolderViewItem* current_item = root_folder->hasVisibleChildren() - ? root_folder->getCurSelectedItem() - : NULL; + LLInventoryPanel* active_panel = panel_main_inventory->getActivePanel(); + // Avoid flicker in the Recent tab while inventory is being loaded. + if (!active_panel->getRootFolder()->hasVisibleChildren()) return false; - LLInvFVBridge* bridge = current_item - ? dynamic_cast <LLInvFVBridge*> (current_item->getListener()) - : NULL; + return LLAvatarActions::canShareSelectedItems(active_panel); +} + +bool LLSidepanelInventory::canWearSelected() +{ + LLPanelMainInventory* panel_main_inventory = + mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); + + if (!panel_main_inventory) + { + llassert(panel_main_inventory != NULL); + return false; + } + + std::set<LLUUID> selected_uuids = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); + for (std::set<LLUUID>::const_iterator it = selected_uuids.begin(); + it != selected_uuids.end(); + ++it) + { + if (!get_can_item_be_worn(*it)) return false; + } - return bridge ? bridge->canShare() : false; + return true; } LLInventoryItem *LLSidepanelInventory::getSelectedItem() { - LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); LLFolderViewItem* current_item = panel_main_inventory->getActivePanel()->getRootFolder()->getCurSelectedItem(); if (!current_item) { @@ -337,7 +379,7 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem() U32 LLSidepanelInventory::getSelectedCount() { - LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory"); + LLPanelMainInventory *panel_main_inventory = mInventoryPanel->findChild<LLPanelMainInventory>("panel_main_inventory"); std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(); return selection_list.size(); } diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h index 4776dd7530..32c98bc034 100644 --- a/indra/newview/llsidepanelinventory.h +++ b/indra/newview/llsidepanelinventory.h @@ -65,6 +65,8 @@ protected: void performActionOnSelection(const std::string &action); void updateVerbs(); + bool canWearSelected(); // check whether selected items can be worn + // // UI Elements // diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp index e41bbe43df..be797ea937 100644 --- a/indra/newview/llsidepaneliteminfo.cpp +++ b/indra/newview/llsidepaneliteminfo.cpp @@ -68,10 +68,22 @@ private: void LLItemPropertiesObserver::changed(U32 mask) { - // if there's a change we're interested in. - if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) + const std::set<LLUUID>& mChangedItemIDs = gInventory.getChangedIDs(); + std::set<LLUUID>::const_iterator it; + + const LLUUID& object_id = mFloater->getObjectID(); + + for (it = mChangedItemIDs.begin(); it != mChangedItemIDs.end(); it++) { - mFloater->dirty(); + // set dirty for 'item profile panel' only if changed item is the item for which 'item profile panel' is shown (STORM-288) + if (*it == object_id) + { + // if there's a change we're interested in. + if((mask & (LLInventoryObserver::LABEL | LLInventoryObserver::INTERNAL | LLInventoryObserver::REMOVE)) != 0) + { + mFloater->dirty(); + } + } } } @@ -122,8 +134,6 @@ LLSidepanelItemInfo::LLSidepanelItemInfo() , mObjectInventoryObserver(NULL) { mPropertiesObserver = new LLItemPropertiesObserver(this); - - //LLUICtrlFactory::getInstance()->buildFloater(this,"floater_inventory_item_properties.xml"); } // Destroys the object @@ -181,6 +191,11 @@ void LLSidepanelItemInfo::setItemID(const LLUUID& item_id) mItemID = item_id; } +const LLUUID& LLSidepanelItemInfo::getObjectID() const +{ + return mObjectID; +} + void LLSidepanelItemInfo::reset() { LLSidepanelInventorySubpanel::reset(); @@ -317,11 +332,12 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) if (item->getCreatorUUID().notNull()) { - std::string name; - gCacheName->getFullName(item->getCreatorUUID(), name); + LLUUID creator_id = item->getCreatorUUID(); + std::string name = + LLSLURL("agent", creator_id, "completename").getSLURLString(); getChildView("BtnCreator")->setEnabled(TRUE); getChildView("LabelCreatorTitle")->setEnabled(TRUE); - getChildView("LabelCreatorName")->setEnabled(TRUE); + getChildView("LabelCreatorName")->setEnabled(FALSE); getChild<LLUICtrl>("LabelCreatorName")->setValue(name); } else @@ -344,11 +360,12 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item) } else { - gCacheName->getFullName(perm.getOwner(), name); + LLUUID owner_id = perm.getOwner(); + name = LLSLURL("agent", owner_id, "completename").getSLURLString(); } getChildView("BtnOwner")->setEnabled(TRUE); getChildView("LabelOwnerTitle")->setEnabled(TRUE); - getChildView("LabelOwnerName")->setEnabled(TRUE); + getChildView("LabelOwnerName")->setEnabled(FALSE); getChild<LLUICtrl>("LabelOwnerName")->setValue(name); } else diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h index 10e93dd7de..6416e2cfe4 100644 --- a/indra/newview/llsidepaneliteminfo.h +++ b/indra/newview/llsidepaneliteminfo.h @@ -54,6 +54,8 @@ public: void setItemID(const LLUUID& item_id); void setEditMode(BOOL edit); + const LLUUID& getObjectID() const; + protected: /*virtual*/ void refresh(); /*virtual*/ void save(); diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp index 4552088cad..47d904dfcc 100644 --- a/indra/newview/llsidepaneltaskinfo.cpp +++ b/indra/newview/llsidepaneltaskinfo.cpp @@ -345,7 +345,7 @@ void LLSidepanelTaskInfo::refresh() if (mLabelGroupName) { mLabelGroupName->setNameID(LLUUID::null, TRUE); - mLabelGroupName->refresh(LLUUID::null,LLStringUtil::null, LLStringUtil::null, TRUE); + mLabelGroupName->refresh(LLUUID::null, std::string(), true); mLabelGroupName->setEnabled(FALSE); } } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index b7470c03bc..81b2fc0ae0 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -32,6 +32,8 @@ #include "llappviewer.h" #include "llbottomtray.h" #include "llfloaterreg.h" +#include "llfirstuse.h" +#include "llhints.h" #include "llsidetray.h" #include "llviewerwindow.h" #include "llaccordionctrl.h" @@ -115,7 +117,7 @@ public: }; protected: LLSideTrayTab(const Params& params); - + void dock(); void undock(LLFloater* floater_tab); @@ -136,7 +138,7 @@ public: const std::string& getTabTitle() const { return mTabTitle;} void onOpen (const LLSD& key); - + void toggleTabDocked(); LLPanel *getPanel(); @@ -598,7 +600,7 @@ void LLSideTray::toggleTabButton(LLSideTrayTab* tab) { LLButton* btn = it->second; bool new_state = !btn->getToggleState(); - btn->setToggleState(new_state); + btn->setToggleState(new_state); // Only highlight the tab if side tray is expanded (STORM-157). btn->setImageOverlay( new_state && !getCollapsed() ? tab->mImageSelected : tab->mImage ); } @@ -676,7 +678,7 @@ bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible { // Keep previously active tab visible if requested. if (keep_prev_visible) tab_to_keep_visible = mActiveTab; - toggleTabButton(mActiveTab); + toggleTabButton(mActiveTab); } //select new tab @@ -684,9 +686,9 @@ bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible if (mActiveTab) { - toggleTabButton(mActiveTab); - LLSD key;//empty - mActiveTab->onOpen(key); + toggleTabButton(mActiveTab); + LLSD key;//empty + mActiveTab->onOpen(key); } //arrange(); @@ -898,6 +900,7 @@ void LLSideTray::createButtons () { mCollapseButton = createButton(name,sidebar_tab->mImage,sidebar_tab->getTabTitle(), boost::bind(&LLSideTray::onToggleCollapse, this)); + LLHints::registerHintTarget("side_panel_btn", mCollapseButton->getHandle()); } else { @@ -906,6 +909,8 @@ void LLSideTray::createButtons () mTabButtons[name] = button; } } + LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle()); + LLHints::registerHintTarget("dest_guide_btn", mTabButtons["sidebar_places"]->getHandle()); } void LLSideTray::processTriState () @@ -944,6 +949,7 @@ void LLSideTray::onTabButtonClick(string name) void LLSideTray::onToggleCollapse() { + LLFirstUse::notUsingSidePanel(false); if(mCollapsed) { expandSideBar(); @@ -1148,11 +1154,11 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para { LLPanel* panel = openChildPanel(*child_it, panel_name, params); if (panel) return panel; - } + } // Look up the tab in the list of attached tabs. for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it) - { + { LLPanel* panel = openChildPanel(*child_it, panel_name, params); if (panel) return panel; } diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 4e79007c13..4c23a1920b 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -109,6 +109,22 @@ public: LLPanel* getPanel (const std::string& panel_name); LLPanel* getActivePanel (); bool isPanelActive (const std::string& panel_name); + + /* + * get the panel of given type T (don't show it or do anything else with it) + */ + template <typename T> + T* getPanel(const std::string& panel_name) + { + T* panel = dynamic_cast<T*>(getPanel(panel_name)); + if (!panel) + { + llwarns << "Child named \"" << panel_name << "\" of type " << typeid(T*).name() << " not found" << llendl; + return NULL; + } + return panel; + } + /* * get currently active tab */ diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index fb984a7c62..960e72ee42 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -1555,7 +1555,9 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera) { if (mSpatialPartition->isOcclusionEnabled() && LLPipeline::sUseOcclusion > 1) { - if (earlyFail(camera, this)) + // Don't cull hole/edge water, unless we have the GL_ARB_depth_clamp extension + if ((mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER && !gGLManager.mHasDepthClamp) || + earlyFail(camera, this)) { setOcclusionState(LLSpatialGroup::DISCARD_QUERY); assert_states_valid(this); @@ -1576,7 +1578,18 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera) { buildOcclusion(); } - + + // Depth clamp all water to avoid it being culled as a result of being + // behind the far clip plane, and in the case of edge water to avoid + // it being culled while still visible. + bool const use_depth_clamp = gGLManager.mHasDepthClamp && + (mSpatialPartition->mDrawableType == LLDrawPool::POOL_WATER || + mSpatialPartition->mDrawableType == LLDrawPool::POOL_VOIDWATER); + if (use_depth_clamp) + { + glEnable(GL_DEPTH_CLAMP); + } + glBeginQueryARB(GL_SAMPLES_PASSED_ARB, mOcclusionQuery[LLViewerCamera::sCurCameraID]); glVertexPointer(3, GL_FLOAT, 0, mOcclusionVerts); if (camera->getOrigin().isExactlyZero()) @@ -1592,6 +1605,11 @@ void LLSpatialGroup::doOcclusion(LLCamera* camera) GL_UNSIGNED_BYTE, get_box_fan_indices(camera, mBounds[0])); } glEndQueryARB(GL_SAMPLES_PASSED_ARB); + + if (use_depth_clamp) + { + glDisable(GL_DEPTH_CLAMP); + } } setOcclusionState(LLSpatialGroup::QUERY_PENDING); @@ -2591,9 +2609,10 @@ void renderBoundingBox(LLDrawable* drawable, BOOL set_color = TRUE) gGL.color4f(0.5f,0.5f,0.5f,1.0f); break; case LLViewerObject::LL_VO_PART_GROUP: - case LLViewerObject::LL_VO_HUD_PART_GROUP: + case LLViewerObject::LL_VO_HUD_PART_GROUP: gGL.color4f(0,0,1,1); break; + case LLViewerObject::LL_VO_VOID_WATER: case LLViewerObject::LL_VO_WATER: gGL.color4f(0,0.5f,1,1); break; diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h index 1a25f3f85d..2b9cf6c630 100644 --- a/indra/newview/llspatialpartition.h +++ b/indra/newview/llspatialpartition.h @@ -551,6 +551,13 @@ public: virtual void addGeometryCount(LLSpatialGroup* group, U32 &vertex_count, U32& index_count) { } }; +//spatial partition for hole and edge water (implemented in LLVOWater.cpp) +class LLVoidWaterPartition : public LLWaterPartition +{ +public: + LLVoidWaterPartition(); +}; + //spatial partition for terrain (impelmented in LLVOSurfacePatch.cpp) class LLTerrainPartition : public LLSpatialPartition { diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp index 196ed5e0bb..40aea05839 100644 --- a/indra/newview/llspeakers.cpp +++ b/indra/newview/llspeakers.cpp @@ -70,13 +70,13 @@ void LLSpeaker::lookupName() { if (mDisplayName.empty()) { - gCacheName->get(mID, FALSE, boost::bind(&LLSpeaker::onAvatarNameLookup, this, _1, _2, _3, _4)); + gCacheName->get(mID, false, boost::bind(&LLSpeaker::onNameCache, this, _1, _2, _3)); } } -void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +void LLSpeaker::onNameCache(const LLUUID& id, const std::string& full_name, bool is_group) { - mDisplayName = first + " " + last; + mDisplayName = full_name; } bool LLSpeaker::isInVoiceChannel() diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h index 08fb405265..35f2ee7056 100644 --- a/indra/newview/llspeakers.h +++ b/indra/newview/llspeakers.h @@ -60,7 +60,7 @@ public: ~LLSpeaker() {}; void lookupName(); - void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + void onNameCache(const LLUUID& id, const std::string& full_name, bool is_group); bool isInVoiceChannel(); diff --git a/indra/newview/llsplitbutton.cpp b/indra/newview/llsplitbutton.cpp index 7db42214e1..790305103d 100644 --- a/indra/newview/llsplitbutton.cpp +++ b/indra/newview/llsplitbutton.cpp @@ -220,7 +220,7 @@ LLSplitButton::LLSplitButton(const LLSplitButton::Params& p) addChild(mItemsPanel); - LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin(); + LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items.begin(); //processing shown item button mShownItem = prepareItemButton(*it); @@ -231,7 +231,7 @@ LLSplitButton::LLSplitButton(const LLSplitButton::Params& p) //processing hidden item buttons S32 item_top = mItemsPanel->getRect().getHeight(); - for (++it; it != p.items().end(); ++it) + for (++it; it != p.items.end(); ++it) { LLButton* hidden_button = prepareItemButton(*it); hidden_button->setRect(LLRect(btn_left, item_top, btn_right, item_top - rc.getHeight())); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 50465de0e8..80cf7e3cd0 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -46,6 +46,7 @@ #endif #include "llares.h" +#include "llavatarnamecache.h" #include "lllandmark.h" #include "llcachename.h" #include "lldir.h" @@ -118,7 +119,6 @@ #include "llpanellogin.h" #include "llmutelist.h" #include "llavatarpropertiesprocessor.h" -#include "llfloaterevent.h" #include "llpanelclassified.h" #include "llpanelpick.h" #include "llpanelgrouplandmoney.h" @@ -262,11 +262,10 @@ void apply_udp_blacklist(const std::string& csv); bool process_login_success_response(); void transition_back_to_login_panel(const std::string& emsg); -void callback_cache_name(const LLUUID& id, const std::string& firstname, const std::string& lastname, BOOL is_group) +void callback_cache_name(const LLUUID& id, const std::string& full_name, bool is_group) { - LLNameListCtrl::refreshAll(id, firstname, lastname, is_group); - LLNameBox::refreshAll(id, firstname, lastname, is_group); - LLNameEditor::refreshAll(id, firstname, lastname, is_group); + LLNameBox::refreshAll(id, full_name, is_group); + LLNameEditor::refreshAll(id, full_name, is_group); // TODO: Actually be intelligent about the refresh. // For now, just brute force refresh the dialogs. @@ -795,10 +794,6 @@ bool idle_startup() if (STATE_LOGIN_CLEANUP == LLStartUp::getStartupState()) { - // Move the progress view in front of the UI immediately when login is performed - // this allows not to see main menu after Alt+Tab was pressed while login. EXT-744. - gViewerWindow->moveProgressViewToFront(); - //reset the values that could have come in from a slurl // DEV-42215: Make sure they're not empty -- gUserCredential // might already have been set from gSavedSettings, and it's too bad @@ -1252,9 +1247,6 @@ bool idle_startup() if (!gNoRender) { - // Move the progress view in front of the UI - gViewerWindow->moveProgressViewToFront(); - // direct logging to the debug console's line buffer LLError::logToFixedBuffer(gDebugView->mDebugConsolep); @@ -1280,16 +1272,7 @@ bool idle_startup() gXferManager->registerCallbacks(gMessageSystem); - if ( gCacheName == NULL ) - { - gCacheName = new LLCacheName(gMessageSystem); - gCacheName->addObserver(&callback_cache_name); - gCacheName->LocalizeCacheName("waiting", LLTrans::getString("AvatarNameWaiting")); - gCacheName->LocalizeCacheName("nobody", LLTrans::getString("AvatarNameNobody")); - gCacheName->LocalizeCacheName("none", LLTrans::getString("GroupNameNone")); - // Load stored cache if possible - LLAppViewer::instance()->loadNameCache(); - } + LLStartUp::initNameCache(); // update the voice settings *after* gCacheName initialization // so that we can construct voice UI that relies on the name cache @@ -1613,12 +1596,6 @@ bool idle_startup() LLFloaterReg::showInstance("hud", LLSD(), FALSE); } - LLSD event_categories = response["event_categories"]; - if(event_categories.isDefined()) - { - LLEventInfo::loadCategories(event_categories); - } - LLSD event_notifications = response["event_notifications"]; if(event_notifications.isDefined()) { @@ -1631,7 +1608,6 @@ bool idle_startup() LLClassifiedInfo::loadCategories(classified_categories); } - // This method MUST be called before gInventory.findCategoryUUIDForType because of // gInventory.mIsAgentInvUsable is set to true in the gInventory.buildParentChildMap. gInventory.buildParentChildMap(); @@ -2330,8 +2306,8 @@ void register_viewer_callbacks(LLMessageSystem* msg) msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply); msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply); - - msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply); + msg->setHandlerFunc("EventInfoReply", LLEventNotifier::processEventInfoReply); + msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply); // msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply); msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply); @@ -2676,6 +2652,33 @@ void LLStartUp::fontInit() LLFontGL::loadDefaultFonts(); } +void LLStartUp::initNameCache() +{ + // Can be called multiple times + if ( gCacheName ) return; + + gCacheName = new LLCacheName(gMessageSystem); + gCacheName->addObserver(&callback_cache_name); + gCacheName->localizeCacheName("waiting", LLTrans::getString("AvatarNameWaiting")); + gCacheName->localizeCacheName("nobody", LLTrans::getString("AvatarNameNobody")); + gCacheName->localizeCacheName("none", LLTrans::getString("GroupNameNone")); + // Load stored cache if possible + LLAppViewer::instance()->loadNameCache(); + + // Start cache in not-running state until we figure out if we have + // capabilities for display name lookup + LLAvatarNameCache::initClass(false); + LLAvatarNameCache::setUseDisplayNames(gSavedSettings.getBOOL("UseDisplayNames")); +} + +void LLStartUp::cleanupNameCache() +{ + LLAvatarNameCache::cleanupClass(); + + delete gCacheName; + gCacheName = NULL; +} + bool LLStartUp::dispatchURL() { // ok, if we've gotten this far and have a startup URL diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index 41f6f1b7ee..b3d9ef1dcc 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -88,8 +88,12 @@ public: // Load default fonts not already loaded at start screen static void fontInit(); + static void initNameCache(); + static void copyLibraryGestures(const std::string& same_gender_gestures); + static void cleanupNameCache(); + // outfit_folder_name can be a folder anywhere in your inventory, // but the name must be a case-sensitive exact match. // gender_name is either "male" or "female" diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 0cf2b74f9c..e9fc25404a 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -33,6 +33,7 @@ #include "llagentcamera.h" #include "llbutton.h" #include "llcommandhandler.h" +#include "llfirstuse.h" #include "llviewercontrol.h" #include "llfloaterbuycurrency.h" #include "llbuycurrencyhtml.h" @@ -41,6 +42,7 @@ #include "llpanelvolumepulldown.h" #include "llfloaterregioninfo.h" #include "llfloaterscriptdebug.h" +#include "llhints.h" #include "llhudicon.h" #include "llnavigationbar.h" #include "llkeyboard.h" @@ -126,7 +128,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect) mBalanceTimer = new LLFrameTimer(); mHealthTimer = new LLFrameTimer(); - LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml"); + buildFromFile("panel_status_bar.xml"); } LLStatusBar::~LLStatusBar() @@ -174,6 +176,8 @@ BOOL LLStatusBar::postBuild() mMediaToggle->setClickedCallback( &LLStatusBar::onClickMediaToggle, this ); mMediaToggle->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterNearbyMedia, this)); + LLHints::registerHintTarget("linden_balance", getChild<LLView>("balance_bg")->getHandle()); + gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); // Adding Net Stat Graph @@ -319,6 +323,11 @@ void LLStatusBar::creditBalance(S32 credit) void LLStatusBar::setBalance(S32 balance) { + if (balance > getBalance() && getBalance() != 0) + { + LLFirstUse::receiveLindens(); + } + std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance ); LLTextBox* balance_box = getChild<LLTextBox>("balance"); @@ -441,6 +450,7 @@ void LLStatusBar::onClickBuyCurrency() // open a currency floater - actual one open depends on // value specified in settings.xml LLBuyCurrencyHTML::openCurrencyFloater(); + LLFirstUse::receiveLindens(false); } void LLStatusBar::onMouseEnterVolume() diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp index af4d9fa7b9..6fc8153b77 100644 --- a/indra/newview/llsurface.cpp +++ b/indra/newview/llsurface.cpp @@ -1162,8 +1162,13 @@ void LLSurface::setWaterHeight(F32 height) if (!mWaterObjp.isNull()) { LLVector3 water_pos_region = mWaterObjp->getPositionRegion(); + bool changed = water_pos_region.mV[VZ] != height; water_pos_region.mV[VZ] = height; mWaterObjp->setPositionRegion(water_pos_region); + if (changed) + { + LLWorld::getInstance()->updateWaterObjects(); + } } else { diff --git a/indra/newview/llsyswellitem.cpp b/indra/newview/llsyswellitem.cpp index 4a107fefa8..057d80457c 100644 --- a/indra/newview/llsyswellitem.cpp +++ b/indra/newview/llsyswellitem.cpp @@ -38,7 +38,7 @@ LLSysWellItem::LLSysWellItem(const Params& p) : LLPanel(p), mTitle(NULL), mCloseBtn(NULL) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_sys_well_item.xml"); + buildFromFile( "panel_sys_well_item.xml"); mTitle = getChild<LLTextBox>("title"); mCloseBtn = getChild<LLButton>("close_btn"); diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp index 750fbe54a7..e7b5c13860 100644 --- a/indra/newview/llsyswellwindow.cpp +++ b/indra/newview/llsyswellwindow.cpp @@ -26,14 +26,15 @@ #include "llviewerprecompiledheaders.h" // must be first include +#include "llsyswellwindow.h" + #include "llagent.h" +#include "llavatarnamecache.h" #include "llflatlistview.h" #include "llfloaterreg.h" #include "llnotifications.h" -#include "llsyswellwindow.h" - #include "llbottomtray.h" #include "llscriptfloater.h" #include "llviewercontrol.h" @@ -249,7 +250,7 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId) : LLPanel(LLPanel::Params()), mChiclet(NULL), mParent(parent) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_activeim_row.xml", NULL); + buildFromFile( "panel_activeim_row.xml", NULL); // Choose which of the pre-created chiclets (IM/group) to use. // The other one gets hidden. @@ -278,14 +279,31 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID& mChiclet->setOtherParticipantId(otherParticipantId); mChiclet->setVisible(true); - LLTextBox* contactName = getChild<LLTextBox>("contact_name"); - contactName->setValue(name); + if (im_chiclet_type == LLIMChiclet::TYPE_IM) + { + LLAvatarNameCache::get(otherParticipantId, + boost::bind(&LLIMWellWindow::RowPanel::onAvatarNameCache, + this, _1, _2)); + } + else + { + LLTextBox* contactName = getChild<LLTextBox>("contact_name"); + contactName->setValue(name); + } mCloseBtn = getChild<LLButton>("hide_btn"); mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::RowPanel::onClosePanel, this)); } //--------------------------------------------------------------------------------- +void LLIMWellWindow::RowPanel::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) +{ + LLTextBox* contactName = getChild<LLTextBox>("contact_name"); + contactName->setValue( av_name.getCompleteName() ); +} + +//--------------------------------------------------------------------------------- void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param) { LLTextBox* text = getChild<LLTextBox>("contact_name"); @@ -346,7 +364,7 @@ LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bo : LLPanel() , mChiclet(NULL) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL); + buildFromFile( "panel_active_object_row.xml", NULL); initChiclet(notification_id); diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h index 5854deb840..9f8ab01810 100644 --- a/indra/newview/llsyswellwindow.h +++ b/indra/newview/llsyswellwindow.h @@ -37,6 +37,7 @@ #include "boost/shared_ptr.hpp" +class LLAvatarName; class LLFlatListView; class LLChiclet; class LLIMChiclet; @@ -202,6 +203,7 @@ private: private: static const S32 CHICLET_HPAD = 10; + void onAvatarNameCache(const LLUUID& agent_id, const LLAvatarName& av_name); void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param); void onClosePanel(); public: diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 1625b4bafd..328298bda4 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -196,8 +196,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker( mContextConeOpacity(0.f), mSelectedItemPinned( FALSE ) { + buildFromFile("floater_texture_ctrl.xml"); mCanApplyImmediately = can_apply_immediately; - LLUICtrlFactory::getInstance()->buildFloater(this,"floater_texture_ctrl.xml",NULL); setCanMinimize(FALSE); } diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index fafef84aa2..13fd51f473 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -299,6 +299,7 @@ public: { static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog"); static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator"); + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; if (log_to_viewer_log || log_to_sim) { @@ -332,6 +333,16 @@ public: } S32 data_size = worker->callbackHttpGet(channels, buffer, partial, success); + + if(log_texture_traffic && data_size > 0) + { + LLViewerTexture* tex = LLViewerTextureManager::findTexture(mID) ; + if(tex) + { + gTotalTextureBytesPerBoostLevel[tex->getBoostLevel()] += data_size ; + } + } + mFetcher->removeFromHTTPQueue(mID, data_size); } else @@ -1563,7 +1574,6 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con if (!url.empty() && (!exten.empty() && LLImageBase::getCodecFromExtension(exten) != IMG_CODEC_J2C)) { // Only do partial requests for J2C at the moment - //llinfos << "Merov : LLTextureFetch::createRequest(), blocking fetch on " << url << llendl; desired_size = MAX_IMAGE_DATA_SIZE; desired_discard = 0; } diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index c87aff022f..b9a15fd1f4 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -514,7 +514,8 @@ 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); + F32 total_texture_downloaded = (F32)gTotalTextureBytes / (1024 * 1024); + F32 total_object_downloaded = (F32)gTotalObjectBytes / (1024 * 1024); //---------------------------------------------------------------------------- LLGLSUIDefault gls_ui; LLColor4 text_color(1.f, 1.f, 1.f, 0.75f); @@ -525,13 +526,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 Net Tot: %d MB", + text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB Net Tot Tex: %.1f MB Tot Obj: %.1f MB", total_mem, max_total_mem, bound_mem, max_bound_mem, LLImageRaw::sGlobalRawMemory >> 20, discard_bias, - cache_usage, cache_max_usage, total_downloaded); + cache_usage, cache_max_usage, total_texture_downloaded, total_object_downloaded); //, cache_entries, cache_max_entries LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3, diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 749cf2c948..8176b8c1f9 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -35,6 +35,13 @@ using namespace LLNotificationsUI; +//-------------------------------------------------------------------------- +LLToastLifeTimer::LLToastLifeTimer(LLToast* toast, F32 period) + : mToast(toast), + LLEventTimer(period) +{ +} + /*virtual*/ BOOL LLToastLifeTimer::tick() { @@ -45,6 +52,38 @@ BOOL LLToastLifeTimer::tick() return FALSE; } +void LLToastLifeTimer::stop() +{ + mEventTimer.stop(); +} + +void LLToastLifeTimer::start() +{ + mEventTimer.start(); +} + +void LLToastLifeTimer::restart() +{ + mEventTimer.reset(); +} + +BOOL LLToastLifeTimer::getStarted() +{ + return mEventTimer.getStarted(); +} + +void LLToastLifeTimer::setPeriod(F32 period) +{ + mPeriod = period; +} + +F32 LLToastLifeTimer::getRemainingTimeF32() +{ + F32 et = mEventTimer.getElapsedTimeF32(); + if (!getStarted() || et > mPeriod) return 0.0f; + return mPeriod - et; +} + //-------------------------------------------------------------------------- LLToast::Params::Params() : can_fade("can_fade", true), @@ -73,11 +112,12 @@ LLToast::LLToast(const LLToast::Params& p) mIsHidden(false), mHideBtnPressed(false), mIsTip(p.is_tip), - mWrapperPanel(NULL) + mWrapperPanel(NULL), + mIsTransparent(false) { mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs)); - LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL); + buildFromFile("panel_toast.xml", NULL); setCanDrag(FALSE); @@ -102,6 +142,7 @@ LLToast::LLToast(const LLToast::Params& p) if(!p.on_delete_toast().empty()) mOnDeleteToastSignal.connect(p.on_delete_toast()); + // *TODO: This signal doesn't seem to be used at all. if(!p.on_mouse_enter().empty()) mOnMouseEnterSignal.connect(p.on_mouse_enter()); } @@ -142,6 +183,7 @@ LLToast::~LLToast() void LLToast::hide() { setVisible(FALSE); + setTransparentState(false); mTimer->stop(); mIsHidden = true; mOnFadeSignal(this); @@ -165,6 +207,16 @@ void LLToast::onFocusReceived() } } +void LLToast::setLifetime(S32 seconds) +{ + mToastLifetime = seconds; +} + +void LLToast::setFadingTime(S32 seconds) +{ + mToastFadingTime = seconds; +} + S32 LLToast::getTopPad() { if(mWrapperPanel) @@ -194,13 +246,46 @@ void LLToast::setCanFade(bool can_fade) //-------------------------------------------------------------------------- void LLToast::expire() { - // if toast has fade property - hide it - if(mCanFade) + if (mCanFade) { - hide(); + if (mIsTransparent) + { + hide(); + } + else + { + setTransparentState(true); + mTimer->restart(); + } } } +void LLToast::setTransparentState(bool transparent) +{ + setBackgroundOpaque(!transparent); + mIsTransparent = transparent; + + if (transparent) + { + mTimer->setPeriod(mToastFadingTime); + } + else + { + mTimer->setPeriod(mToastLifetime); + } +} + +F32 LLToast::getTimeLeftToLive() +{ + F32 time_to_live = mTimer->getRemainingTimeF32(); + + if (!mIsTransparent) + { + time_to_live += mToastFadingTime; + } + + return time_to_live; +} //-------------------------------------------------------------------------- void LLToast::reshapeToPanel() @@ -244,13 +329,6 @@ void LLToast::draw() drawChild(mHideBtn); } } - - // if timer started and remaining time <= fading time - if (mTimer->getStarted() && (mToastLifetime - - mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime) - { - setBackgroundOpaque(FALSE); - } } //-------------------------------------------------------------------------- @@ -266,6 +344,11 @@ void LLToast::setVisible(BOOL show) return; } + if (show && getVisible()) + { + return; + } + if(show) { setBackgroundOpaque(TRUE); @@ -371,7 +454,8 @@ void LLNotificationsUI::LLToast::stopFading() { if(mCanFade) { - stopTimer(); + setTransparentState(false); + mTimer->stop(); } } @@ -379,7 +463,8 @@ void LLNotificationsUI::LLToast::startFading() { if(mCanFade) { - resetTimer(); + setTransparentState(false); + mTimer->start(); } } diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index b22f3b9d09..fb534561c9 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -49,14 +49,16 @@ class LLToast; class LLToastLifeTimer: public LLEventTimer { public: - LLToastLifeTimer(LLToast* toast, F32 period) : mToast(toast), LLEventTimer(period){} + LLToastLifeTimer(LLToast* toast, F32 period); /*virtual*/ BOOL tick(); - void stop() { mEventTimer.stop(); } - void start() { mEventTimer.start(); } - void restart() {mEventTimer.reset(); } - BOOL getStarted() { return mEventTimer.getStarted(); } + void stop(); + void start(); + void restart(); + BOOL getStarted(); + void setPeriod(F32 period); + F32 getRemainingTimeF32(); LLTimer& getEventTimer() { return mEventTimer;} private : @@ -80,8 +82,14 @@ public: Optional<LLUUID> notif_id, //notification ID session_id; //im session ID Optional<LLNotificationPtr> notification; - Optional<F32> lifetime_secs, - fading_time_secs; // Number of seconds while a toast is fading + + //NOTE: Life time of a toast (i.e. period of time from the moment toast was shown + //till the moment when toast was hidden) is the sum of lifetime_secs and fading_time_secs. + + Optional<F32> lifetime_secs, // Number of seconds while a toast is non-transparent + fading_time_secs; // Number of seconds while a toast is transparent + + Optional<toast_callback_t> on_delete_toast, on_mouse_enter; Optional<bool> can_fade, @@ -125,10 +133,8 @@ public: LLPanel* getPanel() { return mPanel; } // enable/disable Toast's Hide button void setHideButtonEnabled(bool enabled); - // - void resetTimer() { mTimer->start(); } // - void stopTimer() { mTimer->stop(); } + F32 getTimeLeftToLive(); // LLToastLifeTimer* getTimer() { return mTimer.get();} // @@ -144,6 +150,10 @@ public: /*virtual*/ void onFocusReceived(); + void setLifetime(S32 seconds); + + void setFadingTime(S32 seconds); + /** * Returns padding between floater top and wrapper_panel top. * This padding should be taken into account when positioning or reshaping toasts @@ -188,18 +198,24 @@ public: virtual S32 notifyParent(const LLSD& info); + LLHandle<LLToast> getHandle() { mHandle.bind(this); return mHandle; } + private: void onToastMouseEnter(); void onToastMouseLeave(); - void expire(); + void expire(); + + void setTransparentState(bool transparent); LLUUID mNotificationID; LLUUID mSessionID; LLNotificationPtr mNotification; + LLRootHandle<LLToast> mHandle; + LLPanel* mWrapperPanel; // timer counts a lifetime of a toast @@ -218,6 +234,7 @@ private: bool mHideBtnPressed; bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849) bool mIsTip; + bool mIsTransparent; commit_signal_t mToastMouseEnterSignal; commit_signal_t mToastMouseLeaveSignal; diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 2d0c360905..8b2f066d41 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -76,6 +76,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal LLNotificationFormPtr form = mNotification->getForm(); std::string edit_text_name; std::string edit_text_contents; + S32 edit_text_max_chars = 0; bool is_password = false; LLToastPanel::setBackgroundVisible(FALSE); @@ -115,6 +116,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal { edit_text_contents = (*it)["value"].asString(); edit_text_name = (*it)["name"].asString(); + edit_text_max_chars = (*it)["max_length_chars"].asInteger(); } else if (type == "password") { @@ -253,6 +255,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal mLineEditor->setName(edit_text_name); mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight()); mLineEditor->setRect(leditor_rect); + mLineEditor->setMaxTextChars(edit_text_max_chars); mLineEditor->setText(edit_text_contents); // decrease limit of line editor of teleport offer dialog to avoid truncation of diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 4c75b07ae8..563c27c4d7 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -36,6 +36,7 @@ #include "llnotifications.h" #include "llviewertexteditor.h" +#include "llavatarnamecache.h" #include "lluiconstants.h" #include "llui.h" #include "llviewercontrol.h" @@ -54,12 +55,12 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification : LLToastPanel(notification), mInventoryOffer(NULL) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_group_notify.xml"); + buildFromFile( "panel_group_notify.xml"); const LLSD& payload = notification->getPayload(); LLGroupData groupData; if (!gAgent.getGroupData(payload["group_id"].asUUID(),groupData)) { - llwarns << "Group notice for unkown group: " << payload["group_id"].asUUID() << llendl; + llwarns << "Group notice for unknown group: " << payload["group_id"].asUUID() << llendl; } //group icon @@ -67,7 +68,11 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification pGroupIcon->setValue(groupData.mInsigniaID); //header title - const std::string& from_name = payload["sender_name"].asString(); + std::string from_name = payload["sender_name"].asString(); + if (LLAvatarNameCache::useDisplayNames()) + { + from_name = LLCacheName::buildUsername(from_name); + } std::stringstream from; from << from_name << "/" << groupData.mName; LLTextBox* pTitleText = getChild<LLTextBox>("title"); diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp index 82ccca4330..e0cb200ef5 100644 --- a/indra/newview/lltoastimpanel.cpp +++ b/indra/newview/lltoastimpanel.cpp @@ -45,7 +45,7 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif mAvatarIcon(NULL), mAvatarName(NULL), mTime(NULL), mMessage(NULL), mGroupIcon(NULL) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_instant_message.xml"); + buildFromFile( "panel_instant_message.xml"); mGroupIcon = getChild<LLGroupIconCtrl>("group_icon"); mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon"); @@ -141,7 +141,8 @@ void LLToastIMPanel::spawnNameToolTip() { // Spawn at right side of the name textbox. LLRect sticky_rect = mAvatarName->calcScreenRect(); - S32 icon_x = llmin(sticky_rect.mLeft + mAvatarName->getTextPixelWidth() + 3, sticky_rect.mRight - 16); + S32 icon_x = + llmin(sticky_rect.mLeft + mAvatarName->getTextPixelWidth() + 3, sticky_rect.mRight); LLCoordGL pos(icon_x, sticky_rect.mTop); LLToolTip::Params params; diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 1a1c94674b..3f7dc24ade 100644 --- a/indra/newview/lltoastnotifypanel.cpp +++ b/indra/newview/lltoastnotifypanel.cpp @@ -33,6 +33,7 @@ // library includes #include "lldbstrings.h" +#include "lllslconstants.h" #include "llnotifications.h" #include "lluiconstants.h" #include "llrect.h" @@ -61,7 +62,7 @@ mNumButtons(0), mAddedDefaultBtn(false), mCloseNotificationOnDestroy(true) { - LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml"); + buildFromFile( "panel_notification.xml"); if(rect != LLRect::null) { this->setShape(rect); @@ -70,11 +71,11 @@ mCloseNotificationOnDestroy(true) mControlPanel = getChild<LLPanel>("control_panel"); BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth"); // customize panel's attributes - // is it intended for displaying a tip + // is it intended for displaying a tip? mIsTip = notification->getType() == "notifytip"; - // is it a script dialog + // is it a script dialog? mIsScriptDialog = (notification->getName() == "ScriptDialog" || notification->getName() == "ScriptDialogGroup"); - // is it a caution + // is it a caution? // // caution flag can be set explicitly by specifying it in the notification payload, or it can be set implicitly if the // notify xml template specifies that it is a caution @@ -139,6 +140,12 @@ mCloseNotificationOnDestroy(true) LLSD form_element = form->getElement(i); if (form_element["type"].asString() != "button") { + // not a button. + continue; + } + if (form_element["name"].asString() == TEXTBOX_MAGIC_TOKEN) + { + // a textbox pretending to be a button. continue; } LLButton* new_button = createButton(form_element, TRUE); @@ -159,7 +166,7 @@ mCloseNotificationOnDestroy(true) if(h_pad < 2*HPAD) { /* - * Probably it is a scriptdialog toast + * Probably it is a scriptdialog toast * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons. * In last case set default h_pad to avoid heaping of buttons */ @@ -261,7 +268,7 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt } else if (mIsScriptDialog && is_ignore_btn) { - // this is ignore button,make it smaller + // this is ignore button, make it smaller p.rect.height = BTN_HEIGHT_SMALL; p.rect.width = 1; p.auto_resize = true; diff --git a/indra/newview/lltoastscripttextbox.cpp b/indra/newview/lltoastscripttextbox.cpp new file mode 100644 index 0000000000..c013f521cc --- /dev/null +++ b/indra/newview/lltoastscripttextbox.cpp @@ -0,0 +1,109 @@ +/** + * @file lltoastscripttextbox.cpp + * @brief Panel for script llTextBox dialogs + * + * $LicenseInfo:firstyear=2001&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 "lltoastscripttextbox.h" + +#include "llfocusmgr.h" + +#include "llbutton.h" +#include "llnotifications.h" +#include "llviewertexteditor.h" + +#include "llavatarnamecache.h" +#include "lluiconstants.h" +#include "llui.h" +#include "llviewercontrol.h" +#include "lltrans.h" +#include "llstyle.h" + +#include "llglheaders.h" +#include "llagent.h" + +const S32 LLToastScriptTextbox::DEFAULT_MESSAGE_MAX_LINE_COUNT= 7; + +LLToastScriptTextbox::LLToastScriptTextbox(LLNotificationPtr& notification) +: LLToastNotifyPanel(notification) +{ + buildFromFile( "panel_notify_textbox.xml"); + + const LLSD& payload = notification->getPayload(); + + //message body + const std::string& message = payload["message"].asString(); + + LLViewerTextEditor* pMessageText = getChild<LLViewerTextEditor>("message"); + pMessageText->clear(); + + LLStyle::Params style; + style.font = pMessageText->getDefaultFont(); + pMessageText->appendText(message, TRUE, style); + + //submit button + LLButton* pSubmitBtn = getChild<LLButton>("btn_submit"); + pSubmitBtn->setClickedCallback((boost::bind(&LLToastScriptTextbox::onClickSubmit, this))); + setDefaultBtn(pSubmitBtn); + + S32 maxLinesCount; + std::istringstream ss( getString("message_max_lines_count") ); + if (!(ss >> maxLinesCount)) + { + maxLinesCount = DEFAULT_MESSAGE_MAX_LINE_COUNT; + } + //snapToMessageHeight(pMessageText, maxLinesCount); +} + +// virtual +LLToastScriptTextbox::~LLToastScriptTextbox() +{ +} + +void LLToastScriptTextbox::close() +{ + die(); +} + +#include "lllslconstants.h" +void LLToastScriptTextbox::onClickSubmit() +{ + LLViewerTextEditor* pMessageText = getChild<LLViewerTextEditor>("message"); + + if (pMessageText) + { + LLSD response = mNotification->getResponseTemplate(); + response[TEXTBOX_MAGIC_TOKEN] = pMessageText->getText(); + if (response[TEXTBOX_MAGIC_TOKEN].asString().empty()) + { + // so we can distinguish between a successfully + // submitted blank textbox, and an ignored toast + response[TEXTBOX_MAGIC_TOKEN] = true; + } + mNotification->respond(response); + close(); + llwarns << response << llendl; + } +} diff --git a/indra/newview/lleventinfo.h b/indra/newview/lltoastscripttextbox.h index 958a276fbf..ae3b545e0a 100644 --- a/indra/newview/lleventinfo.h +++ b/indra/newview/lltoastscripttextbox.h @@ -1,8 +1,8 @@ -/** - * @file lleventinfo.h - * @brief LLEventInfo class definition +/** + * @file lltoastscripttextbox.h + * @brief Panel for script llTextBox dialogs * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ + * $LicenseInfo:firstyear=2001&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. * @@ -24,51 +24,35 @@ * $/LicenseInfo$ */ -#ifndef LL_LLEVENTINFO_H -#define LL_LLEVENTINFO_H +#ifndef LL_LLTOASTSCRIPTTEXTBOX_H +#define LL_LLTOASTSCRIPTTEXTBOX_H -#include <map> +#include "lltoastnotifypanel.h" +#include "llnotificationptr.h" -#include "v3dmath.h" -#include "lluuid.h" +class LLButton; -class LLMessageSystem; - -class LLEventInfo +/** + * Toast panel for scripted llTextbox notifications. + */ +class LLToastScriptTextbox +: public LLToastNotifyPanel { public: - LLEventInfo() : - mID(0), - mDuration(0), - mUnixTime(0), - mHasCover(FALSE), - mCover(0), - mEventFlags(0), - mSelected(FALSE) - {} + void close(); - void unpack(LLMessageSystem *msg); + static bool onNewNotification(const LLSD& notification); - static void loadCategories(const LLSD& options); - -public: - std::string mName; - U32 mID; - std::string mDesc; - std::string mCategoryStr; - U32 mDuration; - std::string mTimeStr; - LLUUID mRunByID; - std::string mSimName; - LLVector3d mPosGlobal; - time_t mUnixTime; // seconds from 1970 - BOOL mHasCover; - U32 mCover; - U32 mEventFlags; - BOOL mSelected; + // Non-transient messages. You can specify non-default button + // layouts (like one for script dialogs) by passing various + // numbers in for "layout". + LLToastScriptTextbox(LLNotificationPtr& notification); - typedef std::map<U32, std::string> cat_map; - static cat_map sCategories; + /*virtual*/ ~LLToastScriptTextbox(); +protected: + void onClickSubmit(); +private: + static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT; }; -#endif // LL_LLEVENTINFO_H +#endif diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index d6e069b3dc..1c745906aa 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1446,10 +1446,10 @@ static void give_inventory_cb(const LLSD& notification, const LLSD& response) } static void show_item_sharing_confirmation(const std::string name, - LLViewerInventoryItem* inv_item, - const LLSD& dest, - const LLUUID& dest_agent, - const LLUUID& session_id = LLUUID::null) + LLViewerInventoryItem* inv_item, + const LLSD& dest, + const LLUUID& dest_agent, + const LLUUID& session_id = LLUUID::null) { if (!inv_item) { @@ -1459,7 +1459,7 @@ static void show_item_sharing_confirmation(const std::string name, LLSD substitutions; substitutions["RESIDENTS"] = name; - substitutions["ITEMS"] = inv_item ? inv_item->getName() : LLStringUtil::null; + substitutions["ITEMS"] = inv_item->getName(); LLSD payload; payload["agent_id"] = dest_agent; payload["item_id"] = inv_item->getUUID(); @@ -1469,13 +1469,12 @@ static void show_item_sharing_confirmation(const std::string name, } static void get_name_cb(const LLUUID& id, - const std::string& first_name, - const std::string& last_name, + const std::string& full_name, LLViewerInventoryItem* inv_item, const LLSD& dest, const LLUUID& dest_agent) { - show_item_sharing_confirmation(first_name + " " + last_name, + show_item_sharing_confirmation(full_name, inv_item, dest, id, @@ -1528,7 +1527,7 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_ } else { - gCacheName->get(dest_agent, FALSE, boost::bind(&get_name_cb, _1, _2, _3, inv_item, dest, dest_agent)); + gCacheName->get(dest_agent, false, boost::bind(&get_name_cb, _1, _2, inv_item, dest, dest_agent)); } return true; diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 864de018e0..d992d808c7 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -34,6 +34,7 @@ #include "llagent.h" #include "llagentcamera.h" +#include "llavatarnamecache.h" #include "llviewercontrol.h" #include "llfocusmgr.h" //#include "llfirstuse.h" @@ -874,23 +875,40 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l || !existing_inspector->getVisible() || existing_inspector->getKey()["avatar_id"].asUUID() != hover_object->getID()) { - std::string avatar_name; + // IDEVO: try to get display name + username + std::string final_name; + std::string full_name; + if (!gCacheName->getFullName(hover_object->getID(), full_name)) + { LLNameValue* firstname = hover_object->getNVPair("FirstName"); LLNameValue* lastname = hover_object->getNVPair("LastName"); if (firstname && lastname) { - avatar_name = llformat("%s %s", firstname->getString(), lastname->getString()); + full_name = LLCacheName::buildFullName( + firstname->getString(), lastname->getString()); + } + else + { + full_name = LLTrans::getString("TooltipPerson"); + } + } + + LLAvatarName av_name; + if (LLAvatarNameCache::useDisplayNames() && + LLAvatarNameCache::get(hover_object->getID(), &av_name)) + { + final_name = av_name.getCompleteName(); } else { - avatar_name = LLTrans::getString("TooltipPerson"); + final_name = full_name; } - + // *HACK: We may select this object, so pretend it was clicked mPick = mHoverPick; LLInspector::Params p; p.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>()); - p.message(avatar_name); + p.message(final_name); p.image.name("Inspector_I"); p.click_callback(boost::bind(showAvatarInspector, hover_object->getID())); p.visible_time_near(6.f); diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index 8391c0f832..c3dd17def9 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -564,16 +564,16 @@ void LLTracker::renderBeacon(LLVector3d pos_global, std::string text; text = llformat( "%.0f m", to_vec.magVec()); - LLWString wstr; - wstr += utf8str_to_wstring(label); - wstr += '\n'; - wstr += utf8str_to_wstring(text); + std::string str; + str += label; + str += '\n'; + str += text; hud_textp->setFont(LLFontGL::getFontSansSerif()); hud_textp->setZCompare(FALSE); hud_textp->setColor(LLColor4(1.f, 1.f, 1.f, llmax(0.2f, llmin(1.f,(dist-FADE_DIST)/FADE_DIST)))); - hud_textp->setString(wstr); + hud_textp->setString(str); hud_textp->setVertAlignment(LLHUDText::ALIGN_VERT_CENTER); hud_textp->setPositionAgent(pos_agent); } diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp index 750bb224b1..b19c738ed2 100644 --- a/indra/newview/llvieweraudio.cpp +++ b/indra/newview/llvieweraudio.cpp @@ -114,10 +114,6 @@ void audio_update_volume(bool force_update) gAudiop->setDopplerFactor(gSavedSettings.getF32("AudioLevelDoppler")); gAudiop->setRolloffFactor(gSavedSettings.getF32("AudioLevelRolloff")); -#ifdef kAUDIO_ENABLE_WIND - gAudiop->enableWind(!mute_audio); -#endif - gAudiop->setMuted(mute_audio); if (force_update) diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 522b5a7dfa..117e49d67f 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -117,10 +117,23 @@ static bool handleSetShaderChanged(const LLSD& newvalue) gBumpImageList.destroyGL(); gBumpImageList.restoreGL(); + // Changing shader also changes the terrain detail to high, reflect that change here + if (newvalue.asBoolean()) + { + // shaders enabled, set terrain detail to high + gSavedSettings.setS32("RenderTerrainDetail", 1); + } + // else, leave terrain detail as is LLViewerShaderMgr::instance()->setShaders(); return true; } +bool handleRenderTransparentWaterChanged(const LLSD& newvalue) +{ + LLWorld::getInstance()->updateWaterObjects(); + return true; +} + static bool handleReleaseGLBufferChanged(const LLSD& newvalue) { if (gPipeline.isInit()) @@ -131,6 +144,13 @@ static bool handleReleaseGLBufferChanged(const LLSD& newvalue) return true; } +static bool handleAnisotropicChanged(const LLSD& newvalue) +{ + LLImageGL::sGlobalUseAnisotropic = newvalue.asBoolean(); + LLImageGL::dirtyTexOptions(); + return true; +} + static bool handleVolumeLODChanged(const LLSD& newvalue) { LLVOVolume::sLODFactor = (F32) newvalue.asReal(); @@ -498,6 +518,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderSpecularResY")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderSpecularExponent")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderFSAASamples")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); + gSavedSettings.getControl("RenderAnisotropic")->getSignal()->connect(boost::bind(&handleAnisotropicChanged, _2)); gSavedSettings.getControl("RenderShadowResolutionScale")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderGlow")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); @@ -629,6 +650,7 @@ void settings_setup_listeners() gSavedSettings.getControl("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2)); gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2)); gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2)); + gSavedSettings.getControl("RenderTransparentWater")->getSignal()->connect(boost::bind(&handleRenderTransparentWaterChanged, _2)); } #if TEST_CACHED_CONTROL diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 916cbe2267..ddb11829df 100644 --- a/indra/newview/llviewerdisplay.cpp +++ b/indra/newview/llviewerdisplay.cpp @@ -95,6 +95,7 @@ BOOL gForceRenderLandFence = FALSE; BOOL gDisplaySwapBuffers = FALSE; BOOL gDepthDirty = FALSE; BOOL gResizeScreenTexture = FALSE; +BOOL gWindowResized = FALSE; BOOL gSnapshot = FALSE; U32 gRecentFrameCount = 0; // number of 'recent' frames @@ -218,6 +219,22 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLMemType mt_render(LLMemType::MTYPE_RENDER); LLFastTimer t(FTM_RENDER); + if (gWindowResized) + { //skip render on frames where window has been resized + gGL.flush(); + glClear(GL_COLOR_BUFFER_BIT); + gViewerWindow->mWindow->swapBuffers(); + gPipeline.resizeScreenTexture(); + gResizeScreenTexture = FALSE; + gWindowResized = FALSE; + return; + } + + if (LLPipeline::sRenderDeferred) + { //hack to make sky show up in deferred snapshots + for_snapshot = FALSE; + } + if (LLPipeline::sRenderFrameTest) { send_agent_pause(); @@ -318,7 +335,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLImageGL::updateStats(gFrameTimeSeconds); LLVOAvatar::sRenderName = gSavedSettings.getS32("AvatarNameTagMode"); - LLVOAvatar::sRenderGroupTitles = (gSavedSettings.getBOOL("RenderShowGroupTitleAll") && gSavedSettings.getS32("AvatarNameTagMode")); + LLVOAvatar::sRenderGroupTitles = (gSavedSettings.getBOOL("NameTagShowGroupTitles") && gSavedSettings.getS32("AvatarNameTagMode")); gPipeline.mBackfaceCull = TRUE; gFrameCount++; @@ -531,6 +548,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) gViewerWindow->setup3DViewport(); gPipeline.resetFrameStats(); // Reset per-frame statistics. + if (!gDisconnected) { LLMemType mt_du(LLMemType::MTYPE_DISPLAY_UPDATE); @@ -573,7 +591,8 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) S32 water_clip = 0; if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT) > 1) && - gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER)) + (gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_WATER) || + gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_VOIDWATER))) { if (LLViewerCamera::getInstance()->cameraUnderWater()) { @@ -706,7 +725,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) // // Doing this here gives hardware occlusion queries extra time to complete LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages"); - LLError::LLCallStacks::clear() ; { LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE); diff --git a/indra/newview/llviewerdisplay.h b/indra/newview/llviewerdisplay.h index c6e86751e8..f6467d7f93 100644 --- a/indra/newview/llviewerdisplay.h +++ b/indra/newview/llviewerdisplay.h @@ -40,5 +40,6 @@ extern BOOL gTeleportDisplay; extern LLFrameTimer gTeleportDisplayTimer; extern BOOL gForceRenderLandFence; extern BOOL gResizeScreenTexture; +extern BOOL gWindowResized; #endif // LL_LLVIEWERDISPLAY_H diff --git a/indra/newview/llviewerdisplayname.cpp b/indra/newview/llviewerdisplayname.cpp new file mode 100644 index 0000000000..5741fab29a --- /dev/null +++ b/indra/newview/llviewerdisplayname.cpp @@ -0,0 +1,208 @@ +/** + * @file llviewerdisplayname.cpp + * @brief Wrapper for display name functionality + * + * $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 "llviewerdisplayname.h" + +// viewer includes +#include "llagent.h" +#include "llviewerregion.h" +#include "llvoavatar.h" + +// library includes +#include "llavatarnamecache.h" +#include "llhttpclient.h" +#include "llhttpnode.h" +#include "llnotificationsutil.h" +#include "llui.h" // getLanguage() + +namespace LLViewerDisplayName +{ + // Fired when viewer receives server response to display name change + set_name_signal_t sSetDisplayNameSignal; + + // Fired when there is a change in the agent's name + name_changed_signal_t sNameChangedSignal; + + void addNameChangedCallback(const name_changed_signal_t::slot_type& cb) + { + sNameChangedSignal.connect(cb); + } + +} + +class LLSetDisplayNameResponder : public LLHTTPClient::Responder +{ +public: + // only care about errors + /*virtual*/ void error(U32 status, const std::string& reason) + { + LLViewerDisplayName::sSetDisplayNameSignal(false, "", LLSD()); + LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots(); + } +}; + +void LLViewerDisplayName::set(const std::string& display_name, const set_name_slot_t& slot) +{ + // TODO: simple validation here + + LLViewerRegion* region = gAgent.getRegion(); + llassert(region); + std::string cap_url = region->getCapability("SetDisplayName"); + if (cap_url.empty()) + { + // this server does not support display names, report error + slot(false, "unsupported", LLSD()); + return; + } + + // People API can return localized error messages. Indicate our + // language preference via header. + LLSD headers; + headers["Accept-Language"] = LLUI::getLanguage(); + + // People API requires both the old and new value to change a variable. + // Our display name will be in cache before the viewer's UI is available + // to request a change, so we can use direct lookup without callback. + LLAvatarName av_name; + if (!LLAvatarNameCache::get( gAgent.getID(), &av_name)) + { + slot(false, "name unavailable", LLSD()); + return; + } + + // People API expects array of [ "old value", "new value" ] + LLSD change_array = LLSD::emptyArray(); + change_array.append(av_name.mDisplayName); + change_array.append(display_name); + + llinfos << "Set name POST to " << cap_url << llendl; + + // Record our caller for when the server sends back a reply + sSetDisplayNameSignal.connect(slot); + + // POST the requested change. The sim will not send a response back to + // this request directly, rather it will send a separate message after it + // communicates with the back-end. + LLSD body; + body["display_name"] = change_array; + LLHTTPClient::post(cap_url, body, new LLSetDisplayNameResponder, headers); +} + +class LLSetDisplayNameReply : public LLHTTPNode +{ + LOG_CLASS(LLSetDisplayNameReply); +public: + /*virtual*/ void post( + LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLSD body = input["body"]; + + S32 status = body["status"].asInteger(); + bool success = (status == 200); + std::string reason = body["reason"].asString(); + LLSD content = body["content"]; + + llinfos << "status " << status << " reason " << reason << llendl; + + // If viewer's concept of display name is out-of-date, the set request + // will fail with 409 Conflict. If that happens, fetch up-to-date + // name information. + if (status == 409) + { + LLUUID agent_id = gAgent.getID(); + // Flush stale data + LLAvatarNameCache::erase( agent_id ); + // Queue request for new data + LLAvatarName ignored; + LLAvatarNameCache::get( agent_id, &ignored ); + // Kill name tag, as it is wrong + LLVOAvatar::invalidateNameTag( agent_id ); + } + + // inform caller of result + LLViewerDisplayName::sSetDisplayNameSignal(success, reason, content); + LLViewerDisplayName::sSetDisplayNameSignal.disconnect_all_slots(); + } +}; + + +class LLDisplayNameUpdate : public LLHTTPNode +{ + /*virtual*/ void post( + LLHTTPNode::ResponsePtr response, + const LLSD& context, + const LLSD& input) const + { + LLSD body = input["body"]; + LLUUID agent_id = body["agent_id"]; + std::string old_display_name = body["old_display_name"]; + // By convention this record is called "agent" in the People API + LLSD name_data = body["agent"]; + + // Inject the new name data into cache + LLAvatarName av_name; + av_name.fromLLSD( name_data ); + + llinfos << "name-update now " << LLDate::now() + << " next_update " << LLDate(av_name.mNextUpdate) + << llendl; + + // Name expiration time may be provided in headers, or we may use a + // default value + // *TODO: get actual headers out of ResponsePtr + //LLSD headers = response->mHeaders; + LLSD headers; + av_name.mExpires = + LLAvatarNameCache::nameExpirationFromHeaders(headers); + + LLAvatarNameCache::insert(agent_id, av_name); + + // force name tag to update + LLVOAvatar::invalidateNameTag(agent_id); + + LLSD args; + args["OLD_NAME"] = old_display_name; + args["SLID"] = av_name.mUsername; + args["NEW_NAME"] = av_name.mDisplayName; + LLNotificationsUtil::add("DisplayNameUpdate", args); + if (agent_id == gAgent.getID()) + { + LLViewerDisplayName::sNameChangedSignal(); + } + } +}; + +LLHTTPRegistration<LLSetDisplayNameReply> + gHTTPRegistrationMessageSetDisplayNameReply( + "/message/SetDisplayNameReply"); + +LLHTTPRegistration<LLDisplayNameUpdate> + gHTTPRegistrationMessageDisplayNameUpdate( + "/message/DisplayNameUpdate"); diff --git a/indra/newview/llviewerdisplayname.h b/indra/newview/llviewerdisplayname.h new file mode 100644 index 0000000000..16d59ae43b --- /dev/null +++ b/indra/newview/llviewerdisplayname.h @@ -0,0 +1,53 @@ +/** + * @file llviewerdisplayname.h + * @brief Wrapper for display name functionality + * + * $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 LLVIEWERDISPLAYNAME_H +#define LLVIEWERDISPLAYNAME_H + +#include <boost/signals2.hpp> + +class LLSD; +class LLUUID; + +namespace LLViewerDisplayName +{ + typedef boost::signals2::signal< + void (bool success, const std::string& reason, const LLSD& content)> + set_name_signal_t; + typedef set_name_signal_t::slot_type set_name_slot_t; + + typedef boost::signals2::signal<void (void)> name_changed_signal_t; + typedef name_changed_signal_t::slot_type name_changed_slot_t; + + // Sends an update to the server to change a display name + // and call back when done. May not succeed due to service + // unavailable or name not available. + void set(const std::string& display_name, const set_name_slot_t& slot); + + void addNameChangedCallback(const name_changed_signal_t::slot_type& cb); +} + +#endif // LLVIEWERDISPLAYNAME_H diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index b6f2d34663..f573f25efe 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -49,6 +49,7 @@ #include "llfloaterbump.h" #include "llfloatercamera.h" #include "llfloaterdaycycle.h" +#include "llfloaterdisplayname.h" #include "llfloaterevent.h" #include "llfloatersearch.h" #include "llfloaterenvsettings.h" @@ -80,6 +81,7 @@ #include "llfloaterpostprocess.h" #include "llfloaterpreference.h" #include "llfloaterproperties.h" +#include "llfloaterregiondebugconsole.h" #include "llfloaterregioninfo.h" #include "llfloaterreporter.h" #include "llfloaterscriptdebug.h" @@ -95,7 +97,6 @@ #include "llfloatertos.h" #include "llfloatertopobjects.h" #include "llfloateruipreview.h" -#include "llfloatervoicedevicesettings.h" #include "llfloatervoiceeffect.h" #include "llfloaterwater.h" #include "llfloaterwhitelistentry.h" @@ -177,6 +178,7 @@ void LLViewerFloaterReg::registerFloaters() LLInspectObjectUtil::registerFloater(); LLInspectRemoteObjectUtil::registerFloater(); LLNotificationsUI::registerFloater(); + LLFloaterDisplayNameUtil::registerFloater(); LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>); LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>); @@ -202,7 +204,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterHardwareSettings>); LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPerms>); LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterJoystick>); - LLFloaterReg::add("pref_voicedevicesettings", "floater_device_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceDeviceSettings>); LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewAnim>, "preview"); LLFloaterReg::add("preview_gesture", "floater_preview_gesture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewGesture>, "preview"); LLFloaterReg::add("preview_notecard", "floater_preview_notecard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewNotecard>, "preview"); @@ -227,6 +228,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("reporter", "floater_report_abuse.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterReporter>); LLFloaterReg::add("reset_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterResetQueue>); + LLFloaterReg::add("region_debug_console", "floater_region_debug_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionDebugConsole>); LLFloaterReg::add("region_info", "floater_region_info.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRegionInfo>); LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>); diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 75a5b14154..7dbaa4cf92 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1776,9 +1776,9 @@ PermissionMask LLViewerInventoryItem::getPermissionMask() const //---------- -void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name) +void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& name, bool is_group) { - rename(first_name + " " + last_name); + rename(name); gInventory.addChangedMask(LLInventoryObserver::LABEL, getUUID()); gInventory.notifyObservers(); } diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 7f5a92eeab..1af06a1be8 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -157,7 +157,7 @@ public: PermissionMask getPermissionMask() const; // callback - void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name); + void onCallingCardNameLookup(const LLUUID& id, const std::string& name, bool is_group); // If this is a broken link, try to fix it and any other identical link. BOOL regenerateLink(); diff --git a/indra/newview/llviewerjoint.cpp b/indra/newview/llviewerjoint.cpp index 0cf5fe0ada..baf85d6884 100644 --- a/indra/newview/llviewerjoint.cpp +++ b/indra/newview/llviewerjoint.cpp @@ -257,7 +257,7 @@ U32 LLViewerJoint::render( F32 pixelArea, BOOL first_pass, BOOL is_dummy ) // if object is transparent, defer it, otherwise // give the joint subclass a chance to draw itself //---------------------------------------------------------------- - if ( gRenderForSelect || is_dummy ) + if ( is_dummy ) { triangle_count += drawShape( pixelArea, first_pass, is_dummy ); } diff --git a/indra/newview/llviewerjointattachment.cpp b/indra/newview/llviewerjointattachment.cpp index ecb7e2064d..4e14824e69 100644 --- a/indra/newview/llviewerjointattachment.cpp +++ b/indra/newview/llviewerjointattachment.cpp @@ -32,6 +32,7 @@ #include "llviewercontrol.h" #include "lldrawable.h" #include "llgl.h" +#include "llhudtext.h" #include "llrender.h" #include "llvoavatarself.h" #include "llvolume.h" diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index ae2aa41b3a..e59e685f53 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -61,7 +61,6 @@ extern PFNGLWEIGHTPOINTERARBPROC glWeightPointerARB; extern PFNGLWEIGHTFVARBPROC glWeightfvARB; extern PFNGLVERTEXBLENDARBPROC glVertexBlendARB; #endif -extern BOOL gRenderForSelect; static LLPointer<LLVertexBuffer> sRenderBuffer = NULL; static const U32 sRenderMask = LLVertexBuffer::MAP_VERTEX | @@ -515,17 +514,14 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) //---------------------------------------------------------------- // setup current color //---------------------------------------------------------------- - if (!gRenderForSelect) - { - if (is_dummy) - glColor4fv(LLVOAvatar::getDummyColor().mV); - else - glColor4fv(mColor.mV); - } + if (is_dummy) + glColor4fv(LLVOAvatar::getDummyColor().mV); + else + glColor4fv(mColor.mV); stop_glerror(); - LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), gRenderForSelect ? 0.0f : mShiny && !(mFace->getPool()->getVertexShaderLevel() > 0)); + LLGLSSpecular specular(LLColor4(1.f,1.f,1.f,1.f), mShiny && !(mFace->getPool()->getVertexShaderLevel() > 0)); //---------------------------------------------------------------- // setup current texture @@ -580,19 +576,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) gGL.getTexUnit(0)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT)); } - if (gRenderForSelect) - { - if (isTransparent()) - { - gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); - gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_CONST_ALPHA); - } - else - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - } - } - mFace->mVertexBuffer->setBuffer(sRenderMask); U32 start = mMesh->mFaceVertexOffset; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 283669aaef..31cf0acdd7 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -51,6 +51,7 @@ #include "llvoavatarself.h" #include "llviewerregion.h" #include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this! +#include "llfilepicker.h" #include "llevent.h" // LLSimpleListener #include "llnotificationsutil.h" @@ -60,6 +61,8 @@ //#include "llfirstuse.h" #include "llwindow.h" +#include "llfloatermediabrowser.h" // for handling window close requests and geometry change requests in media browser windows. + #include <boost/bind.hpp> // for SkinFolder listener #include <boost/signals2.hpp> @@ -1080,7 +1083,7 @@ void LLViewerMedia::clearAllCookies() } // the hard part: iterate over all user directories and delete the cookie file from each one - while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename, false)) + while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename)) { target = base_dir; target += filename; @@ -1365,6 +1368,38 @@ void LLViewerMedia::openIDCookieResponse(const std::string &cookie) setOpenIDCookie(); } +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::proxyWindowOpened(const std::string &target, const std::string &uuid) +{ + if(uuid.empty()) + return; + + for (impl_list::iterator iter = sViewerMediaImplList.begin(); iter != sViewerMediaImplList.end(); iter++) + { + if((*iter)->mMediaSource && (*iter)->mMediaSource->pluginSupportsMediaBrowser()) + { + (*iter)->mMediaSource->proxyWindowOpened(target, uuid); + } + } +} + +///////////////////////////////////////////////////////////////////////////////////////// +// static +void LLViewerMedia::proxyWindowClosed(const std::string &uuid) +{ + if(uuid.empty()) + return; + + for (impl_list::iterator iter = sViewerMediaImplList.begin(); iter != sViewerMediaImplList.end(); iter++) + { + if((*iter)->mMediaSource && (*iter)->mMediaSource->pluginSupportsMediaBrowser()) + { + (*iter)->mMediaSource->proxyWindowClosed(uuid); + } + } +} + bool LLViewerMedia::hasInWorldMedia() { if (sInWorldMediaDisabled) return false; @@ -1598,7 +1633,7 @@ void LLViewerMediaImpl::setMediaType(const std::string& media_type) ////////////////////////////////////////////////////////////////////////////////////////// /*static*/ -LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height) +LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height, const std::string target) { std::string plugin_basename = LLMIMETypes::implType(media_type); @@ -1654,7 +1689,9 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ // collect 'javascript enabled' setting from prefs and send to embedded browser bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" ); media_source->setJavascriptEnabled( javascript_enabled ); - + + media_source->setTarget(target); + if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"))) { return media_source; @@ -1705,7 +1742,7 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type) // Save the MIME type that really caused the plugin to load mCurrentMimeType = mMimeType; - LLPluginClassMedia* media_source = newSourceFromMediaType(mMimeType, this, mMediaWidth, mMediaHeight); + LLPluginClassMedia* media_source = newSourceFromMediaType(mMimeType, this, mMediaWidth, mMediaHeight, mTarget); if (media_source) { @@ -2805,6 +2842,7 @@ bool LLViewerMediaImpl::isPlayable() const ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event) { + bool pass_through = true; switch(event) { case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: @@ -2818,28 +2856,6 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla case MEDIA_EVENT_CLICK_LINK_HREF: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << plugin->getClickTarget() << "\", uri is " << plugin->getClickURL() << LL_ENDL; - // retrieve the event parameters - std::string url = plugin->getClickURL(); - U32 target_type = plugin->getClickTargetType(); - - switch (target_type) - { - case LLPluginClassMedia::TARGET_EXTERNAL: - // force url to external browser - LLWeb::loadURLExternal(url); - break; - case LLPluginClassMedia::TARGET_BLANK: - // open in SL media browser or external browser based on user pref - LLWeb::loadURL(url); - break; - case LLPluginClassMedia::TARGET_NONE: - // ignore this click and let media plugin handle it - break; - case LLPluginClassMedia::TARGET_OTHER: - LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL; - break; - default: break; - } }; break; case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH: @@ -2971,13 +2987,70 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla } break; + case LLViewerMediaObserver::MEDIA_EVENT_PICK_FILE_REQUEST: + { + // Display a file picker + std::string response; + + LLFilePicker& picker = LLFilePicker::instance(); + if (!picker.getOpenFile(LLFilePicker::FFLOAD_ALL)) + { + // The user didn't pick a file -- the empty response string will indicate this. + } + + response = picker.getFirstFile(); + + plugin->sendPickFileResponse(response); + } + break; + case LLViewerMediaObserver::MEDIA_EVENT_CLOSE_REQUEST: + { + std::string uuid = plugin->getClickUUID(); + + llinfos << "MEDIA_EVENT_CLOSE_REQUEST for uuid " << uuid << llendl; + + if(uuid.empty()) + { + // This close request is directed at this instance, let it fall through. + } + else + { + // This close request is directed at another instance + pass_through = false; + LLFloaterMediaBrowser::closeRequest(uuid); + } + } + break; + + case LLViewerMediaObserver::MEDIA_EVENT_GEOMETRY_CHANGE: + { + std::string uuid = plugin->getClickUUID(); + + llinfos << "MEDIA_EVENT_GEOMETRY_CHANGE for uuid " << uuid << llendl; + + if(uuid.empty()) + { + // This geometry change request is directed at this instance, let it fall through. + } + else + { + // This request is directed at another instance + pass_through = false; + LLFloaterMediaBrowser::geometryChanged(uuid, plugin->getGeometryX(), plugin->getGeometryY(), plugin->getGeometryWidth(), plugin->getGeometryHeight()); + } + } + break; + default: break; } - // Just chain the event to observers. - emitEvent(plugin, event); + if(pass_through) + { + // Just chain the event to observers. + emitEvent(plugin, event); + } } //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index e0cc26fa29..4025a4484f 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -152,6 +152,9 @@ public: static void openIDSetup(const std::string &openid_url, const std::string &openid_token); static void openIDCookieResponse(const std::string &cookie); + static void proxyWindowOpened(const std::string &target, const std::string &uuid); + static void proxyWindowClosed(const std::string &uuid); + private: static void setOpenIDCookie(); static void onTeleportFinished(); @@ -271,8 +274,10 @@ public: ECursorType getLastSetCursor() { return mLastSetCursor; } + void setTarget(const std::string& target) { mTarget = target; } + // utility function to create a ready-to-use media instance from a desired media type. - static LLPluginClassMedia* newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height); + static LLPluginClassMedia* newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height, const std::string target = LLStringUtil::null); // Internally set our desired browser user agent string, including // the Second Life version and skin name. Used because we can @@ -438,6 +443,7 @@ private: bool mNavigateSuspended; bool mNavigateSuspendedDeferred; bool mTrustedBrowser; + std::string mTarget; private: BOOL mIsUpdated ; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index f62223a38d..03490034d8 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -28,6 +28,7 @@ #include "llviewermenu.h" // linden library includes +#include "llavatarnamecache.h" // IDEVO #include "llfloaterreg.h" #include "llcombobox.h" #include "llinventorypanel.h" @@ -62,6 +63,7 @@ #include "lllandmarkactions.h" #include "llgroupmgr.h" #include "lltooltip.h" +#include "llhints.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llimview.h" @@ -219,8 +221,6 @@ BOOL check_show_xui_names(void *); // Debug UI void handle_buy_currency_test(void*); -void handle_save_to_xml(void*); -void handle_load_from_xml(void*); void handle_god_mode(void*); @@ -1382,37 +1382,6 @@ class LLAdvancedCheckDebugWindowProc : public view_listener_t // ------------------------------XUI MENU --------------------------- -////////////////////// -// LOAD UI FROM XML // -////////////////////// - - -class LLAdvancedLoadUIFromXML : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - handle_load_from_xml(NULL); - return true; -} -}; - - - -//////////////////// -// SAVE UI TO XML // -//////////////////// - - -class LLAdvancedSaveUIToXML : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - handle_save_to_xml(NULL); - return true; -} -}; - - class LLAdvancedSendTestIms : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -1992,6 +1961,16 @@ class LLAdvancedShowDebugSettings : public view_listener_t // VIEW ADMIN OPTIONS // //////////////////////// +class LLAdvancedEnableViewAdminOptions : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + // Don't enable in god mode since the admin menu is shown anyway. + // Only enable if the user has set the appropriate debug setting. + bool new_value = !gAgent.getAgentAccess().isGodlikeWithoutAdminMenuFakery() && gSavedSettings.getBOOL("AdminMenu"); + return new_value; + } +}; class LLAdvancedToggleViewAdminOptions : public view_listener_t { @@ -2006,7 +1985,7 @@ class LLAdvancedCheckViewAdminOptions : public view_listener_t { bool handleEvent(const LLSD& userdata) { - bool new_value = check_admin_override(NULL); + bool new_value = check_admin_override(NULL) || gAgent.isGodlike(); return new_value; } }; @@ -2800,9 +2779,8 @@ class LLObjectMute : public view_listener_t LLNameValue *lastname = avatar->getNVPair("LastName"); if (firstname && lastname) { - name = firstname->getString(); - name += " "; - name += lastname->getString(); + name = LLCacheName::buildFullName( + firstname->getString(), lastname->getString()); } type = LLMute::AGENT; @@ -3148,58 +3126,6 @@ bool enable_freeze_eject(const LLSD& avatar_id) return new_value; } -class LLAvatarGiveCard : public view_listener_t -{ - bool handleEvent(const LLSD& userdata) - { - llinfos << "handle_give_card()" << llendl; - LLViewerObject* dest = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject(); - if(dest && dest->isAvatar()) - { - bool found_name = false; - LLSD args; - LLSD old_args; - LLNameValue* nvfirst = dest->getNVPair("FirstName"); - LLNameValue* nvlast = dest->getNVPair("LastName"); - if(nvfirst && nvlast) - { - args["FIRST"] = nvfirst->getString(); - args["LAST"] = nvlast->getString(); - old_args["FIRST"] = nvfirst->getString(); - old_args["LAST"] = nvlast->getString(); - found_name = true; - } - LLViewerRegion* region = dest->getRegion(); - LLHost dest_host; - if(region) - { - dest_host = region->getHost(); - } - if(found_name && dest_host.isOk()) - { - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("OfferCallingCard"); - msg->nextBlockFast(_PREHASH_AgentData); - msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID()); - msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID()); - msg->nextBlockFast(_PREHASH_AgentBlock); - msg->addUUIDFast(_PREHASH_DestID, dest->getID()); - LLUUID transaction_id; - transaction_id.generate(); - msg->addUUIDFast(_PREHASH_TransactionID, transaction_id); - msg->sendReliable(dest_host); - LLNotificationsUtil::add("OfferedCard", args); - } - else - { - LLNotificationsUtil::add("CantOfferCallingCard", old_args); - } - } - return true; - } -}; - - void login_done(S32 which, void *user) { @@ -3622,21 +3548,17 @@ void request_friendship(const LLUUID& dest_id) LLViewerObject* dest = gObjectList.findObject(dest_id); if(dest && dest->isAvatar()) { - std::string fullname; - LLSD args; + std::string full_name; LLNameValue* nvfirst = dest->getNVPair("FirstName"); LLNameValue* nvlast = dest->getNVPair("LastName"); if(nvfirst && nvlast) { - args["FIRST"] = nvfirst->getString(); - args["LAST"] = nvlast->getString(); - fullname = nvfirst->getString(); - fullname += " "; - fullname += nvlast->getString(); + full_name = LLCacheName::buildFullName( + nvfirst->getString(), nvlast->getString()); } - if (!fullname.empty()) + if (!full_name.empty()) { - LLAvatarActions::requestFriendshipDialog(dest_id, fullname); + LLAvatarActions::requestFriendshipDialog(dest_id, full_name); } else { @@ -4215,6 +4137,11 @@ class LLObjectEnableReturn : public view_listener_t { bool handleEvent(const LLSD& userdata) { + if (LLSelectMgr::getInstance()->getSelection()->isEmpty()) + { + // Do not enable if nothing selected + return false; + } #ifdef HACKED_GODLIKE_VIEWER bool new_value = true; #else @@ -6573,16 +6500,6 @@ 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; } }; @@ -7238,44 +7155,6 @@ const LLRect LLViewerMenuHolderGL::getMenuRect() const return LLRect(0, getRect().getHeight() - MENU_BAR_HEIGHT, getRect().getWidth(), STATUS_BAR_HEIGHT); } -void handle_save_to_xml(void*) -{ - LLFloater* frontmost = gFloaterView->getFrontmost(); - if (!frontmost) - { - LLNotificationsUtil::add("NoFrontmostFloater"); - return; - } - - std::string default_name = "floater_"; - default_name += frontmost->getTitle(); - default_name += ".xml"; - - LLStringUtil::toLower(default_name); - LLStringUtil::replaceChar(default_name, ' ', '_'); - LLStringUtil::replaceChar(default_name, '/', '_'); - LLStringUtil::replaceChar(default_name, ':', '_'); - LLStringUtil::replaceChar(default_name, '"', '_'); - - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getSaveFile(LLFilePicker::FFSAVE_XML, default_name)) - { - std::string filename = picker.getFirstFile(); - LLUICtrlFactory::getInstance()->saveToXML(frontmost, filename); - } -} - -void handle_load_from_xml(void*) -{ - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getOpenFile(LLFilePicker::FFLOAD_XML)) - { - std::string filename = picker.getFirstFile(); - LLFloater* floater = new LLFloater(LLSD()); - LLUICtrlFactory::getInstance()->buildFloater(floater, filename, NULL); - } -} - void handle_web_browser_test(const LLSD& param) { std::string url = param.asString(); @@ -7729,6 +7608,16 @@ class LLWorldToggleCameraControls : public view_listener_t } }; +void handle_flush_name_caches() +{ + // Toggle display names on and off to flush + bool use_display_names = LLAvatarNameCache::useDisplayNames(); + LLAvatarNameCache::setUseDisplayNames(!use_display_names); + LLAvatarNameCache::setUseDisplayNames(use_display_names); + + if (gCacheName) gCacheName->clear(); +} + class LLUploadCostCalculator : public view_listener_t { std::string mCostStr; @@ -7750,6 +7639,18 @@ public: } }; +class LLToggleUIHints : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + bool ui_hints_enabled = gSavedSettings.getBOOL("EnableUIHints"); + // toggle + ui_hints_enabled = !ui_hints_enabled; + gSavedSettings.setBOOL("EnableUIHints", ui_hints_enabled); + return true; + } +}; + void LLUploadCostCalculator::calculateCost() { S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); @@ -7894,6 +7795,9 @@ void initialize_menus() view_listener_t::addMenu(new LLViewCheckRenderType(), "View.CheckRenderType"); view_listener_t::addMenu(new LLViewCheckHUDAttachments(), "View.CheckHUDAttachments"); + // Me > Movement + view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); + // World menu commit.add("World.Chat", boost::bind(&handle_chat, (void*)NULL)); view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun"); @@ -7960,15 +7864,13 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedToggleConsole(), "Advanced.ToggleConsole"); view_listener_t::addMenu(new LLAdvancedCheckConsole(), "Advanced.CheckConsole"); view_listener_t::addMenu(new LLAdvancedDumpInfoToConsole(), "Advanced.DumpInfoToConsole"); + // Advanced > HUD Info view_listener_t::addMenu(new LLAdvancedToggleHUDInfo(), "Advanced.ToggleHUDInfo"); view_listener_t::addMenu(new LLAdvancedCheckHUDInfo(), "Advanced.CheckHUDInfo"); // Advanced Other Settings view_listener_t::addMenu(new LLAdvancedClearGroupCache(), "Advanced.ClearGroupCache"); - - // Advanced > Shortcuts - view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); // Advanced > Render > Types view_listener_t::addMenu(new LLAdvancedToggleRenderType(), "Advanced.ToggleRenderType"); @@ -8038,11 +7940,10 @@ void initialize_menus() // Advanced > XUI commit.add("Advanced.ReloadColorSettings", boost::bind(&LLUIColorTable::loadFromSettings, LLUIColorTable::getInstance())); - view_listener_t::addMenu(new LLAdvancedLoadUIFromXML(), "Advanced.LoadUIFromXML"); - view_listener_t::addMenu(new LLAdvancedSaveUIToXML(), "Advanced.SaveUIToXML"); view_listener_t::addMenu(new LLAdvancedToggleXUINames(), "Advanced.ToggleXUINames"); view_listener_t::addMenu(new LLAdvancedCheckXUINames(), "Advanced.CheckXUINames"); view_listener_t::addMenu(new LLAdvancedSendTestIms(), "Advanced.SendTestIMs"); + commit.add("Advanced.FlushNameCaches", boost::bind(&handle_flush_name_caches)); // Advanced > Character > Grab Baked Texture view_listener_t::addMenu(new LLAdvancedGrabBakedTexture(), "Advanced.GrabBakedTexture"); @@ -8099,6 +8000,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAdvancedCheckShowObjectUpdates(), "Advanced.CheckShowObjectUpdates"); view_listener_t::addMenu(new LLAdvancedCompressImage(), "Advanced.CompressImage"); view_listener_t::addMenu(new LLAdvancedShowDebugSettings(), "Advanced.ShowDebugSettings"); + view_listener_t::addMenu(new LLAdvancedEnableViewAdminOptions(), "Advanced.EnableViewAdminOptions"); view_listener_t::addMenu(new LLAdvancedToggleViewAdminOptions(), "Advanced.ToggleViewAdminOptions"); view_listener_t::addMenu(new LLAdvancedCheckViewAdminOptions(), "Advanced.CheckViewAdminOptions"); view_listener_t::addMenu(new LLAdvancedRequestAdminStatus(), "Advanced.RequestAdminStatus"); @@ -8143,7 +8045,6 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarDebug(), "Avatar.Debug"); view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug"); view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup"); - view_listener_t::addMenu(new LLAvatarGiveCard(), "Avatar.GiveCard"); commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD())); view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM"); view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call"); @@ -8230,4 +8131,5 @@ void initialize_menus() view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected"); view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono"); + view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); } diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 14e0d49088..5cbd5ffa0b 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -28,15 +28,18 @@ #include "llviewermessage.h" #include "boost/lexical_cast.hpp" +// Linden libraries #include "llanimationstates.h" #include "llaudioengine.h" #include "llavataractions.h" +#include "llavatarnamecache.h" // IDEVO HACK #include "lscript_byteformat.h" #include "lleconomy.h" #include "lleventtimer.h" #include "llfloaterreg.h" #include "llfollowcamparams.h" #include "llinventorydefines.h" +#include "lllslconstants.h" #include "llregionhandle.h" #include "llsdserialize.h" #include "llteleportflags.h" @@ -50,6 +53,7 @@ #include "llagentcamera.h" #include "llcallingcard.h" #include "llbuycurrencyhtml.h" +#include "llfirstuse.h" #include "llfloaterbuyland.h" #include "llfloaterland.h" #include "llfloaterregioninfo.h" @@ -79,6 +83,7 @@ #include "lltrans.h" #include "lltranslate.h" #include "llviewerfoldertype.h" +#include "llvoavatar.h" // IDEVO HACK #include "lluri.h" #include "llviewergenericmessage.h" #include "llviewermenu.h" @@ -128,6 +133,7 @@ extern BOOL gDebugClicks; // function prototypes bool check_offer_throttle(const std::string& from_name, bool check_only); +static void process_money_balance_reply_extended(LLMessageSystem* msg); //inventory offer throttle globals LLFrameTimer gThrottleTimer; @@ -932,6 +938,15 @@ protected: //one global instance to bind them LLOpenTaskOffer* gNewInventoryObserver=NULL; +class LLNewInventoryHintObserver : public LLInventoryAddedObserver +{ +protected: + /*virtual*/ void done() + { + LLFirstUse::newInventory(); + } +}; + void start_new_inventory_observer() { if (!gNewInventoryObserver) //task offer observer @@ -947,6 +962,8 @@ void start_new_inventory_observer() gInventoryMoveObserver = new LLViewerInventoryMoveFromWorldObserver; gInventory.addObserver(gInventoryMoveObserver); } + + gInventory.addObserver(new LLNewInventoryHintObserver()); } class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver @@ -1183,7 +1200,6 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false !(asset_type == LLAssetType::AT_CALLINGCARD) && // don't open if it's a calling card - !(item && (item->getInventoryType() == LLInventoryType::IT_ATTACHMENT)) && // don't open if it's an item that's an attachment !from_name.empty(); // don't open if it's not from anyone. LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); if(active_panel) @@ -1225,28 +1241,26 @@ bool highlight_offered_object(const LLUUID& obj_id) } void inventory_offer_mute_callback(const LLUUID& blocked_id, - const std::string& first_name, - const std::string& last_name, - BOOL is_group, boost::shared_ptr<LLNotificationResponderInterface> offer_ptr) + const std::string& full_name, + bool is_group, + boost::shared_ptr<LLNotificationResponderInterface> offer_ptr) { LLOfferInfo* offer = dynamic_cast<LLOfferInfo*>(offer_ptr.get()); - std::string from_name; + + std::string from_name = full_name; LLMute::EType type; if (is_group) { type = LLMute::GROUP; - from_name = first_name; } else if(offer && offer->mFromObject) { //we have to block object by name because blocked_id is an id of owner type = LLMute::BY_NAME; - from_name = offer->mFromName; } else { type = LLMute::AGENT; - from_name = first_name + " " + last_name; } // id should be null for BY_NAME mute, see LLMuteList::add for details @@ -1424,7 +1438,7 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& llassert(notification_ptr != NULL); if (notification_ptr != NULL) { - gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4, notification_ptr->getResponderPtr())); + gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,notification_ptr->getResponderPtr())); } } @@ -1497,7 +1511,12 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& // MUTE falls through to decline case IOR_DECLINE: { - log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; + { + LLStringUtil::format_map_t log_message_args; + log_message_args["DESC"] = mDesc; + log_message_args["NAME"] = mFromName; + log_message = LLTrans::getString("InvOfferDecline", log_message_args); + } chat.mText = log_message; if( LLMuteList::getInstance()->isMuted(mFromID ) && ! LLMuteList::getInstance()->isLinden(mFromName) ) // muting for SL-42269 { @@ -1564,7 +1583,7 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const llassert(notification_ptr != NULL); if (notification_ptr != NULL) { - gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4, notification_ptr->getResponderPtr())); + gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,notification_ptr->getResponderPtr())); } } @@ -1613,12 +1632,12 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const } else { - std::string first_name, last_name; - if (gCacheName->getName(mFromID, first_name, last_name)) + std::string full_name; + if (gCacheName->getFullName(mFromID, full_name)) { from_string = LLTrans::getString("InvOfferAnObjectNamed") + " "+ LLTrans::getString("'") + mFromName - + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + first_name + " " + last_name; - chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + first_name + " " + last_name; + + LLTrans::getString("'")+" " + LLTrans::getString("InvOfferOwnedBy") + full_name; + chatHistory_string = mFromName + " " + LLTrans::getString("InvOfferOwnedBy") + " " + full_name; } else { @@ -1696,8 +1715,12 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const msg->addBinaryDataFast(_PREHASH_BinaryBucket, EMPTY_BINARY_BUCKET, EMPTY_BINARY_BUCKET_SIZE); // send the message msg->sendReliable(mHost); - - log_message = LLTrans::getString("InvOfferYouDecline") + " " + mDesc + " " + LLTrans::getString("InvOfferFrom") + " " + mFromName +"."; + { + LLStringUtil::format_map_t log_message_args; + log_message_args["DESC"] = mDesc; + log_message_args["NAME"] = mFromName; + log_message = LLTrans::getString("InvOfferDecline", log_message_args); + } LLSD args; args["MESSAGE"] = log_message; LLNotificationsUtil::add("SystemMessage", args); @@ -1822,7 +1845,14 @@ void inventory_offer_handler(LLOfferInfo* info) payload["give_inventory_notification"] = FALSE; args["OBJECTFROMNAME"] = info->mFromName; args["NAME"] = info->mFromName; - args["NAME_SLURL"] = LLSLURL("agent", info->mFromID, "about").getSLURLString(); + if (info->mFromGroup) + { + args["NAME_SLURL"] = LLSLURL("group", info->mFromID, "about").getSLURLString(); + } + else + { + args["NAME_SLURL"] = LLSLURL("agent", info->mFromID, "about").getSLURLString(); + } std::string verb = "select?name=" + LLURI::escape(msg); args["ITEM_SLURL"] = LLSLURL("inventory", info->mObjectID, verb.c_str()).getSLURLString(); @@ -1873,6 +1903,8 @@ void inventory_offer_handler(LLOfferInfo* info) LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false); } } + + LLFirstUse::newInventory(); } bool lure_callback(const LLSD& notification, const LLSD& response) @@ -1942,7 +1974,6 @@ protected: void modifyNotificationParams() { LLSD payload = mParams.payload; - payload["SESSION_NAME"] = mName; mParams.payload = payload; } }; @@ -2005,6 +2036,99 @@ static bool parse_lure_bucket(const std::string& bucket, return true; } +// Strip out "Resident" for display, but only if the message came from a user +// (rather than a script) +static std::string clean_name_from_im(const std::string& name, EInstantMessage type) +{ + switch(type) + { + case IM_NOTHING_SPECIAL: + case IM_MESSAGEBOX: + case IM_GROUP_INVITATION: + case IM_INVENTORY_OFFERED: + case IM_INVENTORY_ACCEPTED: + case IM_INVENTORY_DECLINED: + case IM_GROUP_VOTE: + case IM_GROUP_MESSAGE_DEPRECATED: + //IM_TASK_INVENTORY_OFFERED + //IM_TASK_INVENTORY_ACCEPTED + //IM_TASK_INVENTORY_DECLINED + case IM_NEW_USER_DEFAULT: + case IM_SESSION_INVITE: + case IM_SESSION_P2P_INVITE: + case IM_SESSION_GROUP_START: + case IM_SESSION_CONFERENCE_START: + case IM_SESSION_SEND: + case IM_SESSION_LEAVE: + //IM_FROM_TASK + case IM_BUSY_AUTO_RESPONSE: + case IM_CONSOLE_AND_CHAT_HISTORY: + case IM_LURE_USER: + case IM_LURE_ACCEPTED: + case IM_LURE_DECLINED: + case IM_GODLIKE_LURE_USER: + case IM_YET_TO_BE_USED: + case IM_GROUP_ELECTION_DEPRECATED: + //IM_GOTO_URL + //IM_FROM_TASK_AS_ALERT + case IM_GROUP_NOTICE: + case IM_GROUP_NOTICE_INVENTORY_ACCEPTED: + case IM_GROUP_NOTICE_INVENTORY_DECLINED: + case IM_GROUP_INVITATION_ACCEPT: + case IM_GROUP_INVITATION_DECLINE: + case IM_GROUP_NOTICE_REQUESTED: + case IM_FRIENDSHIP_OFFERED: + case IM_FRIENDSHIP_ACCEPTED: + case IM_FRIENDSHIP_DECLINED_DEPRECATED: + //IM_TYPING_START + //IM_TYPING_STOP + return LLCacheName::cleanFullName(name); + default: + return name; + } +} + +static std::string clean_name_from_task_im(const std::string& msg, + BOOL from_group) +{ + boost::smatch match; + static const boost::regex returned_exp( + "(.*been returned to your inventory lost and found folder by )(.+)( (from|near).*)"); + if (boost::regex_match(msg, match, returned_exp)) + { + // match objects are 1-based for groups + std::string final = match[1].str(); + std::string name = match[2].str(); + // Don't try to clean up group names + if (!from_group) + { + if (LLAvatarNameCache::useDisplayNames()) + { + // ...just convert to username + final += LLCacheName::buildUsername(name); + } + else + { + // ...strip out legacy "Resident" name + final += LLCacheName::cleanFullName(name); + } + } + final += match[3].str(); + return final; + } + return msg; +} + +void notification_display_name_callback(const LLUUID& id, + const LLAvatarName& av_name, + const std::string& name, + LLSD& substitutions, + const LLSD& payload) +{ + substitutions["NAME"] = av_name.mDisplayName; + LLNotificationsUtil::add(name, substitutions, payload); +} + class LLPostponedIMSystemTipNotification: public LLPostponedNotification { protected: @@ -2015,8 +2139,28 @@ protected: payload["SESSION_NAME"] = mName; mParams.payload = payload; } + }; +// Callback for name resolution of a god/estate message +void god_message_name_cb(const LLAvatarName& av_name, LLChat chat, std::string message) +{ + LLSD args; + args["NAME"] = av_name.getCompleteName(); + args["MESSAGE"] = message; + LLNotificationsUtil::add("GodMessage", args); + + // Treat like a system message and put in chat history. + chat.mText = av_name.getCompleteName() + ": " + message; + + LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); + if(nearby_chat) + { + nearby_chat->addMessage(chat); + } + +} + void process_improved_im(LLMessageSystem *msg, void **user_data) { if (gNoRender) @@ -2064,6 +2208,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { name = LLTrans::getString("Unnamed"); } + // IDEVO convert new-style "Resident" names for display + name = clean_name_from_im(name, dialog); BOOL is_busy = gAgent.getBusy(); BOOL is_muted = LLMuteList::getInstance()->isMuted(from_id, name, LLMute::flagTextChat); @@ -2093,7 +2239,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) { case IM_CONSOLE_AND_CHAT_HISTORY: args["MESSAGE"] = message; - args["NAME"] = name; payload["from_id"] = from_id; params.name = "IMSystemMessageTip"; @@ -2163,21 +2308,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } else if (to_id.isNull()) { - // Message to everyone from GOD - args["NAME"] = name; - args["MESSAGE"] = message; - LLNotificationsUtil::add("GodMessage", args); - - // Treat like a system message and put in chat history. - // Claim to be from a local agent so it doesn't go into - // console. - chat.mText = name + separator_string + message; - - LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD()); - if(nearby_chat) - { - nearby_chat->addMessage(chat); - } + // Message to everyone from GOD, look up the fullname since + // server always slams name to legacy names + LLAvatarNameCache::get(from_id, boost::bind(god_message_name_cb, _2, chat, message)); } else { @@ -2464,7 +2597,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) case IM_INVENTORY_ACCEPTED: { - args["NAME"] = name; + args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();; LLSD payload; payload["from_id"] = from_id; LLNotificationsUtil::add("InventoryAccepted", args, payload); @@ -2472,7 +2605,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) } case IM_INVENTORY_DECLINED: { - args["NAME"] = name; + args["NAME"] = LLSLURL("agent", from_id, "completename").getSLURLString();; LLSD payload; payload["from_id"] = from_id; LLNotificationsUtil::add("InventoryDeclined", args, payload); @@ -2564,6 +2697,9 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) chat.mSourceType = CHAT_SOURCE_SYSTEM; } + // IDEVO Some messages have embedded resident names + message = clean_name_from_task_im(message, from_group); + LLSD query_string; query_string["owner"] = from_id; query_string["slurl"] = location; @@ -2772,7 +2908,12 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) args["NAME"] = name; LLSD payload; payload["from_id"] = from_id; - LLNotificationsUtil::add("FriendshipAccepted", args, payload); + LLAvatarNameCache::get(from_id, boost::bind(¬ification_display_name_callback, + _1, + _2, + "FriendshipAccepted", + args, + payload)); } break; @@ -2876,9 +3017,8 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) LLNameValue* nvlast = source->getNVPair("LastName"); if (nvfirst && nvlast) { - args["FIRST"] = nvfirst->getString(); - args["LAST"] = nvlast->getString(); - source_name = std::string(nvfirst->getString()) + " " + nvlast->getString(); + source_name = LLCacheName::buildFullName( + nvfirst->getString(), nvlast->getString()); } } @@ -2892,6 +3032,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) } else { + args["NAME"] = source_name; LLNotificationsUtil::add("OfferCallingCard", args, payload); } } @@ -2955,7 +3096,6 @@ private: std::string m_origMesg; LLSD m_toastArgs; }; - void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) { LLChat chat; @@ -2971,7 +3111,6 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) LLViewerObject* chatter; msg->getString("ChatData", "FromName", from_name); - chat.mFromName = from_name; msg->getUUID("ChatData", "SourceID", from_id); chat.mFromID = from_id; @@ -2990,6 +3129,27 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) chat.mTime = LLFrameTimer::getElapsedSeconds(); + // IDEVO Correct for new-style "Resident" names + if (chat.mSourceType == CHAT_SOURCE_AGENT) + { + // I don't know if it's OK to change this here, if + // anything downstream does lookups by name, for instance + + LLAvatarName av_name; + if (LLAvatarNameCache::get(from_id, &av_name)) + { + chat.mFromName = av_name.mDisplayName; + } + else + { + chat.mFromName = LLCacheName::cleanFullName(from_name); + } + } + else + { + chat.mFromName = from_name; + } + BOOL is_busy = gAgent.getBusy(); BOOL is_muted = FALSE; @@ -3708,6 +3868,7 @@ void process_crossed_region(LLMessageSystem* msg, void**) return; } LL_INFOS("Messaging") << "process_crossed_region()" << LL_ENDL; + gAgentAvatarp->resetRegionCrossingTimer(); U32 sim_ip; msg->getIPAddrFast(_PREHASH_RegionData, _PREHASH_SimIP, sim_ip); @@ -4213,14 +4374,12 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data) // Don't play sounds from a region with maturity above current agent maturity LLVector3d pos_global = objectp->getPositionGlobal(); - if( !gAgent.canAccessMaturityAtGlobal( pos_global ) ) + if (gAgent.canAccessMaturityAtGlobal(pos_global)) { - return; - } - // Add audioData starts a transfer internally. sourcep->addAudioData(datap, FALSE); } +} void process_attached_sound(LLMessageSystem *msg, void **user_data) { @@ -4873,168 +5032,287 @@ void process_time_dilation(LLMessageSystem *msg, void **user_data) */ - void process_money_balance_reply( LLMessageSystem* msg, void** ) { S32 balance = 0; S32 credit = 0; S32 committed = 0; std::string desc; + LLUUID tid; + msg->getUUID("MoneyData", "TransactionID", tid); msg->getS32("MoneyData", "MoneyBalance", balance); msg->getS32("MoneyData", "SquareMetersCredit", credit); msg->getS32("MoneyData", "SquareMetersCommitted", committed); msg->getStringFast(_PREHASH_MoneyData, _PREHASH_Description, desc); LL_INFOS("Messaging") << "L$, credit, committed: " << balance << " " << credit << " " << committed << LL_ENDL; - + if (gStatusBar) { - // S32 old_balance = gStatusBar->getBalance(); - - // This is an update, not the first transmission of balance - /* if (old_balance != 0) - { - // this is actually an update - if (balance > old_balance) - { - LLFirstUse::useBalanceIncrease(balance - old_balance); - } - else if (balance < old_balance) - { - LLFirstUse::useBalanceDecrease(balance - old_balance); - } - } - */ gStatusBar->setBalance(balance); gStatusBar->setLandCredit(credit); gStatusBar->setLandCommitted(committed); } - LLUUID tid; - msg->getUUID("MoneyData", "TransactionID", tid); + if (desc.empty() + || !gSavedSettings.getBOOL("NotifyMoneyChange")) + { + // ...nothing to display + return; + } + + // Suppress duplicate messages about the same transaction static std::deque<LLUUID> recent; - if(!desc.empty() && gSavedSettings.getBOOL("NotifyMoneyChange") - && (std::find(recent.rbegin(), recent.rend(), tid) == recent.rend())) + if (std::find(recent.rbegin(), recent.rend(), tid) != recent.rend()) { - // Make the user confirm the transaction, since they might - // have missed something during an event. - // *TODO: Translate - LLSD args; - + return; + } - // this is a marker to retrieve avatar name from server message: - // "<avatar name> paid you L$" - const std::string marker = "paid you L$"; + // Once the 'recent' container gets large enough, chop some + // off the beginning. + const U32 MAX_LOOKBACK = 30; + const S32 POP_FRONT_SIZE = 12; + if(recent.size() > MAX_LOOKBACK) + { + LL_DEBUGS("Messaging") << "Removing oldest transaction records" << LL_ENDL; + recent.erase(recent.begin(), recent.begin() + POP_FRONT_SIZE); + } + //LL_DEBUGS("Messaging") << "Pushing back transaction " << tid << LL_ENDL; + recent.push_back(tid); + if (msg->has("TransactionInfo")) + { + // ...message has extended info for localization + process_money_balance_reply_extended(msg); + } + else + { + // Only old dev grids will not supply the TransactionInfo block, + // so we can just use the hard-coded English string. + LLSD args; args["MESSAGE"] = desc; + LLNotificationsUtil::add("SystemMessage", args); + } +} + +static std::string reason_from_transaction_type(S32 transaction_type, + const std::string& item_desc) +{ + // *NOTE: The keys for the reason strings are unusual because + // an earlier version of the code used English language strings + // extracted from hard-coded server English descriptions. + // Keeping them so we don't have to re-localize them. + switch (transaction_type) + { + case TRANS_OBJECT_SALE: + { + LLStringUtil::format_map_t arg; + arg["ITEM"] = item_desc; + return LLTrans::getString("for item", arg); + } + case TRANS_LAND_SALE: + return LLTrans::getString("for a parcel of land"); + + case TRANS_LAND_PASS_SALE: + return LLTrans::getString("for a land access pass"); + + case TRANS_GROUP_LAND_DEED: + return LLTrans::getString("for deeding land"); + + case TRANS_GROUP_CREATE: + return LLTrans::getString("to create a group"); + + case TRANS_GROUP_JOIN: + return LLTrans::getString("to join a group"); + + case TRANS_UPLOAD_CHARGE: + return LLTrans::getString("to upload"); - // extract avatar name from system message - S32 marker_pos = desc.find(marker, 0); + case TRANS_CLASSIFIED_CHARGE: + return LLTrans::getString("to publish a classified ad"); + + // These have no reason to display, but are expected and should not + // generate warnings + case TRANS_GIFT: + case TRANS_PAY_OBJECT: + case TRANS_OBJECT_PAYS: + return std::string(); - std::string base_name = desc.substr(0, marker_pos); - - std::string name = base_name; - LLStringUtil::trim(name); + default: + llwarns << "Unknown transaction type " + << transaction_type << llendl; + return std::string(); + } +} - // if name extracted and name cache contains avatar id send loggable notification - LLUUID from_id; - if(name.size() > 0 && gCacheName->getUUID(name, from_id)) - { - //description always comes not localized. lets fix this +static void money_balance_group_notify(const LLUUID& group_id, + const std::string& name, + bool is_group, + std::string notification, + LLSD args, + LLSD payload) +{ + // Message uses name SLURLs, don't actually have to substitute in + // the name. We're just making sure it's available. + // Notification is either PaymentReceived or PaymentSent + LLNotificationsUtil::add(notification, args, payload); +} - //ammount paid - std::string ammount = desc.substr(marker_pos + marker.length(),desc.length() - marker.length() - marker_pos); - - //reform description - LLStringUtil::format_map_t str_args; - str_args["NAME"] = base_name; - str_args["AMOUNT"] = ammount; - std::string new_description = LLTrans::getString("paid_you_ldollars", str_args); +static void money_balance_avatar_notify(const LLUUID& agent_id, + const LLAvatarName& av_name, + std::string notification, + LLSD args, + LLSD payload) +{ + // Message uses name SLURLs, don't actually have to substitute in + // the name. We're just making sure it's available. + // Notification is either PaymentReceived or PaymentSent + LLNotificationsUtil::add(notification, args, payload); +} +static void process_money_balance_reply_extended(LLMessageSystem* msg) +{ + // Added in server 1.40 and viewer 2.1, support for localization + // and agent ids for name lookup. + S32 transaction_type = 0; + LLUUID source_id; + BOOL is_source_group = FALSE; + LLUUID dest_id; + BOOL is_dest_group = FALSE; + S32 amount = 0; + std::string item_description; + + msg->getS32("TransactionInfo", "TransactionType", transaction_type); + msg->getUUID("TransactionInfo", "SourceID", source_id); + msg->getBOOL("TransactionInfo", "IsSourceGroup", is_source_group); + msg->getUUID("TransactionInfo", "DestID", dest_id); + msg->getBOOL("TransactionInfo", "IsDestGroup", is_dest_group); + msg->getS32("TransactionInfo", "Amount", amount); + msg->getString("TransactionInfo", "ItemDescription", item_description); + LL_INFOS("Money") << "MoneyBalanceReply source " << source_id + << " dest " << dest_id + << " type " << transaction_type + << " item " << item_description << LL_ENDL; + + if (source_id.isNull() && dest_id.isNull()) + { + // this is a pure balance update, no notification required + return; + } - args["MESSAGE"] = new_description; - args["NAME"] = name; - LLSD payload; - payload["from_id"] = from_id; - LLNotificationsUtil::add("PaymentRecived", args, payload); + std::string source_slurl; + if (is_source_group) + { + source_slurl = + LLSLURL( "group", source_id, "inspect").getSLURLString(); + } + else + { + source_slurl = + LLSLURL( "agent", source_id, "completename").getSLURLString(); + } + + std::string dest_slurl; + if (is_dest_group) + { + dest_slurl = + LLSLURL( "group", dest_id, "inspect").getSLURLString(); + } + else + { + dest_slurl = + LLSLURL( "agent", dest_id, "completename").getSLURLString(); + } + + std::string reason = + reason_from_transaction_type(transaction_type, item_description); + + LLStringUtil::format_map_t args; + args["REASON"] = reason; // could be empty + args["AMOUNT"] = llformat("%d", amount); + + // Need to delay until name looked up, so need to know whether or not + // is group + bool is_name_group = false; + LLUUID name_id; + std::string message; + std::string notification; + LLSD final_args; + LLSD payload; + + bool you_paid_someone = (source_id == gAgentID); + if (you_paid_someone) + { + args["NAME"] = dest_slurl; + is_name_group = is_dest_group; + name_id = dest_id; + if (!reason.empty()) + { + if (dest_id.notNull()) + { + message = LLTrans::getString("you_paid_ldollars", args); + } + else + { + // transaction fee to the system, eg, to create a group + message = LLTrans::getString("you_paid_ldollars_no_name", args); + } } - //AD *HACK: Parsing incoming string to localize messages that come from server! EXT-5986 - // It's only a temporarily and ineffective measure. It doesn't affect performance much - // because we get here only for specific type of messages, but anyway it is not right to do it! - // *TODO: Server-side changes should be made and this code removed. else { - if(desc.find("You paid")==0) + if (dest_id.notNull()) { - // Regular expression for message parsing- change it in case of server-side changes. - // Each set of parenthesis will later be used to find arguments of message we generate - // in the end of this if- (.*) gives us name of money receiver, (\\d+)-amount of money we pay - // and ([^$]*)- reason of payment - boost::regex expr("You paid (?:.{0}|(.*) )L\\$(\\d+)\\s?([^$]*)\\."); - boost::match_results <std::string::const_iterator> matches; - if(boost::regex_match(desc, matches, expr)) - { - // Name of full localizable notification string - // there are four types of this string- with name of receiver and reason of payment, - // without name and without reason (both may also be absent simultaneously). - // example of string without name - You paid L$100 to create a group. - // example of string without reason - You paid Smdby Linden L$100. - // example of string with reason and name - You paid Smbdy Linden L$100 for a land access pass. - // example of string with no info - You paid L$50. - std::string line = "you_paid_ldollars_no_name"; - - // arguments of string which will be in notification - LLStringUtil::format_map_t str_args; - - // extracting amount of money paid (without L$ symbols). It is always present. - str_args["[AMOUNT]"] = std::string(matches[2]); - - // extracting name of person/group you are paying (it may be absent) - std::string name = std::string(matches[1]); - if(!name.empty()) - { - str_args["[NAME]"] = name; - line = "you_paid_ldollars"; - } - - // extracting reason of payment (it may be absent) - std::string reason = std::string(matches[3]); - if (reason.empty()) - { - line = name.empty() ? "you_paid_ldollars_no_info" : "you_paid_ldollars_no_reason"; - } - else - { - std::string localized_reason; - // if we haven't found localized string for reason of payment leave it as it was - str_args["[REASON]"] = LLTrans::findString(localized_reason, reason) ? localized_reason : reason; - } - - // forming final message string by retrieving localized version from xml - // and applying previously found arguments - line = LLTrans::getString(line, str_args); - args["MESSAGE"] = line; - } + message = LLTrans::getString("you_paid_ldollars_no_reason", args); + } + else + { + // no target, no reason, you just paid money + message = LLTrans::getString("you_paid_ldollars_no_info", args); } - - LLNotificationsUtil::add("SystemMessage", args); } - - // Once the 'recent' container gets large enough, chop some - // off the beginning. - const U32 MAX_LOOKBACK = 30; - const S32 POP_FRONT_SIZE = 12; - if(recent.size() > MAX_LOOKBACK) + final_args["MESSAGE"] = message; + notification = "PaymentSent"; + } + else { + // ...someone paid you + args["NAME"] = source_slurl; + is_name_group = is_source_group; + name_id = source_id; + if (!reason.empty()) { - LL_DEBUGS("Messaging") << "Removing oldest transaction records" << LL_ENDL; - recent.erase(recent.begin(), recent.begin() + POP_FRONT_SIZE); + message = LLTrans::getString("paid_you_ldollars", args); } - //LL_DEBUGS("Messaging") << "Pushing back transaction " << tid << LL_ENDL; - recent.push_back(tid); + else { + message = LLTrans::getString("paid_you_ldollars_no_reason", args); + } + final_args["MESSAGE"] = message; + + // make notification loggable + payload["from_id"] = source_id; + notification = "PaymentReceived"; + } + + // Despite using SLURLs, wait until the name is available before + // showing the notification, otherwise the UI layout is strange and + // the user sees a "Loading..." message + if (is_name_group) + { + gCacheName->getGroup(name_id, + boost::bind(&money_balance_group_notify, + _1, _2, _3, + notification, final_args, payload)); + } + else { + LLAvatarNameCache::get(name_id, + boost::bind(&money_balance_avatar_notify, + _1, _2, + notification, final_args, payload)); } } + + bool handle_special_notification_callback(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -5276,7 +5554,7 @@ void handle_show_mean_events(void *) //LLFloaterBump::showInstance(); } -void mean_name_callback(const LLUUID &id, const std::string& first, const std::string& last, BOOL always_false) +void mean_name_callback(const LLUUID &id, const std::string& full_name, bool is_group) { if (gNoRender) { @@ -5298,8 +5576,7 @@ void mean_name_callback(const LLUUID &id, const std::string& first, const std::s LLMeanCollisionData *mcd = *iter; if (mcd->mPerp == id) { - mcd->mFirstName = first; - mcd->mLastName = last; + mcd->mFullName = full_name; } } } @@ -5353,8 +5630,7 @@ void process_mean_collision_alert_message(LLMessageSystem *msgsystem, void **use { LLMeanCollisionData *mcd = new LLMeanCollisionData(gAgentID, perp, time, type, mag); gMeanCollisionList.push_front(mcd); - const BOOL is_group = FALSE; - gCacheName->get(perp, is_group, &mean_name_callback); + gCacheName->get(perp, false, boost::bind(&mean_name_callback, _1, _2, _3)); } } } @@ -5576,7 +5852,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data) // so we'll reuse the same namespace for both throttle types. std::string throttle_name = owner_name; std::string self_name; - LLAgentUI::buildName( self_name ); + LLAgentUI::buildFullname( self_name ); if( owner_name == self_name ) { throttle_name = taskid.getString(); @@ -5612,7 +5888,7 @@ void process_script_question(LLMessageSystem *msg, void **user_data) S32 count = 0; LLSD args; args["OBJECTNAME"] = object_name; - args["NAME"] = owner_name; + args["NAME"] = LLCacheName::cleanFullName(owner_name); // check the received permission flags against each permission for (S32 i = 0; i < SCRIPT_PERMISSION_EOF; i++) @@ -6018,15 +6294,14 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response) // Record the offer. { std::string target_name; - gCacheName->getFullName(target_id, target_name); + gCacheName->getFullName(target_id, target_name); // for im log filenames LLSD args; - args["TO_NAME"] = target_name; + args["TO_NAME"] = LLSLURL("agent", target_id, "displayname").getSLURLString();; LLSD payload; //*TODO please rewrite all keys to the same case, lower or upper payload["from_id"] = target_id; - payload["SESSION_NAME"] = target_name; payload["SUPPRESS_TOAST"] = true; LLNotificationsUtil::add("TeleportOfferSent", args, payload); } @@ -6162,8 +6437,22 @@ const char* SCRIPT_DIALOG_HEADER = "Script Dialog:\n"; bool callback_script_dialog(const LLSD& notification, const LLSD& response) { LLNotificationForm form(notification["form"]); - std::string button = LLNotification::getSelectedOptionName(response); - S32 button_idx = LLNotification::getSelectedOption(notification, response); + + std::string rtn_text; + S32 button_idx; + button_idx = LLNotification::getSelectedOption(notification, response); + if (response[TEXTBOX_MAGIC_TOKEN].isDefined()) + { + if (response[TEXTBOX_MAGIC_TOKEN].isString()) + rtn_text = response[TEXTBOX_MAGIC_TOKEN].asString(); + else + rtn_text.clear(); // bool marks empty string + } + else + { + rtn_text = LLNotification::getSelectedOptionName(response); + } + // Didn't click "Ignore" if (button_idx != -1) { @@ -6176,7 +6465,7 @@ bool callback_script_dialog(const LLSD& notification, const LLSD& response) msg->addUUID("ObjectID", notification["payload"]["object_id"].asUUID()); msg->addS32("ChatChannel", notification["payload"]["chat_channel"].asInteger()); msg->addS32("ButtonIndex", button_idx); - msg->addString("ButtonLabel", button); + msg->addString("ButtonLabel", rtn_text); msg->sendReliable(LLHost(notification["payload"]["sender"].asString())); } @@ -6240,8 +6529,7 @@ void process_script_dialog(LLMessageSystem* msg, void**) LLNotificationPtr notification; if (!first_name.empty()) { - args["FIRST"] = first_name; - args["LAST"] = last_name; + args["NAME"] = LLCacheName::buildFullName(first_name, last_name); notification = LLNotifications::instance().add( LLNotification::Params("ScriptDialog").substitutions(args).payload(payload).form_elements(form.asLLSD())); } @@ -6274,7 +6562,7 @@ static LLNotificationFunctorRegistration callback_load_url_reg("LoadWebPage", ca // We've got the name of the person who owns the object hurling the url. // Display confirmation dialog. -void callback_load_url_name(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +void callback_load_url_name(const LLUUID& id, const std::string& full_name, bool is_group) { std::vector<LLSD>::iterator it; for (it = gLoadUrlList.begin(); it != gLoadUrlList.end(); ) @@ -6287,11 +6575,11 @@ void callback_load_url_name(const LLUUID& id, const std::string& first, const st std::string owner_name; if (is_group) { - owner_name = first + LLTrans::getString("Group"); + owner_name = full_name + LLTrans::getString("Group"); } else { - owner_name = first + " " + last; + owner_name = full_name; } // For legacy name-only mutes. @@ -6351,7 +6639,8 @@ void process_load_url(LLMessageSystem* msg, void**) // Add to list of pending name lookups gLoadUrlList.push_back(payload); - gCacheName->get(owner_id, owner_is_group, &callback_load_url_name); + gCacheName->get(owner_id, owner_is_group, + boost::bind(&callback_load_url_name, _1, _2, _3)); } @@ -6441,7 +6730,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**) LLPanelLandCovenant::updateEstateOwnerName(owner_name); LLFloaterBuyLand::updateEstateOwnerName(owner_name); - LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); + LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile"); if (panel) { panel->updateEstateName(estate_name); @@ -6575,7 +6864,7 @@ void onCovenantLoadComplete(LLVFS *vfs, LLPanelLandCovenant::updateCovenantText(covenant_text); LLFloaterBuyLand::updateCovenantText(covenant_text, asset_uuid); - LLPanelPlaceProfile* panel = LLSideTray::getInstance()->findChild<LLPanelPlaceProfile>("panel_place_profile"); + LLPanelPlaceProfile* panel = LLSideTray::getInstance()->getPanel<LLPanelPlaceProfile>("panel_place_profile"); if (panel) { panel->updateCovenantText(covenant_text); diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp index 7f7c245717..b91e407c6d 100644 --- a/indra/newview/llviewernetwork.cpp +++ b/indra/newview/llviewernetwork.cpp @@ -304,7 +304,12 @@ void LLGridManager::initialize(const std::string& grid_file) addGrid(grid); } - gSavedSettings.getControl("CurrentGrid")->getSignal()->connect(boost::bind(&LLGridManager::updateIsInProductionGrid, this)); + LLControlVariablePtr grid_control = gSavedSettings.getControl("CurrentGrid"); + if (grid_control.notNull()) + { + grid_control->getSignal()->connect(boost::bind(&LLGridManager::updateIsInProductionGrid, this)); + } + // since above only triggers on changes, trigger the callback manually to initialize state updateIsInProductionGrid(); @@ -499,7 +504,8 @@ void LLGridManager::setGridChoice(const std::string& grid) addGrid(grid_data); } mGrid = grid; - gSavedSettings.setString("CurrentGrid", grid); + gSavedSettings.setString("CurrentGrid", grid); + updateIsInProductionGrid(); } std::string LLGridManager::getGridByLabel( const std::string &grid_label, bool case_sensitive) diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 741a9e6ec4..1804fac1b3 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -63,6 +63,7 @@ #include "llface.h" #include "llfloaterproperties.h" #include "llfollowcam.h" +#include "llhudtext.h" #include "llselectmgr.h" #include "llrendersphere.h" #include "lltooldraganddrop.h" @@ -102,8 +103,8 @@ //#define DEBUG_UPDATE_TYPE -BOOL gVelocityInterpolate = TRUE; -BOOL gPingInterpolate = TRUE; +BOOL LLViewerObject::sVelocityInterpolate = TRUE; +BOOL LLViewerObject::sPingInterpolate = TRUE; U32 LLViewerObject::sNumZombieObjects = 0; S32 LLViewerObject::sNumObjects = 0; @@ -114,6 +115,11 @@ S32 LLViewerObject::sAxisArrowLength(50); BOOL LLViewerObject::sPulseEnabled(FALSE); BOOL LLViewerObject::sUseSharedDrawables(FALSE); // TRUE +// sMaxUpdateInterpolationTime must be greater than sPhaseOutUpdateInterpolationTime +F64 LLViewerObject::sMaxUpdateInterpolationTime = 3.0; // For motion interpolation: after X seconds with no updates, don't predict object motion +F64 LLViewerObject::sPhaseOutUpdateInterpolationTime = 2.0; // For motion interpolation: after Y seconds with no updates, taper off motion prediction + + static LLFastTimer::DeclareTimer FTM_CREATE_OBJECT("Create Object"); // static @@ -167,8 +173,10 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco res = new LLVOSurfacePatch(id, pcode, regionp); break; case LL_VO_SKY: res = new LLVOSky(id, pcode, regionp); break; + case LL_VO_VOID_WATER: + res = new LLVOVoidWater(id, pcode, regionp); break; case LL_VO_WATER: - res = new LLVOWater(id, pcode, regionp); break; + res = new LLVOWater(id, pcode, regionp); break; case LL_VO_GROUND: res = new LLVOGround(id, pcode, regionp); break; case LL_VO_PART_GROUP: @@ -202,6 +210,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe mLastInterpUpdateSecs(0.f), mLastMessageUpdateSecs(0.f), mLatestRecvPacketID(0), + mCircuitPacketCount(0), mData(NULL), mAudioSourcep(NULL), mAudioGain(1.f), @@ -1092,7 +1101,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // alpha was flipped so that it zero encoded better coloru.mV[3] = 255 - coloru.mV[3]; mText->setColor(LLColor4(coloru)); - mText->setStringUTF8(temp_string); + mText->setString(temp_string); if (mDrawable.notNull()) { @@ -1484,7 +1493,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, dp->unpackBinaryDataFixed(coloru.mV, 4, "Color"); coloru.mV[3] = 255 - coloru.mV[3]; mText->setColor(LLColor4(coloru)); - mText->setStringUTF8(temp_string); + mText->setString(temp_string); setChanged(TEXTURE); } @@ -1838,7 +1847,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, new_rot.normQuat(); - if (gPingInterpolate) + if (sPingInterpolate) { LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); if (cdp) @@ -1859,6 +1868,8 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // // + // WTF? If we're going to skip this message, why are we + // doing all the parenting, etc above? U32 packet_id = mesgsys->getCurrentRecvPacketID(); if (packet_id < mLatestRecvPacketID && mLatestRecvPacketID - packet_id < 65536) @@ -1868,6 +1879,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, } mLatestRecvPacketID = packet_id; + mCircuitPacketCount = 0; // Set the change flags for scale if (new_scale != getScale()) @@ -1999,7 +2011,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, // U32 ping_delay = mesgsys->mCircuitInfo.getPingDelay(); mLastInterpUpdateSecs = LLFrameTimer::getElapsedSeconds(); - mLastMessageUpdateSecs = LLFrameTimer::getElapsedSeconds(); + mLastMessageUpdateSecs = mLastInterpUpdateSecs; if (mDrawable.notNull()) { // Don't clear invisibility flag on update if still orphaned! @@ -2026,6 +2038,8 @@ BOOL LLViewerObject::isActive() const return TRUE; } + + BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { static LLFastTimer::DeclareTimer ftm("Viewer Object"); @@ -2039,7 +2053,7 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) // CRO - don't velocity interp linked objects! // Leviathan - but DO velocity interp joints - if (!mStatic && gVelocityInterpolate && !isSelected()) + if (!mStatic && sVelocityInterpolate && !isSelected()) { // calculate dt from last update F32 dt_raw = (F32)(time - mLastInterpUpdateSecs); @@ -2129,33 +2143,8 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) return TRUE; } else - { - // linear motion - // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object - // updates represents the average velocity of the last timestep, rather than the final velocity. - // the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically - // - // There is a problem here if dt is negative. . . - - // *TODO: should also wrap linear accel/velocity in check - // to see if object is selected, instead of explicitly - // zeroing it out - LLVector3 accel = getAcceleration(); - LLVector3 vel = getVelocity(); - - if (!(accel.isExactlyZero() && vel.isExactlyZero())) - { - LLVector3 pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt; - - // region local - setPositionRegion(pos + getPositionRegion()); - setVelocity(vel + accel*dt); - - // for objects that are spinning but not translating, make sure to flag them as having moved - setChanged(MOVED | SILHOUETTE); - } - - mLastInterpUpdateSecs = time; + { // Move object based on it's velocity and rotation + interpolateLinearMotion(time, dt); } } @@ -2171,6 +2160,158 @@ BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) } +// Move an object due to idle-time viewer side updates by iterpolating motion +void LLViewerObject::interpolateLinearMotion(const F64 & time, const F32 & dt) +{ + // linear motion + // PHYSICS_TIMESTEP is used below to correct for the fact that the velocity in object + // updates represents the average velocity of the last timestep, rather than the final velocity. + // the time dilation above should guarantee that dt is never less than PHYSICS_TIMESTEP, theoretically + // + // *TODO: should also wrap linear accel/velocity in check + // to see if object is selected, instead of explicitly + // zeroing it out + + F64 time_since_last_update = time - mLastMessageUpdateSecs; + if (time_since_last_update <= 0.0 || dt <= 0.f) + { + return; + } + + LLVector3 accel = getAcceleration(); + LLVector3 vel = getVelocity(); + + if (sMaxUpdateInterpolationTime <= 0.0) + { // Old code path ... unbounded, simple interpolation + if (!(accel.isExactlyZero() && vel.isExactlyZero())) + { + LLVector3 pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt; + + // region local + setPositionRegion(pos + getPositionRegion()); + setVelocity(vel + accel*dt); + + // for objects that are spinning but not translating, make sure to flag them as having moved + setChanged(MOVED | SILHOUETTE); + } + } + else if (!accel.isExactlyZero() || !vel.isExactlyZero()) // object is moving + { // Object is moving, and hasn't been too long since we got an update from the server + + // Calculate predicted position and velocity + LLVector3 new_pos = (vel + (0.5f * (dt-PHYSICS_TIMESTEP)) * accel) * dt; + LLVector3 new_v = accel * dt; + + if (time_since_last_update > sPhaseOutUpdateInterpolationTime) + { // Haven't seen a viewer update in a while, check to see if the ciruit is still active + if (mRegionp) + { // The simulator will NOT send updates if the object continues normally on the path + // predicted by the velocity and the acceleration (often gravity) sent to the viewer + // So check to see if the circuit is blocked, which means the sim is likely in a long lag + LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit( mRegionp->getHost() ); + if (cdp) + { + if (!cdp->isAlive() || // Circuit is dead or blocked + cdp->isBlocked() || // or doesn't seem to be getting any packets + (mCircuitPacketCount > 0 && mCircuitPacketCount == cdp->getPacketsIn())) + { + // Start to reduce motion interpolation since we haven't seen a server update in a while + F64 time_since_last_interpolation = time - mLastInterpUpdateSecs; + F64 phase_out = 1.0; + if (time_since_last_update > sMaxUpdateInterpolationTime) + { // Past the time limit, so stop the object + phase_out = 0.0; + //llinfos << "Motion phase out to zero" << llendl; + + // Kill angular motion as well. Note - not adding this due to paranoia + // about stopping rotation for llTargetOmega objects and not having it restart + // setAngularVelocity(LLVector3::zero); + } + else if (mLastInterpUpdateSecs - mLastMessageUpdateSecs > sPhaseOutUpdateInterpolationTime) + { // Last update was already phased out a bit + phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / + (sMaxUpdateInterpolationTime - time_since_last_interpolation); + //llinfos << "Continuing motion phase out of " << (F32) phase_out << llendl; + } + else + { // Phase out from full value + phase_out = (sMaxUpdateInterpolationTime - time_since_last_update) / + (sMaxUpdateInterpolationTime - sPhaseOutUpdateInterpolationTime); + //llinfos << "Starting motion phase out of " << (F32) phase_out << llendl; + } + phase_out = llclamp(phase_out, 0.0, 1.0); + + new_pos = new_pos * ((F32) phase_out); + new_v = new_v * ((F32) phase_out); + } + + // Save current circuit packet count to see if it changes + mCircuitPacketCount = cdp->getPacketsIn(); + } + } + } + + new_pos = new_pos + getPositionRegion(); + new_v = new_v + vel; + + + // Clamp interpolated position to minimum underground and maximum region height + LLVector3d new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); + F32 min_height; + if (isAvatar()) + { // Make a better guess about AVs not going underground + min_height = LLWorld::getInstance()->resolveLandHeightGlobal(new_pos_global); + min_height += (0.5f * getScale().mV[VZ]); + } + else + { // This will put the object underground, but we can't tell if it will stop + // at ground level or not + min_height = LLWorld::getInstance()->getMinAllowedZ(this, new_pos_global); + } + + new_pos.mV[VZ] = llmax(min_height, new_pos.mV[VZ]); + new_pos.mV[VZ] = llmin(LLWorld::getInstance()->getRegionMaxHeight(), new_pos.mV[VZ]); + + // Check to see if it's going off the region + LLVector3 temp(new_pos); + if (temp.clamp(0.f, mRegionp->getWidth())) + { // Going off this region, so see if we might end up on another region + LLVector3d old_pos_global = mRegionp->getPosGlobalFromRegion(getPositionRegion()); + new_pos_global = mRegionp->getPosGlobalFromRegion(new_pos); // Re-fetch in case it got clipped above + + // Clip the positions to known regions + LLVector3d clip_pos_global = LLWorld::getInstance()->clipToVisibleRegions(old_pos_global, new_pos_global); + if (clip_pos_global != new_pos_global) + { // Was clipped, so this means we hit a edge where there is no region to enter + + //llinfos << "Hit empty region edge, clipped predicted position to " << mRegionp->getPosRegionFromGlobal(clip_pos_global) + // << " from " << new_pos << llendl; + new_pos = mRegionp->getPosRegionFromGlobal(clip_pos_global); + + // Stop motion and get server update for bouncing on the edge + new_v.clear(); + setAcceleration(LLVector3::zero); + } + else + { // Let predicted movement cross into another region + //llinfos << "Predicting region crossing to " << new_pos << llendl; + } + } + + // Set new position and velocity + setPositionRegion(new_pos); + setVelocity(new_v); + + // for objects that are spinning but not translating, make sure to flag them as having moved + setChanged(MOVED | SILHOUETTE); + } + + // Update the last time we did anything + mLastInterpUpdateSecs = time; +} + + + BOOL LLViewerObject::setData(const U8 *datap, const U32 data_size) { LLMemType mt(LLMemType::MTYPE_OBJECT); @@ -4150,7 +4291,7 @@ void LLViewerObject::setDebugText(const std::string &utf8text) mText->setOnHUDAttachment(isHUDAttachment()); } mText->setColor(LLColor4::white); - mText->setStringUTF8(utf8text); + mText->setString(utf8text); mText->setZCompare(FALSE); mText->setDoFade(FALSE); updateText(); @@ -4445,6 +4586,13 @@ void LLViewerObject::setAttachedSound(const LLUUID &audio_uuid, const LLUUID& ow mAudioSourcep = NULL; } + if (mAudioSourcep && mAudioSourcep->isMuted() && + mAudioSourcep->getCurrentData() && mAudioSourcep->getCurrentData()->getID() == audio_uuid) + { + //llinfos << "Already having this sound as muted sound, ignoring" << llendl; + return; + } + getAudioSource(owner_id); if (mAudioSourcep) @@ -4952,6 +5100,7 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp) } mLatestRecvPacketID = 0; + mCircuitPacketCount = 0; mRegionp = regionp; for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) @@ -4964,6 +5113,20 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp) updateDrawable(FALSE); } +// virtual +void LLViewerObject::updateRegion(LLViewerRegion *regionp) +{ +// if (regionp) +// { +// F64 now = LLFrameTimer::getElapsedSeconds(); +// llinfos << "Updating to region " << regionp->getName() +// << ", ms since last update message: " << (F32)((now - mLastMessageUpdateSecs) * 1000.0) +// << ", ms since last interpolation: " << (F32)((now - mLastInterpUpdateSecs) * 1000.0) +// << llendl; +// } +} + + bool LLViewerObject::specialHoverCursor() const { return (mFlags & FLAGS_USE_PHYSICS) diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h index bcc2cb164f..fe670f8827 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -31,7 +31,6 @@ #include "llassetstorage.h" #include "lldarrayptr.h" -#include "llhudtext.h" #include "llhudicon.h" #include "llinventory.h" #include "llrefcount.h" @@ -54,6 +53,7 @@ class LLColor4; class LLFrameTimer; class LLDrawable; class LLHost; +class LLHUDText; class LLWorld; class LLNameValue; class LLNetMap; @@ -131,7 +131,7 @@ public: typedef const child_list_t const_child_list_t; - LLViewerObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp, BOOL is_global = FALSE); + LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp, BOOL is_global = FALSE); MEM_TYPE_NEW(LLMemType::MTYPE_OBJECT); virtual void markDead(); // Mark this object as dead, and clean up its references @@ -464,7 +464,7 @@ public: bool specialHoverCursor() const; // does it have a special hover cursor? void setRegion(LLViewerRegion *regionp); - virtual void updateRegion(LLViewerRegion *regionp) {} + virtual void updateRegion(LLViewerRegion *regionp); void updateFlags(); BOOL setFlags(U32 flag, BOOL state); @@ -510,6 +510,9 @@ private: // and the update wasn't due to this agent's last action. U32 checkMediaURL(const std::string &media_url); + // Motion prediction between updates + void interpolateLinearMotion(const F64 & time, const F32 & dt); + public: // // Viewer-side only types - use the LL_PCODE_APP mask. @@ -518,14 +521,14 @@ public: { LL_VO_CLOUDS = LL_PCODE_APP | 0x20, LL_VO_SURFACE_PATCH = LL_PCODE_APP | 0x30, - //LL_VO_STARS = LL_PCODE_APP | 0x40, + LL_VO_WL_SKY = LL_PCODE_APP | 0x40, LL_VO_SQUARE_TORUS = LL_PCODE_APP | 0x50, LL_VO_SKY = LL_PCODE_APP | 0x60, - LL_VO_WATER = LL_PCODE_APP | 0x70, - LL_VO_GROUND = LL_PCODE_APP | 0x80, - LL_VO_PART_GROUP = LL_PCODE_APP | 0x90, - LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xa0, - LL_VO_WL_SKY = LL_PCODE_APP | 0xb0, // should this be moved to 0x40? + LL_VO_VOID_WATER = LL_PCODE_APP | 0x70, + LL_VO_WATER = LL_PCODE_APP | 0x80, + LL_VO_GROUND = LL_PCODE_APP | 0x90, + LL_VO_PART_GROUP = LL_PCODE_APP | 0xa0, + LL_VO_TRIANGLE_TORUS = LL_PCODE_APP | 0xb0, LL_VO_HUD_PART_GROUP = LL_PCODE_APP | 0xc0, } EVOType; @@ -612,6 +615,8 @@ protected: F64 mLastInterpUpdateSecs; // Last update for purposes of interpolation F64 mLastMessageUpdateSecs; // Last update from a message from the simulator TPACKETID mLatestRecvPacketID; // Latest time stamp on message from simulator + U32 mCircuitPacketCount; // Packet tracking for early detection of a stopped simulator circuit + // extra data sent from the sim...currently only used for tree species info U8* mData; @@ -669,9 +674,21 @@ protected: mutable LLVector3 mPositionRegion; mutable LLVector3 mPositionAgent; + static void setPhaseOutUpdateInterpolationTime(F32 value) { sPhaseOutUpdateInterpolationTime = (F64) value; } + static void setMaxUpdateInterpolationTime(F32 value) { sMaxUpdateInterpolationTime = (F64) value; } + + static void setVelocityInterpolate(BOOL value) { sVelocityInterpolate = value; } + static void setPingInterpolate(BOOL value) { sPingInterpolate = value; } + private: static S32 sNumObjects; + static F64 sPhaseOutUpdateInterpolationTime; // For motion interpolation + static F64 sMaxUpdateInterpolationTime; // For motion interpolation + + static BOOL sVelocityInterpolate; + static BOOL sPingInterpolate; + //-------------------------------------------------------------------- // For objects that are attachments //-------------------------------------------------------------------- @@ -717,8 +734,8 @@ public: class LLAlphaObject : public LLViewerObject { public: - LLAlphaObject(const LLUUID &id, const LLPCode type, LLViewerRegion *regionp) - : LLViewerObject(id,type,regionp) + LLAlphaObject(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) + : LLViewerObject(id,pcode,regionp) { mDepth = 0.f; } virtual F32 getPartSize(S32 idx); @@ -735,14 +752,12 @@ public: class LLStaticViewerObject : public LLViewerObject { public: - LLStaticViewerObject(const LLUUID& id, const LLPCode type, LLViewerRegion* regionp, BOOL is_global = FALSE) - : LLViewerObject(id,type,regionp, is_global) + LLStaticViewerObject(const LLUUID& id, const LLPCode pcode, LLViewerRegion* regionp, BOOL is_global = FALSE) + : LLViewerObject(id,pcode,regionp, is_global) { } virtual void updateDrawable(BOOL force_damped); }; -extern BOOL gVelocityInterpolate; -extern BOOL gPingInterpolate; #endif diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 05695193a5..f5a32438cf 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -47,7 +47,7 @@ #include "lltooltip.h" #include "llworld.h" #include "llstring.h" -#include "llhudtext.h" +#include "llhudnametag.h" #include "lldrawable.h" #include "xform.h" #include "llsky.h" @@ -165,6 +165,11 @@ BOOL LLViewerObjectList::removeFromLocalIDTable(const LLViewerObject &object) { U32 local_id = object.mLocalID; LLHost region_host = object.getRegion()->getHost(); + if(!region_host.isOk()) + { + return FALSE ; + } + U32 ip = region_host.getAddress(); U32 port = region_host.getPort(); U64 ipport = (((U64)ip) << 32) | (U64)port; @@ -654,9 +659,24 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) void LLViewerObjectList::update(LLAgent &agent, LLWorld &world) { LLMemType mt(LLMemType::MTYPE_OBJECT); + // Update globals - gVelocityInterpolate = gSavedSettings.getBOOL("VelocityInterpolate"); - gPingInterpolate = gSavedSettings.getBOOL("PingInterpolate"); + LLViewerObject::setVelocityInterpolate( gSavedSettings.getBOOL("VelocityInterpolate") ); + LLViewerObject::setPingInterpolate( gSavedSettings.getBOOL("PingInterpolate") ); + + F32 interp_time = gSavedSettings.getF32("InterpolationTime"); + F32 phase_out_time = gSavedSettings.getF32("InterpolationPhaseOut"); + if (interp_time < 0.0 || + phase_out_time < 0.0 || + phase_out_time > interp_time) + { + llwarns << "Invalid values for InterpolationTime or InterpolationPhaseOut, resetting to defaults" << llendl; + interp_time = 3.0f; + phase_out_time = 1.0f; + } + LLViewerObject::setPhaseOutUpdateInterpolationTime( interp_time ); + LLViewerObject::setMaxUpdateInterpolationTime( phase_out_time ); + gAnimateTextures = gSavedSettings.getBOOL("AnimateTextures"); // update global timer @@ -1195,7 +1215,7 @@ void LLViewerObjectList::generatePickList(LLCamera &camera) } } - LLHUDText::addPickable(mSelectPickList); + LLHUDNameTag::addPickable(mSelectPickList); for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin(); iter != LLCharacter::sInstances.end(); ++iter) @@ -1269,34 +1289,6 @@ void LLViewerObjectList::generatePickList(LLCamera &camera) } } -void LLViewerObjectList::renderPickList(const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent) -{ - gRenderForSelect = TRUE; - - gPipeline.renderForSelect(mSelectPickList, render_transparent, screen_rect); - - // - // Render pass for selected objects - // - gGL.color4f(1,1,1,1); - gViewerWindow->renderSelections( TRUE, pick_parcel_wall, FALSE ); - - //fix for DEV-19335. Don't pick hud objects when customizing avatar (camera mode doesn't play nice with nametags). - if (!gAgentCamera.cameraCustomizeAvatar()) - { - // render pickable ui elements, like names, etc. - LLHUDObject::renderAllForSelect(); - } - - gGL.flush(); - LLVertexBuffer::unbind(); - - gRenderForSelect = FALSE; - - //llinfos << "Rendered " << count << " for select" << llendl; - //llinfos << "Took " << pick_timer.getElapsedTimeF32()*1000.f << "ms to pick" << llendl; -} - LLViewerObject *LLViewerObjectList::getSelectedObject(const U32 object_id) { std::set<LLViewerObject*>::iterator pick_it; diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h index eba5584b57..605bac8e89 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -104,7 +104,6 @@ public: // Selection related stuff void generatePickList(LLCamera &camera); - void renderPickList(const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent); LLViewerObject *getSelectedObject(const U32 object_id); diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index e9a4c4dd0a..99e869dafc 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -568,6 +568,24 @@ void LLViewerParcelMedia::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAME_CHANGED" << LL_ENDL; }; break; + + case MEDIA_EVENT_CLOSE_REQUEST: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLOSE_REQUEST" << LL_ENDL; + } + break; + + case MEDIA_EVENT_PICK_FILE_REQUEST: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << LL_ENDL; + } + break; + + case MEDIA_EVENT_GEOMETRY_CHANGE: + { + LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() << LL_ENDL; + } + break; }; } diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 660bb93562..11de377410 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -2069,10 +2069,7 @@ void LLViewerParcelMgr::deedLandToGroup() args["GROUP_NAME"] = group_name; if(mCurrentParcel->getContributeWithDeed()) { - std::string first_name, last_name; - gCacheName->getName(mCurrentParcel->getOwnerID(), first_name, last_name); - args["FIRST_NAME"] = first_name; - args["LAST_NAME"] = last_name; + args["NAME"] = LLSLURL("agent", mCurrentParcel->getOwnerID(), "completename").getSLURLString(); LLNotificationsUtil::add("DeedLandToGroupWithContribution",args, LLSD(), deedAlertCB); } else diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 98f16757b2..ca07e7c4cf 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -28,7 +28,9 @@ #include "llviewerregion.h" +// linden libraries #include "indra_constants.h" +#include "llavatarnamecache.h" // name lookup cap url #include "llfloaterreg.h" #include "llmath.h" #include "llhttpclient.h" @@ -163,7 +165,9 @@ public: mRegion->showReleaseNotes(); } } - + + mRegion->setCapabilitiesReceived(true); + if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState()) { LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED ); @@ -221,7 +225,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, // LLCapabilityListener binds all the globals it expects to need at // construction time. mCapabilityListener(host.getString(), gMessageSystem, *this, - gAgent.getID(), gAgent.getSessionID()) + gAgent.getID(), gAgent.getSessionID()), + mCapabilitiesReceived(false) { mWidth = region_width_meters; mOriginGlobal = from_region_handle(handle); @@ -261,6 +266,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, //MUST MATCH declaration of eObjectPartitions mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN + mObjectPartition.push_back(new LLVoidWaterPartition()); //PARTITION_VOIDWATER mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE @@ -1360,6 +1366,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) LLSD capabilityNames = LLSD::emptyArray(); capabilityNames.append("AttachmentResources"); + capabilityNames.append("AvatarPickerSearch"); capabilityNames.append("ChatSessionRequest"); capabilityNames.append("CopyInventoryFromNotecard"); capabilityNames.append("DispatchRegionInfo"); @@ -1370,6 +1377,7 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("ObjectMediaNavigate"); capabilityNames.append("FetchLib"); capabilityNames.append("FetchLibDescendents"); + capabilityNames.append("GetDisplayNames"); capabilityNames.append("GetTexture"); capabilityNames.append("GroupProposalBallot"); capabilityNames.append("HomeLocation"); @@ -1391,6 +1399,9 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("SendUserReport"); capabilityNames.append("SendUserReportWithScreenshot"); capabilityNames.append("ServerReleaseNotes"); + capabilityNames.append("SetDisplayName"); + capabilityNames.append("SimConsole"); + capabilityNames.append("SimConsoleAsync"); capabilityNames.append("StartGroupProposal"); capabilityNames.append("TextureStats"); capabilityNames.append("UntrustedSimulatorMessage"); @@ -1452,6 +1463,16 @@ std::string LLViewerRegion::getCapability(const std::string& name) const return iter->second; } +bool LLViewerRegion::capabilitiesReceived() const +{ + return mCapabilitiesReceived; +} + +void LLViewerRegion::setCapabilitiesReceived(bool received) +{ + mCapabilitiesReceived = received; +} + void LLViewerRegion::logActiveCapabilities() const { int count = 0; diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 038c831e59..8b71998f60 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -73,6 +73,7 @@ public: { PARTITION_HUD=0, PARTITION_TERRAIN, + PARTITION_VOIDWATER, PARTITION_WATER, PARTITION_TREE, PARTITION_PARTICLE, @@ -228,6 +229,11 @@ public: void setCapability(const std::string& name, const std::string& url); // implements LLCapabilityProvider virtual std::string getCapability(const std::string& name) const; + + // has region received its final (not seed) capability list? + bool capabilitiesReceived() const; + void setCapabilitiesReceived(bool received); + static bool isSpecialCapabilityName(const std::string &name); void logActiveCapabilities() const; @@ -407,6 +413,7 @@ private: private: bool mAlive; // can become false if circuit disconnects + bool mCapabilitiesReceived; //spatial partitions for objects in this region std::vector<LLSpatialPartition*> mObjectPartition; diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index d078c15316..c1abead36e 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -335,8 +335,8 @@ void LLViewerShaderMgr::setShaders() } else { - LLPipeline::sRenderGlow = - LLPipeline::sWaterReflections = FALSE; + LLPipeline::sRenderGlow = FALSE; + LLPipeline::sWaterReflections = FALSE; } //hack to reset buffers that change behavior with shaders diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index e55808597c..46c78e2bb4 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -558,7 +558,7 @@ F32 gWorstLandCompression = 0.f, gWorstWaterCompression = 0.f; U32 gTotalWorldBytes = 0, gTotalObjectBytes = 0, gTotalTextureBytes = 0, gSimPingCount = 0; U32 gObjectBits = 0; F32 gAvgSimPing = 0.f; - +U32 gTotalTextureBytesPerBoostLevel[LLViewerTexture::MAX_GL_IMAGE_CATEGORY] = {0}; extern U32 gVisCompared; extern U32 gVisTested; @@ -847,6 +847,9 @@ void send_stats() llinfos << "Misc Stats: int_1: " << misc["int_1"] << " int_2: " << misc["int_2"] << llendl; llinfos << "Misc Stats: string_1: " << misc["string_1"] << " string_2: " << misc["string_2"] << llendl; + + body["DisplayNamesEnabled"] = gSavedSettings.getBOOL("UseDisplayNames"); + body["DisplayNamesShowUsername"] = gSavedSettings.getBOOL("NameTagShowUsernames"); LLViewerStats::getInstance()->addToMessage(body); LLHTTPClient::post(url, body, new ViewerStatsResponder()); diff --git a/indra/newview/llviewerstats.h b/indra/newview/llviewerstats.h index ca977d4599..3f9cfb9d9b 100644 --- a/indra/newview/llviewerstats.h +++ b/indra/newview/llviewerstats.h @@ -264,4 +264,6 @@ void send_stats(); extern std::map<S32,LLFrameTimer> gDebugTimers; extern std::map<S32,std::string> gDebugTimerLabel; extern U32 gTotalTextureBytes; +extern U32 gTotalObjectBytes; +extern U32 gTotalTextureBytesPerBoostLevel[] ; #endif // LL_LLVIEWERSTATS_H diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 5c262838ae..6160510c0e 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -72,6 +72,7 @@ LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sDefaultImagep = NULL; LLPointer<LLViewerFetchedTexture> LLViewerFetchedTexture::sSmokeImagep = NULL; LLViewerMediaTexture::media_map_t LLViewerMediaTexture::sMediaMap ; LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL ; +const std::string sTesterName("TextureTester"); S32 LLViewerTexture::sImageCount = 0; S32 LLViewerTexture::sRawCount = 0; @@ -341,9 +342,14 @@ void LLViewerTextureManager::init() LLViewerTexture::initClass() ; - if(LLFastTimer::sMetricLog) + if (LLMetricPerformanceTesterBasic::isMetricLogRequested(sTesterName) && !LLMetricPerformanceTesterBasic::getTester(sTesterName)) { - LLViewerTextureManager::sTesterp = new LLTexturePipelineTester() ; + sTesterp = new LLTexturePipelineTester() ; + if (!sTesterp->isValid()) + { + delete sTesterp; + sTesterp = NULL; + } } } @@ -408,9 +414,10 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity { sCurrentTime = gFrameTimeSeconds ; - if(LLViewerTextureManager::sTesterp) + LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) { - LLViewerTextureManager::sTesterp->update() ; + tester->update() ; } LLViewerMediaTexture::updateClass() ; @@ -603,9 +610,10 @@ bool LLViewerTexture::bindDefaultImage(S32 stage) //check if there is cached raw image and switch to it if possible switchToCachedImage() ; - if(LLViewerTextureManager::sTesterp) + LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) { - LLViewerTextureManager::sTesterp->updateGrayTextureBinding() ; + tester->updateGrayTextureBinding() ; } return res; } @@ -1066,9 +1074,10 @@ BOOL LLViewerTexture::isLargeImage() //virtual void LLViewerTexture::updateBindStatsForTester() { - if(LLViewerTextureManager::sTesterp) + LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) { - LLViewerTextureManager::sTesterp->updateTextureBindingStats(this) ; + tester->updateTextureBindingStats(this) ; } } @@ -1130,7 +1139,7 @@ void LLViewerFetchedTexture::init(bool firstinit) // does not contain this image. mIsMissingAsset = FALSE; - mLoadedCallbackDesiredDiscardLevel = 0; + mLoadedCallbackDesiredDiscardLevel = S8_MAX; mPauseLoadedCallBacks = TRUE ; mNeedsCreateTexture = FALSE; @@ -1155,9 +1164,11 @@ void LLViewerFetchedTexture::init(bool firstinit) mSavedRawImage = NULL ; mForceToSaveRawImage = FALSE ; + mSaveRawImage = FALSE ; mSavedRawDiscardLevel = -1 ; mDesiredSavedRawDiscardLevel = -1 ; mLastReferencedSavedRawImageTime = 0.0f ; + mLastCallBackActiveTime = 0.f; } LLViewerFetchedTexture::~LLViewerFetchedTexture() @@ -1483,56 +1494,57 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height) //virtual void LLViewerFetchedTexture::processTextureStats() { + static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); + if(mFullyLoaded) - { - if(mDesiredDiscardLevel > mMinDesiredDiscardLevel)//need to load more + { + if(needsToSaveRawImage())//needs to reload { - mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; mFullyLoaded = FALSE ; } - } - else - { - updateVirtualSize() ; - - static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); - - if (textures_fullres) + else { - mDesiredDiscardLevel = 0; + return ; } - else if(!mFullWidth || !mFullHeight) + } + + //updateVirtualSize() ; + + if (textures_fullres) + { + mDesiredDiscardLevel = 0; + } + else if(!mFullWidth || !mFullHeight) + { + mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ; + } + else + { + if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) { - mDesiredDiscardLevel = getMaxDiscardLevel() ; - } - else - { - if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) + if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) { - if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) - { - mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 - } - else - { - mDesiredDiscardLevel = 0; - } - } - else if(mKnownDrawSizeChanged)//known draw size is set - { - mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2, - log((F32)mFullHeight / mKnownDrawHeight) / log_2) ; - mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; - mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; + mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 } - mKnownDrawSizeChanged = FALSE ; - - if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel)) + else { - mFullyLoaded = TRUE ; + mDesiredDiscardLevel = 0; } } - } + else if(mKnownDrawSizeChanged)//known draw size is set + { + mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2, + log((F32)mFullHeight / mKnownDrawHeight) / log_2) ; + mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ; + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; + } + mKnownDrawSizeChanged = FALSE ; + + if(getDiscardLevel() >= 0 && (getDiscardLevel() <= mDesiredDiscardLevel)) + { + mFullyLoaded = TRUE ; + } + } if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0) //force to refetch the texture. { @@ -1846,10 +1858,11 @@ bool LLViewerFetchedTexture::updateFetch() // We may have data ready regardless of whether or not we are finished (e.g. waiting on write) if (mRawImage.notNull()) { - if(LLViewerTextureManager::sTesterp) + LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) { mIsFetched = TRUE ; - LLViewerTextureManager::sTesterp->updateTextureLoadingStats(this, mRawImage, LLAppViewer::getTextureFetch()->isFromLocalCache(mID)) ; + tester->updateTextureLoadingStats(this, mRawImage, LLAppViewer::getTextureFetch()->isFromLocalCache(mID)) ; } mRawDiscardLevel = fetch_discard; if ((mRawImage->getDataSize() > 0 && mRawDiscardLevel >= 0) && @@ -2074,13 +2087,14 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call mNeedsAux |= needs_aux; if(keep_imageraw) { - forceToSaveRawImage(discard_level, true) ; + mSaveRawImage = TRUE ; } if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0) { // We need aux data, but we've already loaded the image, and it didn't have any llwarns << "No aux data available for callback for image:" << getID() << llendl; } + mLastCallBackActiveTime = sCurrentTime ; } void LLViewerFetchedTexture::clearCallbackEntryList() @@ -2103,9 +2117,8 @@ void LLViewerFetchedTexture::clearCallbackEntryList() } gTextureList.mCallbackList.erase(this); - mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; mLoadedCallbackDesiredDiscardLevel = S8_MAX ; - if(mForceToSaveRawImage) + if(needsToSaveRawImage()) { destroySavedRawImage() ; } @@ -2151,14 +2164,13 @@ void LLViewerFetchedTexture::deleteCallbackEntry(const LLLoadedCallbackEntry::so { // If we have no callbacks, take us off of the image callback list. gTextureList.mCallbackList.erase(this); - mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; - - if(mForceToSaveRawImage) + + if(needsToSaveRawImage()) { destroySavedRawImage() ; } } - else if(mForceToSaveRawImage && mBoostLevel != LLViewerTexture::BOOST_PREVIEW) + else if(needsToSaveRawImage() && mBoostLevel != LLViewerTexture::BOOST_PREVIEW) { if(desired_raw_discard != INVALID_DISCARD_LEVEL) { @@ -2196,7 +2208,7 @@ void LLViewerFetchedTexture::unpauseLoadedCallbacks(const LLLoadedCallbackEntry: mPauseLoadedCallBacks = FALSE ; if(need_raw) { - mForceToSaveRawImage = TRUE ; + mSaveRawImage = TRUE ; } } @@ -2227,16 +2239,23 @@ void LLViewerFetchedTexture::pauseLoadedCallbacks(const LLLoadedCallbackEntry::s { mPauseLoadedCallBacks = TRUE ;//when set, loaded callback is paused. resetTextureStats(); - mForceToSaveRawImage = FALSE ; + mSaveRawImage = FALSE ; } } bool LLViewerFetchedTexture::doLoadedCallbacks() { + static const F32 MAX_INACTIVE_TIME = 120.f ; //seconds + if (mNeedsCreateTexture) { return false; } + if(sCurrentTime - mLastCallBackActiveTime > MAX_INACTIVE_TIME) + { + clearCallbackEntryList() ; //remove all callbacks. + return false ; + } bool res = false; @@ -2302,13 +2321,11 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() bool run_raw_callbacks = false; bool need_readback = false; - mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; for(callback_list_t::iterator iter = mLoadedCallbackList.begin(); iter != mLoadedCallbackList.end(); ) { LLLoadedCallbackEntry *entryp = *iter++; - mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)entryp->mDesiredDiscard) ; - + if (entryp->mNeedsImageRaw) { if (mNeedsAux) @@ -2382,7 +2399,8 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() // to satisfy the interested party, then this is the last time that // we're going to call them. - llassert_always(mRawImage.notNull()); + mLastCallBackActiveTime = sCurrentTime ; + //llassert_always(mRawImage.notNull()); if(mNeedsAux && mAuxRawImage.isNull()) { llwarns << "Raw Image with no Aux Data for callback" << llendl; @@ -2417,6 +2435,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() LLLoadedCallbackEntry *entryp = *curiter; if (!entryp->mNeedsImageRaw && (entryp->mLastUsedDiscard > gl_discard)) { + mLastCallBackActiveTime = sCurrentTime ; BOOL final = gl_discard <= entryp->mDesiredDiscard ? TRUE : FALSE; entryp->mLastUsedDiscard = gl_discard; entryp->mCallback(TRUE, this, NULL, NULL, gl_discard, final, entryp->mUserData); @@ -2436,7 +2455,6 @@ bool LLViewerFetchedTexture::doLoadedCallbacks() if (mLoadedCallbackList.empty()) { gTextureList.mCallbackList.erase(this); - mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1; } // Done with any raw image data at this point (will be re-created if we still have callbacks) @@ -2516,6 +2534,11 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level) return mRawImage; } +bool LLViewerFetchedTexture::needsToSaveRawImage() +{ + return mForceToSaveRawImage || mSaveRawImage ; +} + void LLViewerFetchedTexture::destroyRawImage() { if (mAuxRawImage.notNull()) sAuxCount--; @@ -2526,7 +2549,7 @@ void LLViewerFetchedTexture::destroyRawImage() if(mIsRawImageValid) { - if(mForceToSaveRawImage) + if(needsToSaveRawImage()) { saveRawImage() ; } @@ -2658,7 +2681,7 @@ void LLViewerFetchedTexture::saveRawImage() mSavedRawDiscardLevel = mRawDiscardLevel ; mSavedRawImage = new LLImageRaw(mRawImage->getData(), mRawImage->getWidth(), mRawImage->getHeight(), mRawImage->getComponents()) ; - if(mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel) + if(mForceToSaveRawImage && mSavedRawDiscardLevel <= mDesiredSavedRawDiscardLevel) { mForceToSaveRawImage = FALSE ; } @@ -2691,13 +2714,10 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_ void LLViewerFetchedTexture::destroySavedRawImage() { clearCallbackEntryList() ; - //if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0 && mDesiredSavedRawDiscardLevel < getDiscardLevel()) - //{ - // return ; //can not destroy the saved raw image before it is fully fetched, otherwise causing callbacks hanging there. - //} - + mSavedRawImage = NULL ; mForceToSaveRawImage = FALSE ; + mSaveRawImage = FALSE ; mSavedRawDiscardLevel = -1 ; mDesiredSavedRawDiscardLevel = -1 ; mLastReferencedSavedRawImageTime = 0.0f ; @@ -3066,9 +3086,10 @@ void LLViewerLODTexture::scaleDown() { switchToCachedImage() ; - if(LLViewerTextureManager::sTesterp) + LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) { - LLViewerTextureManager::sTesterp->setStablizingTime() ; + tester->setStablizingTime() ; } } } @@ -3578,23 +3599,22 @@ F32 LLViewerMediaTexture::getMaxVirtualSize() //---------------------------------------------------------------------------------------------- //start of LLTexturePipelineTester //---------------------------------------------------------------------------------------------- -LLTexturePipelineTester::LLTexturePipelineTester() : - LLMetricPerformanceTester("TextureTester", FALSE) -{ - addMetricString("TotalBytesLoaded") ; - addMetricString("TotalBytesLoadedFromCache") ; - addMetricString("TotalBytesLoadedForLargeImage") ; - addMetricString("TotalBytesLoadedForSculpties") ; - addMetricString("StartFetchingTime") ; - addMetricString("TotalGrayTime") ; - addMetricString("TotalStablizingTime") ; - addMetricString("StartTimeLoadingSculpties") ; - addMetricString("EndTimeLoadingSculpties") ; - - addMetricString("Time") ; - addMetricString("TotalBytesBound") ; - addMetricString("TotalBytesBoundForLargeImage") ; - addMetricString("PercentageBytesBound") ; +LLTexturePipelineTester::LLTexturePipelineTester() : LLMetricPerformanceTesterWithSession(sTesterName) +{ + addMetric("TotalBytesLoaded") ; + addMetric("TotalBytesLoadedFromCache") ; + addMetric("TotalBytesLoadedForLargeImage") ; + addMetric("TotalBytesLoadedForSculpties") ; + addMetric("StartFetchingTime") ; + addMetric("TotalGrayTime") ; + addMetric("TotalStablizingTime") ; + addMetric("StartTimeLoadingSculpties") ; + addMetric("EndTimeLoadingSculpties") ; + + addMetric("Time") ; + addMetric("TotalBytesBound") ; + addMetric("TotalBytesBoundForLargeImage") ; + addMetric("PercentageBytesBound") ; mTotalBytesLoaded = 0 ; mTotalBytesLoadedFromCache = 0 ; @@ -3606,7 +3626,7 @@ LLTexturePipelineTester::LLTexturePipelineTester() : LLTexturePipelineTester::~LLTexturePipelineTester() { - LLViewerTextureManager::sTesterp = NULL ; + LLViewerTextureManager::sTesterp = NULL; } void LLTexturePipelineTester::update() @@ -3672,22 +3692,23 @@ void LLTexturePipelineTester::reset() //virtual void LLTexturePipelineTester::outputTestRecord(LLSD *sd) { - (*sd)[mCurLabel]["TotalBytesLoaded"] = (LLSD::Integer)mTotalBytesLoaded ; - (*sd)[mCurLabel]["TotalBytesLoadedFromCache"] = (LLSD::Integer)mTotalBytesLoadedFromCache ; - (*sd)[mCurLabel]["TotalBytesLoadedForLargeImage"] = (LLSD::Integer)mTotalBytesLoadedForLargeImage ; - (*sd)[mCurLabel]["TotalBytesLoadedForSculpties"] = (LLSD::Integer)mTotalBytesLoadedForSculpties ; + std::string currentLabel = getCurrentLabelName(); + (*sd)[currentLabel]["TotalBytesLoaded"] = (LLSD::Integer)mTotalBytesLoaded ; + (*sd)[currentLabel]["TotalBytesLoadedFromCache"] = (LLSD::Integer)mTotalBytesLoadedFromCache ; + (*sd)[currentLabel]["TotalBytesLoadedForLargeImage"] = (LLSD::Integer)mTotalBytesLoadedForLargeImage ; + (*sd)[currentLabel]["TotalBytesLoadedForSculpties"] = (LLSD::Integer)mTotalBytesLoadedForSculpties ; - (*sd)[mCurLabel]["StartFetchingTime"] = (LLSD::Real)mStartFetchingTime ; - (*sd)[mCurLabel]["TotalGrayTime"] = (LLSD::Real)mTotalGrayTime ; - (*sd)[mCurLabel]["TotalStablizingTime"] = (LLSD::Real)mTotalStablizingTime ; + (*sd)[currentLabel]["StartFetchingTime"] = (LLSD::Real)mStartFetchingTime ; + (*sd)[currentLabel]["TotalGrayTime"] = (LLSD::Real)mTotalGrayTime ; + (*sd)[currentLabel]["TotalStablizingTime"] = (LLSD::Real)mTotalStablizingTime ; - (*sd)[mCurLabel]["StartTimeLoadingSculpties"] = (LLSD::Real)mStartTimeLoadingSculpties ; - (*sd)[mCurLabel]["EndTimeLoadingSculpties"] = (LLSD::Real)mEndTimeLoadingSculpties ; + (*sd)[currentLabel]["StartTimeLoadingSculpties"] = (LLSD::Real)mStartTimeLoadingSculpties ; + (*sd)[currentLabel]["EndTimeLoadingSculpties"] = (LLSD::Real)mEndTimeLoadingSculpties ; - (*sd)[mCurLabel]["Time"] = LLImageGL::sLastFrameTime ; - (*sd)[mCurLabel]["TotalBytesBound"] = (LLSD::Integer)mLastTotalBytesUsed ; - (*sd)[mCurLabel]["TotalBytesBoundForLargeImage"] = (LLSD::Integer)mLastTotalBytesUsedForLargeImage ; - (*sd)[mCurLabel]["PercentageBytesBound"] = (LLSD::Real)(100.f * mLastTotalBytesUsed / mTotalBytesLoaded) ; + (*sd)[currentLabel]["Time"] = LLImageGL::sLastFrameTime ; + (*sd)[currentLabel]["TotalBytesBound"] = (LLSD::Integer)mLastTotalBytesUsed ; + (*sd)[currentLabel]["TotalBytesBoundForLargeImage"] = (LLSD::Integer)mLastTotalBytesUsedForLargeImage ; + (*sd)[currentLabel]["PercentageBytesBound"] = (LLSD::Real)(100.f * mLastTotalBytesUsed / mTotalBytesLoaded) ; } void LLTexturePipelineTester::updateTextureBindingStats(const LLViewerTexture* imagep) @@ -3776,7 +3797,7 @@ void LLTexturePipelineTester::compareTestSessions(std::ofstream* os) } //compare and output the comparison - *os << llformat("%s\n", mName.c_str()) ; + *os << llformat("%s\n", getTesterName().c_str()) ; *os << llformat("AggregateResults\n") ; compareTestResults(os, "TotalFetchingTime", base_sessionp->mTotalFetchingTime, current_sessionp->mTotalFetchingTime) ; @@ -3831,7 +3852,7 @@ void LLTexturePipelineTester::compareTestSessions(std::ofstream* os) } //virtual -LLMetricPerformanceTester::LLTestSession* LLTexturePipelineTester::loadTestSession(LLSD* log) +LLMetricPerformanceTesterWithSession::LLTestSession* LLTexturePipelineTester::loadTestSession(LLSD* log) { LLTexturePipelineTester::LLTextureTestSession* sessionp = new LLTexturePipelineTester::LLTextureTestSession() ; if(!sessionp) @@ -3858,12 +3879,11 @@ LLMetricPerformanceTester::LLTestSession* LLTexturePipelineTester::loadTestSessi sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mTime = 0.f ; //load a session - BOOL in_log = (*log).has(mCurLabel) ; - while(in_log) + std::string currentLabel = getCurrentLabelName(); + BOOL in_log = (*log).has(currentLabel) ; + while (in_log) { - LLSD::String label = mCurLabel ; - incLabel() ; - in_log = (*log).has(mCurLabel) ; + LLSD::String label = currentLabel ; if(sessionp->mInstantPerformanceListCounter >= (S32)sessionp->mInstantPerformanceList.size()) { @@ -3929,7 +3949,11 @@ LLMetricPerformanceTester::LLTestSession* LLTexturePipelineTester::loadTestSessi sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAverageBytesUsedForLargeImagePerSecond = 0 ; sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mAveragePercentageBytesUsedPerSecond = 0.f ; sessionp->mInstantPerformanceList[sessionp->mInstantPerformanceListCounter].mTime = 0.f ; - } + } + // Next label + incrementCurrentCount() ; + currentLabel = getCurrentLabelName(); + in_log = (*log).has(currentLabel) ; } sessionp->mTotalFetchingTime += total_fetching_time ; diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 7cb8bea4c8..b5636bbdc7 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -441,6 +441,7 @@ public: LLImageRaw* reloadRawImage(S8 discard_level) ; void destroyRawImage(); + bool needsToSaveRawImage(); const std::string& getUrl() const {return mUrl;} //--------------- @@ -532,6 +533,7 @@ protected: S8 mLoadedCallbackDesiredDiscardLevel; BOOL mPauseLoadedCallBacks; callback_list_t mLoadedCallbackList; + F32 mLastCallBackActiveTime; LLPointer<LLImageRaw> mRawImage; S32 mRawDiscardLevel; @@ -543,6 +545,7 @@ protected: //keep a copy of mRawImage for some special purposes //when mForceToSaveRawImage is set. BOOL mForceToSaveRawImage ; + BOOL mSaveRawImage; LLPointer<LLImageRaw> mSavedRawImage; S32 mSavedRawDiscardLevel; S32 mDesiredSavedRawDiscardLevel; @@ -732,7 +735,7 @@ public: //it tracks the activities of the texture pipeline //records them, and outputs them to log files // -class LLTexturePipelineTester : public LLMetricPerformanceTester +class LLTexturePipelineTester : public LLMetricPerformanceTesterWithSession { enum { @@ -748,8 +751,6 @@ public: void updateGrayTextureBinding() ; void setStablizingTime() ; - /*virtual*/ void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; - private: void reset() ; void updateStablizingTime() ; @@ -820,7 +821,7 @@ private: S32 mInstantPerformanceListCounter ; }; - /*virtual*/ LLMetricPerformanceTester::LLTestSession* loadTestSession(LLSD* log) ; + /*virtual*/ LLMetricPerformanceTesterWithSession::LLTestSession* loadTestSession(LLSD* log) ; /*virtual*/ void compareTestSessions(std::ofstream* os) ; }; diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index 456516ab6b..275dfaa996 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1161,6 +1161,8 @@ void LLViewerTextureList::updateMaxResidentTexMem(S32 mem) // static void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_data) { + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; + LLFastTimer t(FTM_PROCESS_IMAGES); // Receive image header, copy into image object and decompresses @@ -1171,14 +1173,16 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d char ip_string[256]; u32_to_ip_string(msg->getSenderIP(),ip_string); + U32 received_size ; if (msg->getReceiveCompressedSize()) { - gTextureList.sTextureBits += msg->getReceiveCompressedSize() * 8; + received_size = msg->getReceiveCompressedSize() ; } else { - gTextureList.sTextureBits += msg->getReceiveSize() * 8; + received_size = msg->getReceiveSize() ; } + gTextureList.sTextureBits += received_size * 8; gTextureList.sTexturePackets++; U8 codec; @@ -1213,6 +1217,11 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d delete [] data; return; } + if(log_texture_traffic) + { + gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ; + } + //image->getLastPacketTimer()->reset(); bool res = LLAppViewer::getTextureFetch()->receiveImageHeader(msg->getSender(), id, codec, packets, totalbytes, data_size, data); if (!res) @@ -1224,6 +1233,8 @@ void LLViewerTextureList::receiveImageHeader(LLMessageSystem *msg, void **user_d // static void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_data) { + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; + LLMemType mt1(LLMemType::MTYPE_APPFMTIMAGE); LLFastTimer t(FTM_PROCESS_IMAGES); @@ -1236,14 +1247,16 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d char ip_string[256]; u32_to_ip_string(msg->getSenderIP(),ip_string); + U32 received_size ; if (msg->getReceiveCompressedSize()) { - gTextureList.sTextureBits += msg->getReceiveCompressedSize() * 8; + received_size = msg->getReceiveCompressedSize() ; } else { - gTextureList.sTextureBits += msg->getReceiveSize() * 8; + received_size = msg->getReceiveSize() ; } + gTextureList.sTextureBits += received_size * 8; gTextureList.sTexturePackets++; //llprintline("Start decode, image header..."); @@ -1277,6 +1290,11 @@ void LLViewerTextureList::receiveImagePacket(LLMessageSystem *msg, void **user_d delete [] data; return; } + if(log_texture_traffic) + { + gTotalTextureBytesPerBoostLevel[image->getBoostLevel()] += received_size ; + } + //image->getLastPacketTimer()->reset(); bool res = LLAppViewer::getTextureFetch()->receiveImagePacket(msg->getSender(), id, packet_num, data_size, data); if (!res) @@ -1544,7 +1562,8 @@ bool LLUIImageList::initFromFile() } UIImageDeclarations images; - LLXUIParser::instance().readXUI(root, images, base_file_path); + LLXUIParser parser; + parser.readXUI(root, images, base_file_path); if (!images.validateBlock()) return false; @@ -1557,8 +1576,8 @@ bool LLUIImageList::initFromFile() for (S32 cur_pass = PASS_DECODE_NOW; cur_pass < NUM_PASSES; cur_pass++) { - for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures().begin(); - image_it != images.textures().end(); + for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures.begin(); + image_it != images.textures.end(); ++image_it) { std::string file_name = image_it->file_name.isProvided() ? image_it->file_name() : image_it->name(); diff --git a/indra/newview/llviewerthrottle.cpp b/indra/newview/llviewerthrottle.cpp index b614ccdbc2..5147272122 100644 --- a/indra/newview/llviewerthrottle.cpp +++ b/indra/newview/llviewerthrottle.cpp @@ -46,7 +46,7 @@ const F32 MAX_FRACTIONAL = 1.5f; const F32 MIN_FRACTIONAL = 0.2f; const F32 MIN_BANDWIDTH = 50.f; -const F32 MAX_BANDWIDTH = 1500.f; +const F32 MAX_BANDWIDTH = 3000.f; const F32 STEP_FRACTIONAL = 0.1f; const F32 TIGHTEN_THROTTLE_THRESHOLD = 3.0f; // packet loss % per s const F32 EASE_THROTTLE_THRESHOLD = 0.5f; // packet loss % per s diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 14188e6d2e..a7790243ed 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -96,6 +96,7 @@ #include "llface.h" #include "llfeaturemanager.h" #include "llfilepicker.h" +#include "llfirstuse.h" #include "llfloater.h" #include "llfloaterbuildoptions.h" #include "llfloaterbuyland.h" @@ -114,6 +115,7 @@ #include "llglheaders.h" #include "lltooltip.h" #include "llhudmanager.h" +#include "llhudobject.h" #include "llhudview.h" #include "llimagebmp.h" #include "llimagej2c.h" @@ -304,6 +306,8 @@ public: void update() { + static LLCachedControl<bool> log_texture_traffic(gSavedSettings,"LogTextureNetworkTraffic") ; + std::string wind_vel_text; std::string wind_vector_text; std::string rwind_vel_text; @@ -580,6 +584,23 @@ public: ypos += y_inc; } } + if(log_texture_traffic) + { + U32 old_y = ypos ; + for(S32 i = LLViewerTexture::BOOST_NONE; i < LLViewerTexture::MAX_GL_IMAGE_CATEGORY; i++) + { + if(gTotalTextureBytesPerBoostLevel[i] > 0) + { + addText(xpos, ypos, llformat("Boost_Level %d: %.3f MB", i, (F32)gTotalTextureBytesPerBoostLevel[i] / (1024 * 1024))); + ypos += y_inc; + } + } + if(ypos != old_y) + { + addText(xpos, ypos, "Network traffic for textures:"); + ypos += y_inc; + } + } } void draw() @@ -1173,12 +1194,8 @@ BOOL LLViewerWindow::handlePaint(LLWindow *window, S32 x, S32 y, S32 width, S //SetBKColor(hdc, RGB(255, 255, 255)); FillRect(hdc, &wnd_rect, CreateSolidBrush(RGB(255, 255, 255))); - std::string name_str; - LLAgentUI::buildName(name_str); - std::string temp_str; - temp_str = llformat( "%s FPS %3.1f Phy FPS %2.1f Time Dil %1.3f", /* Flawfinder: ignore */ - name_str.c_str(), + temp_str = llformat( "FPS %3.1f Phy FPS %2.1f Time Dil %1.3f", /* Flawfinder: ignore */ LLViewerStats::getInstance()->mFPSStat.getMeanPerSec(), LLViewerStats::getInstance()->mSimPhysicsFPS.getPrev(0), LLViewerStats::getInstance()->mSimTimeDilation.getPrev(0)); @@ -1343,7 +1360,7 @@ LLViewerWindow::LLViewerWindow( gSavedSettings.getBOOL("DisableVerticalSync"), !gNoRender, ignore_pixel_depth, - 0); //gSavedSettings.getU32("RenderFSAASamples")); + gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled if (!LLAppViewer::instance()->restoreErrorTrap()) { @@ -1406,6 +1423,11 @@ LLViewerWindow::LLViewerWindow( gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE); } + if (!gGLManager.mHasDepthClamp) + { + LL_INFOS("RenderInit") << "Missing feature GL_ARB_depth_clamp. Void water might disappear in rare cases." << LL_ENDL; + } + // If we crashed while initializng GL stuff last time, disable certain features if (gSavedSettings.getBOOL("RenderInitError")) { @@ -1515,7 +1537,7 @@ void LLViewerWindow::initBase() // (But wait to add it as a child of the root view so that it will be in front of the // other views.) MainPanel* main_view = new MainPanel(); - LLUICtrlFactory::instance().buildPanel(main_view, "main_view.xml"); + main_view->buildFromFile("main_view.xml"); main_view->setShape(full_window); getRootView()->addChild(main_view); @@ -1523,7 +1545,8 @@ void LLViewerWindow::initBase() mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle(); mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle(); mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle(); - mPopupView = main_view->getChild<LLPopupView>("popup_holder"); + mPopupView = main_view->findChild<LLPopupView>("popup_holder"); + mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle(); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); @@ -1561,7 +1584,7 @@ void LLViewerWindow::initBase() LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLFloaterPreference::initBusyResponse)); // Add the progress bar view (startup view), which overrides everything - mProgressView = getRootView()->getChild<LLProgressView>("progress_view"); + mProgressView = getRootView()->findChild<LLProgressView>("progress_view"); setShowProgress(FALSE); setProgressCancelButtonVisible(FALSE); @@ -1840,6 +1863,8 @@ void LLViewerWindow::reshape(S32 width, S32 height) return; } + gWindowResized = TRUE; + // update our window rectangle mWindowRectRaw.mRight = mWindowRectRaw.mLeft + width; mWindowRectRaw.mTop = mWindowRectRaw.mBottom + height; @@ -1872,7 +1897,7 @@ void LLViewerWindow::reshape(S32 width, S32 height) // clear font width caches if (display_scale_changed) { - LLHUDText::reshape(); + LLHUDObject::reshapeAll(); } sendShapeToSim(); @@ -2241,6 +2266,20 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) return TRUE; } + // If "Pressing letter keys starts local chat" option is selected, we are not in mouselook, + // no view has keyboard focus, this is a printable character key (and no modifier key is + // pressed except shift), then give focus to nearby chat (STORM-560) + if ( gSavedSettings.getS32("LetterKeysFocusChatBar") && !gAgentCamera.cameraMouselook() && + !keyboard_focus && key < 0x80 && (mask == MASK_NONE || mask == MASK_SHIFT) ) + { + LLLineEditor* chat_editor = LLBottomTray::instanceExists() ? LLBottomTray::getInstance()->getNearbyChatBar()->getChatBox() : NULL; + if (chat_editor) + { + // passing NULL here, character will be added later when it is handled by character handler. + LLBottomTray::getInstance()->getNearbyChatBar()->startChat(NULL); + return TRUE; + } + } // give menus a chance to handle unmodified accelerator keys if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask)) @@ -2400,7 +2439,7 @@ void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params) { if (viewp) { - if (!params.styled_message().empty()) + if (!params.styled_message.empty()) { params.styled_message.add().text("\n---------\n"); } @@ -2435,6 +2474,18 @@ void LLViewerWindow::updateUI() static std::string last_handle_msg; + if (gLoggedInTime.getStarted()) + { + if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("DestinationGuideHintTimeout")) + { + LLFirstUse::notUsingDestinationGuide(); + } + if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout")) + { + LLFirstUse::notUsingSidePanel(); + } + } + LLConsole::updateClass(); // animate layout stacks so we have up to date rect for world view @@ -3849,7 +3900,9 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei setCursor(UI_CURSOR_WAIT); // Hide all the UI widgets first and draw a frame - BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI); + BOOL prev_draw_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI) ? TRUE : FALSE; + + show_ui = show_ui ? TRUE : FALSE; if ( prev_draw_ui != show_ui) { @@ -3933,7 +3986,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei } if(image_buffer_x > 0 && image_buffer_y > 0) { - raw->resize(image_buffer_x, image_buffer_y, 3); + raw->resize(image_buffer_x, image_buffer_y, 3); } else { @@ -3950,7 +4003,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei send_agent_pause(); //rescale fonts initFonts(scale_factor); - LLHUDText::reshape(); + LLHUDObject::reshapeAll(); } S32 output_buffer_offset_y = 0; @@ -3972,29 +4025,19 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; - if (type == SNAPSHOT_TYPE_OBJECT_ID) - { - glClearColor(0.f, 0.f, 0.f, 0.f); - glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - LLViewerCamera::getInstance()->setZoomParameters(scale_factor, subimage_x+(subimage_y*llceil(scale_factor))); - setup3DRender(); - gObjectList.renderPickList(gViewerWindow->getWindowRectScaled(), FALSE, FALSE); + const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); + + if (LLPipeline::sRenderDeferred) + { + display(do_rebuild, scale_factor, subfield, TRUE); } else { - const U32 subfield = subimage_x+(subimage_y*llceil(scale_factor)); - - if (LLPipeline::sRenderDeferred) - { - display(do_rebuild, scale_factor, subfield, FALSE); - } - else - { - display(do_rebuild, scale_factor, subfield, TRUE); - // Required for showing the GUI in snapshots? See DEV-16350 for details. JC - render_ui(scale_factor, subfield); - } + display(do_rebuild, scale_factor, subfield, TRUE); + // Required for showing the GUI in snapshots and performing bloom composite overlay + // Call even if show_ui is FALSE + render_ui(scale_factor, subfield); } S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); @@ -4017,7 +4060,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei LLAppViewer::instance()->pingMainloopTimeout("LLViewerWindow::rawSnapshot"); } - if (type == SNAPSHOT_TYPE_OBJECT_ID || type == SNAPSHOT_TYPE_COLOR) + if (type == SNAPSHOT_TYPE_COLOR) { glReadPixels( subimage_x_offset, out_y + subimage_y_offset, @@ -4079,7 +4122,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei if (high_res) { initFonts(1.f); - LLHUDText::reshape(); + LLHUDObject::reshapeAll(); } // Pre-pad image to number of pixels such that the line length is a multiple of 4 bytes (for BMP encoding) @@ -4267,14 +4310,6 @@ BOOL LLViewerWindow::getShowProgress() const return (mProgressView && mProgressView->getVisible()); } -void LLViewerWindow::moveProgressViewToFront() -{ - if( mProgressView && mRootView ) - { - mRootView->sendChildToFront(mProgressView); - } -} - void LLViewerWindow::setProgressString(const std::string& string) { if (mProgressView) @@ -4409,6 +4444,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message) LLVOAvatar::restoreGL(); gResizeScreenTexture = TRUE; + gWindowResized = TRUE; if (isAgentAvatarValid() && !gAgentAvatarp->isUsingBakedTextures()) { diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 21507699b0..47fb7c4883 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -271,7 +271,6 @@ public: void setShowProgress(const BOOL show); BOOL getShowProgress() const; - void moveProgressViewToFront(); void setProgressString(const std::string& string); void setProgressPercent(const F32 percent); void setProgressMessage(const std::string& msg); @@ -288,6 +287,7 @@ public: void updateWorldViewRect(bool use_full_window=false); LLView* getNonSideTrayView() { return mNonSideTrayView.get(); } LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); } + LLView* getHintHolder() { return mHintHolder.get(); } BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); @@ -316,8 +316,7 @@ public: typedef enum { SNAPSHOT_TYPE_COLOR, - SNAPSHOT_TYPE_DEPTH, - SNAPSHOT_TYPE_OBJECT_ID + SNAPSHOT_TYPE_DEPTH } ESnapshotType; BOOL saveSnapshot(const std::string& filename, S32 image_width, S32 image_height, BOOL show_ui = TRUE, BOOL do_rebuild = FALSE, ESnapshotType type = SNAPSHOT_TYPE_COLOR); BOOL rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_height, BOOL keep_window_aspect = TRUE, BOOL is_texture = FALSE, @@ -447,6 +446,7 @@ protected: LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray LLHandle<LLView> mFloaterViewHolder; // container for floater_view + LLHandle<LLView> mHintHolder; // container for hints LLPopupView* mPopupView; // container for transient popups class LLDebugText* mDebugText; // Internal class for debug text diff --git a/indra/newview/llviewerwindowlistener.cpp b/indra/newview/llviewerwindowlistener.cpp index 4473b5820d..0b52948680 100644 --- a/indra/newview/llviewerwindowlistener.cpp +++ b/indra/newview/llviewerwindowlistener.cpp @@ -54,7 +54,7 @@ LLViewerWindowListener::LLViewerWindowListener(LLViewerWindow* llviewerwindow): // saveSnapshotArgs["type"] = LLSD::String(); add("saveSnapshot", "Save screenshot: [\"filename\"], [\"width\"], [\"height\"], [\"showui\"], [\"rebuild\"], [\"type\"]\n" - "type: \"COLOR\", \"DEPTH\", \"OBJECT_ID\"\n" + "type: \"COLOR\", \"DEPTH\"\n" "Post on [\"reply\"] an event containing [\"ok\"]", &LLViewerWindowListener::saveSnapshot, saveSnapshotArgs); @@ -71,7 +71,6 @@ void LLViewerWindowListener::saveSnapshot(const LLSD& event) const #define tp(name) types[#name] = LLViewerWindow::SNAPSHOT_TYPE_##name tp(COLOR); tp(DEPTH); - tp(OBJECT_ID); #undef tp // Our add() call should ensure that the incoming LLSD does in fact // contain our required arguments. Deal with the optional ones. diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index c31714de5a..7ae1f672e8 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -38,6 +38,7 @@ #include <ctype.h> #include "llaudioengine.h" +#include "llcachename.h" #include "noise.h" #include "sound_ids.h" @@ -45,8 +46,10 @@ #include "llagentcamera.h" #include "llagentwearables.h" #include "llanimationstates.h" +#include "llavatarnamecache.h" #include "llavatarpropertiesprocessor.h" #include "llviewercontrol.h" +#include "llcallingcard.h" // IDEVO for LLAvatarTracker #include "lldrawpoolavatar.h" #include "lldriverparam.h" #include "lleditingmotion.h" @@ -55,6 +58,8 @@ #include "llheadrotmotion.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" +#include "llhudnametag.h" +#include "llhudtext.h" // for mText/mDebugText #include "llkeyframefallmotion.h" #include "llkeyframestandmotion.h" #include "llkeyframewalkmotion.h" @@ -653,12 +658,14 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id, mAppearanceAnimating(FALSE), mNameString(), mTitle(), - mNameAway(FALSE), - mNameBusy(FALSE), - mNameMute(FALSE), + mNameAway(false), + mNameBusy(false), + mNameMute(false), + mNameAppearance(false), + mNameFriend(false), + mNameAlpha(0.f), mRenderGroupTitles(sRenderGroupTitles), - mNameAppearance(FALSE), - mNameCloud(FALSE), + mNameCloud(false), mFirstTEMessageReceived( FALSE ), mFirstAppearanceMessageReceived( FALSE ), mCulled( FALSE ), @@ -2772,8 +2779,18 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) && gSavedSettings.getS32("AvatarNameTagMode") )); } - if ( render_name ) + if ( !render_name ) { + if (mNameText) + { + // ...clean up old name tag + mNameText->markDead(); + mNameText = NULL; + sNumVisibleChatBubbles--; + } + return; + } + BOOL new_name = FALSE; if (visible_chat != mVisibleChat) { @@ -2789,7 +2806,6 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) // First Calculate Alpha // If alpha > 0, create mNameText if necessary, otherwise delete it - { F32 alpha = 0.f; if (mAppAngle > 5.f) { @@ -2810,66 +2826,62 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) alpha = (mAppAngle-2.f)/3.f; } - if (alpha > 0.f) + if (alpha <= 0.f) { + if (mNameText) + { + mNameText->markDead(); + mNameText = NULL; + sNumVisibleChatBubbles--; + } + return; + } + if (!mNameText) { - mNameText = (LLHUDText *)LLHUDObject::addHUDObject(LLHUDObject::LL_HUD_TEXT); - mNameText->setMass(10.f); + mNameText = static_cast<LLHUDNameTag*>( LLHUDObject::addHUDObject( + LLHUDObject::LL_HUD_NAME_TAG) ); + //mNameText->setMass(10.f); mNameText->setSourceObject(this); - mNameText->setVertAlignment(LLHUDText::ALIGN_VERT_TOP); + mNameText->setVertAlignment(LLHUDNameTag::ALIGN_VERT_TOP); mNameText->setVisibleOffScreen(TRUE); mNameText->setMaxLines(11); mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f); - mNameText->setUseBubble(TRUE); sNumVisibleChatBubbles++; new_name = TRUE; } - LLColor4 avatar_name_color = LLUIColorTable::instance().getColor( "AvatarNameColor" ); - avatar_name_color.setAlpha(alpha); - mNameText->setColor(avatar_name_color); + LLVector3 name_position = idleUpdateNameTagPosition(root_pos_last); + mNameText->setPositionAgent(name_position); - LLQuaternion root_rot = mRoot.getWorldRotation(); - mNameText->setUsePixelSize(TRUE); - LLVector3 pixel_right_vec; - LLVector3 pixel_up_vec; - LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec); - LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin(); - camera_to_av.normalize(); - LLVector3 local_camera_at = camera_to_av * ~root_rot; - LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis(); - local_camera_up.normalize(); - local_camera_up = local_camera_up * ~root_rot; + idleUpdateNameTagText(new_name); - local_camera_up.scaleVec(mBodySize * 0.5f); - local_camera_at.scaleVec(mBodySize * 0.5f); + idleUpdateNameTagAlpha(new_name, alpha); +} - LLVector3 name_position = mRoot.getWorldPosition() + - (local_camera_up * root_rot) - - (projected_vec(local_camera_at * root_rot, camera_to_av)); - name_position += pixel_up_vec * 15.f; - mNameText->setPositionAgent(name_position); - } - else if (mNameText) +void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) { - mNameText->markDead(); - mNameText = NULL; - sNumVisibleChatBubbles--; - } - } - LLNameValue *title = getNVPair("Title"); LLNameValue* firstname = getNVPair("FirstName"); LLNameValue* lastname = getNVPair("LastName"); - if (mNameText.notNull() && firstname && lastname) + // Avatars must have a first and last name + if (!firstname || !lastname) return; + + bool is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end(); + bool is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); + bool is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); + bool is_muted; + if (isSelf()) + { + is_muted = false; + } + else { - const BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end(); - const BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end(); - const BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end(); - const BOOL is_muted = isSelf() ? FALSE : LLMuteList::getInstance()->isMuted(getID()); - const BOOL is_cloud = getIsCloud(); + is_muted = LLMuteList::getInstance()->isMuted(getID()); + } + bool is_friend = LLAvatarTracker::instance().isBuddy(getID()); + bool is_cloud = getIsCloud(); if (gSavedSettings.getBOOL("DebugAvatarRezTime")) { @@ -2894,105 +2906,125 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) } } - if (mNameString.empty() || - new_name || - (!title && !mTitle.empty()) || - (title && mTitle != title->getString()) || - (is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute) + // Rebuild name tag if state change detected + if (mNameString.empty() + || new_name + || (!title && !mTitle.empty()) + || (title && mTitle != title->getString()) + || is_away != mNameAway + || is_busy != mNameBusy + || is_muted != mNameMute || is_appearance != mNameAppearance - || is_cloud != mNameCloud - ) - { - std::string line; - if (!sRenderGroupTitles) - { - // If all group titles are turned off, stack first name - // on a line above last name - line += firstname->getString(); - line += "\n"; - } - else if (title && title->getString() && title->getString()[0] != '\0') + || is_friend != mNameFriend + || is_cloud != mNameCloud) { - line += title->getString(); - LLStringFn::replace_ascii_controlchars(line,LL_UNKNOWN_CHAR); - line += "\n"; - line += firstname->getString(); - } - else - { - line += firstname->getString(); - } + LLColor4 name_tag_color = getNameTagColor(is_friend); - line += " "; - line += lastname->getString(); - BOOL need_comma = FALSE; + clearNameTag(); - if (is_away || is_muted || is_busy) + if (is_away || is_muted || is_busy || is_appearance) { - line += " ("; + std::string line; if (is_away) { line += LLTrans::getString("AvatarAway"); - need_comma = TRUE; + line += ", "; } if (is_busy) { - if (need_comma) + line += LLTrans::getString("AvatarBusy"); + line += ", "; + } + if (is_muted) { + line += LLTrans::getString("AvatarMuted"); line += ", "; } - line += LLTrans::getString("AvatarBusy"); - need_comma = TRUE; + if (is_appearance) + { + line += LLTrans::getString("AvatarEditingAppearance"); + line += ", "; } - if (is_muted) + if (is_cloud) { - if (need_comma) + line += LLTrans::getString("LoadingData"); + line += ", "; + } + // trim last ", " + line.resize( line.length() - 2 ); + addNameTagLine(line, name_tag_color, LLFontGL::NORMAL, + LLFontGL::getFontSansSerifSmall()); + } + + if (sRenderGroupTitles + && title && title->getString() && title->getString()[0] != '\0') { - line += ", "; + std::string title_str = title->getString(); + LLStringFn::replace_ascii_controlchars(title_str,LL_UNKNOWN_CHAR); + addNameTagLine(title_str, name_tag_color, LLFontGL::NORMAL, + LLFontGL::getFontSansSerifSmall()); } - line += LLTrans::getString("AvatarMuted"); - need_comma = TRUE; + + static LLUICachedControl<bool> show_display_names("NameTagShowDisplayNames"); + static LLUICachedControl<bool> show_usernames("NameTagShowUsernames"); + + if (LLAvatarNameCache::useDisplayNames()) + { + LLAvatarName av_name; + if (!LLAvatarNameCache::get(getID(), &av_name)) + { + // ...call this function back when the name arrives + // and force a rebuild + LLAvatarNameCache::get(getID(), + boost::bind(&LLVOAvatar::clearNameTag, this)); } - line += ")"; + + // Might be blank if name not available yet, that's OK + if (show_display_names) + { + addNameTagLine(av_name.mDisplayName, name_tag_color, LLFontGL::NORMAL, + LLFontGL::getFontSansSerif()); } - if (is_cloud) + // Suppress SLID display if display name matches exactly (ugh) + if (show_usernames && !av_name.mIsDisplayNameDefault) { - line += "\n"; - line += "(" + LLTrans::getString("LoadingData") + ")"; + // *HACK: Desaturate the color + LLColor4 username_color = name_tag_color * 0.83f; + addNameTagLine(av_name.mUsername, username_color, LLFontGL::NORMAL, + LLFontGL::getFontSansSerifSmall()); + } } - else if (is_appearance) + else { - line += "\n"; - line += LLTrans::getString("AvatarEditingAppearance"); + const LLFontGL* font = LLFontGL::getFontSansSerif(); + std::string full_name = + LLCacheName::buildFullName( firstname->getString(), lastname->getString() ); + addNameTagLine(full_name, name_tag_color, LLFontGL::NORMAL, font); } + mNameAway = is_away; mNameBusy = is_busy; mNameMute = is_muted; mNameAppearance = is_appearance; + mNameFriend = is_friend; mNameCloud = is_cloud; mTitle = title ? title->getString() : ""; LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR); - mNameString = utf8str_to_wstring(line); new_name = TRUE; } - if (visible_chat) + if (mVisibleChat) { - mNameText->setDropShadow(TRUE); mNameText->setFont(LLFontGL::getFontSansSerif()); - mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_LEFT); + mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_LEFT); mNameText->setFadeDistance(CHAT_NORMAL_RADIUS * 2.f, 5.f); - if (new_name) - { - mNameText->setLabel(mNameString); - } char line[MAX_STRING]; /* Flawfinder: ignore */ line[0] = '\0'; std::deque<LLChat>::iterator chat_iter = mChats.begin(); mNameText->clearString(); - LLColor4 new_chat = LLUIColorTable::instance().getColor( "AvatarNameColor" ); + LLColor4 new_chat = LLUIColorTable::instance().getColor( "NameTagChat" ); LLColor4 normal_chat = lerp(new_chat, LLColor4(0.8f, 0.8f, 0.8f, 1.f), 0.7f); LLColor4 old_chat = lerp(normal_chat, LLColor4(0.6f, 0.6f, 0.6f, 1.f), 0.7f); if (mTyping && mChats.size() >= MAX_BUBBLE_CHAT_UTTERANCES) @@ -3019,17 +3051,17 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) if (chat_fade_amt < 1.f) { F32 u = clamp_rescale(chat_fade_amt, 0.9f, 1.f, 0.f, 1.f); - mNameText->addLine(utf8str_to_wstring(chat_iter->mText), lerp(new_chat, normal_chat, u), style); + mNameText->addLine(chat_iter->mText, lerp(new_chat, normal_chat, u), style); } else if (chat_fade_amt < 2.f) { F32 u = clamp_rescale(chat_fade_amt, 1.9f, 2.f, 0.f, 1.f); - mNameText->addLine(utf8str_to_wstring(chat_iter->mText), lerp(normal_chat, old_chat, u), style); + mNameText->addLine(chat_iter->mText, lerp(normal_chat, old_chat, u), style); } else if (chat_fade_amt < 3.f) { // *NOTE: only remove lines down to minimum number - mNameText->addLine(utf8str_to_wstring(chat_iter->mText), old_chat, style); + mNameText->addLine(chat_iter->mText, old_chat, style); } } mNameText->setVisibleOffScreen(TRUE); @@ -3054,24 +3086,129 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last) } else { - mNameText->setFont(LLFontGL::getFontSansSerif()); - mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_CENTER); + // ...not using chat bubbles, just names + mNameText->setTextAlignment(LLHUDNameTag::ALIGN_TEXT_CENTER); mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f); mNameText->setVisibleOffScreen(FALSE); - if (new_name) + } +} + +void LLVOAvatar::addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font) +{ + llassert(mNameText); + if (mVisibleChat) + { + mNameText->addLabel(line); + } + else + { + mNameText->addLine(line, color, (LLFontGL::StyleFlags)style, font); + } + mNameString += line; + mNameString += '\n'; +} + +void LLVOAvatar::clearNameTag() +{ + mNameString.clear(); + if (mNameText) { mNameText->setLabel(""); - mNameText->setString(mNameString); + mNameText->setString( "" ); + } +} + +//static +void LLVOAvatar::invalidateNameTag(const LLUUID& agent_id) +{ + LLViewerObject* obj = gObjectList.findObject(agent_id); + if (!obj) return; + + LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(obj); + if (!avatar) return; + + avatar->clearNameTag(); +} + +//static +void LLVOAvatar::invalidateNameTags() +{ + std::vector<LLCharacter*>::iterator it = LLCharacter::sInstances.begin(); + for ( ; it != LLCharacter::sInstances.end(); ++it) + { + LLVOAvatar* avatar = dynamic_cast<LLVOAvatar*>(*it); + if (!avatar) continue; + if (avatar->isDead()) continue; + + avatar->clearNameTag(); } } + +// Compute name tag position during idle update +LLVector3 LLVOAvatar::idleUpdateNameTagPosition(const LLVector3& root_pos_last) +{ + LLQuaternion root_rot = mRoot.getWorldRotation(); + LLVector3 pixel_right_vec; + LLVector3 pixel_up_vec; + LLViewerCamera::getInstance()->getPixelVectors(root_pos_last, pixel_up_vec, pixel_right_vec); + LLVector3 camera_to_av = root_pos_last - LLViewerCamera::getInstance()->getOrigin(); + camera_to_av.normalize(); + LLVector3 local_camera_at = camera_to_av * ~root_rot; + LLVector3 local_camera_up = camera_to_av % LLViewerCamera::getInstance()->getLeftAxis(); + local_camera_up.normalize(); + local_camera_up = local_camera_up * ~root_rot; + + local_camera_up.scaleVec(mBodySize * 0.5f); + local_camera_at.scaleVec(mBodySize * 0.5f); + + LLVector3 name_position = mRoot.getWorldPosition() + + (local_camera_up * root_rot) - + (projected_vec(local_camera_at * root_rot, camera_to_av)); + name_position += pixel_up_vec * 15.f; + return name_position; + } + +void LLVOAvatar::idleUpdateNameTagAlpha(BOOL new_name, F32 alpha) +{ + llassert(mNameText); + + if (new_name + || alpha != mNameAlpha) + { + mNameText->setAlpha(alpha); + mNameAlpha = alpha; + } +} + +LLColor4 LLVOAvatar::getNameTagColor(bool is_friend) +{ + static LLUICachedControl<bool> show_friends("NameTagShowFriends"); + const char* color_name; + if (show_friends && is_friend) + { + color_name = "NameTagFriend"; + } + else if (LLAvatarNameCache::useDisplayNames()) + { + // ...color based on whether username "matches" a computed display + // name + LLAvatarName av_name; + if (LLAvatarNameCache::get(getID(), &av_name) + && av_name.mIsDisplayNameDefault) + { + color_name = "NameTagMatch"; } + else + { + color_name = "NameTagMismatch"; } - else if (mNameText) + } + else { - mNameText->markDead(); - mNameText = NULL; - sNumVisibleChatBubbles--; + // ...not using display names + color_name = "NameTagLegacy"; } + return LLUIColorTable::getInstance()->getColor( color_name ); } void LLVOAvatar::idleUpdateBelowWater() @@ -3855,7 +3992,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass) // *NOTE: this is disabled (there is no UI for enabling sShowFootPlane) due // to DEV-14477. the code is left here to aid in tracking down the cause // of the crash in the future. -brad - if (!gRenderForSelect && sShowFootPlane && mDrawable.notNull()) + if (sShowFootPlane && mDrawable.notNull()) { LLVector3 slaved_pos = mDrawable->getPositionAgent(); LLVector3 foot_plane_normal(mFootPlane.mV[VX], mFootPlane.mV[VY], mFootPlane.mV[VZ]); @@ -6748,7 +6885,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) { releaseComponentTextures(); } - + // parse visual params S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam); bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing @@ -6843,9 +6980,9 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys ) llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl; LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID()); mRuthTimer.reset(); - } - else - { + } + else + { llinfos << "That's okay, we already have a non-default shape for object: " << getID() << llendl; // we don't really care. } @@ -7727,6 +7864,7 @@ BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMorphNodes(LLXmlTreeNode* root) //virtual void LLVOAvatar::updateRegion(LLViewerRegion *regionp) { + LLViewerObject::updateRegion(regionp); } std::string LLVOAvatar::getFullname() const @@ -7737,9 +7875,7 @@ std::string LLVOAvatar::getFullname() const LLNameValue* last = getNVPair("LastName"); if (first && last) { - name += first->getString(); - name += " "; - name += last->getString(); + name = LLCacheName::buildFullName( first->getString(), last->getString() ); } return name; diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index d51b8701af..a779a1735c 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -33,6 +33,8 @@ #include <string> #include <vector> +#include <boost/signals2.hpp> + #include "imageids.h" // IMG_INVISIBLE #include "llchat.h" #include "lldrawpoolalpha.h" @@ -59,7 +61,7 @@ extern const LLUUID ANIM_AGENT_WALK_ADJUST; class LLTexLayerSet; class LLVoiceVisualizer; -class LLHUDText; +class LLHUDNameTag; class LLHUDEffectSpiral; class LLTexGlobalColor; class LLVOAvatarBoneInfo; @@ -71,7 +73,8 @@ class LLVOAvatarSkeletonInfo; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ class LLVOAvatar : public LLViewerObject, - public LLCharacter + public LLCharacter, + public boost::signals2::trackable { public: friend class LLVOAvatarSelf; @@ -207,6 +210,15 @@ public: void idleUpdateLoadingEffect(); void idleUpdateWindEffect(); void idleUpdateNameTag(const LLVector3& root_pos_last); + void idleUpdateNameTagText(BOOL new_name); + LLVector3 idleUpdateNameTagPosition(const LLVector3& root_pos_last); + void idleUpdateNameTagAlpha(BOOL new_name, F32 alpha); + LLColor4 getNameTagColor(bool is_friend); + void clearNameTag(); + static void invalidateNameTag(const LLUUID& agent_id); + // force all name tags to rebuild, useful when display names turned on/off + static void invalidateNameTags(); + void addNameTagLine(const std::string& line, const LLColor4& color, S32 style, const LLFontGL* font); void idleUpdateRenderCost(); void idleUpdateBelowWater(); @@ -827,13 +839,15 @@ protected: static void getAnimLabels(LLDynamicArray<std::string>* labels); static void getAnimNames(LLDynamicArray<std::string>* names); private: - LLWString mNameString; + std::string mNameString; // UTF-8 title + name + status std::string mTitle; - BOOL mNameAway; - BOOL mNameBusy; - BOOL mNameMute; - BOOL mNameAppearance; - BOOL mNameCloud; + bool mNameAway; + bool mNameBusy; + bool mNameMute; + bool mNameAppearance; + bool mNameFriend; + bool mNameCloud; + F32 mNameAlpha; BOOL mRenderGroupTitles; //-------------------------------------------------------------------- @@ -841,7 +855,7 @@ private: //-------------------------------------------------------------------- public: LLFrameTimer mChatTimer; - LLPointer<LLHUDText> mNameText; + LLPointer<LLHUDNameTag> mNameText; private: LLFrameTimer mTimeVisible; std::deque<LLChat> mChats; diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index e5cbf65682..0250627d1b 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -806,7 +806,24 @@ void LLVOAvatarSelf::removeMissingBakedTextures() //virtual void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) { + // Save the global position + LLVector3d global_pos_from_old_region = getPositionGlobal(); + + // Change the region setRegion(regionp); + + if (regionp) + { // Set correct region-relative position from global coordinates + setPositionGlobal(global_pos_from_old_region); + + // Diagnostic info + //LLVector3d pos_from_new_region = getPositionGlobal(); + //llinfos << "pos_from_old_region is " << global_pos_from_old_region + // << " while pos_from_new_region is " << pos_from_new_region + // << llendl; + } + + if (!regionp || (regionp->getHandle() != mLastRegionHandle)) { if (mLastRegionHandle != 0) @@ -820,6 +837,9 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) F64 max = (mRegionCrossingCount == 1) ? 0 : LLViewerStats::getInstance()->getStat(LLViewerStats::ST_CROSSING_MAX); max = llmax(delta, max); LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_MAX, max); + + // Diagnostics + llinfos << "Region crossing took " << (F32)(delta * 1000.0) << " ms " << llendl; } if (regionp) { @@ -827,6 +847,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) } } mRegionCrossingTimer.reset(); + LLViewerObject::updateRegion(regionp); } //-------------------------------------------------------------------- diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 23a799ea3a..d13cf5ba38 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -123,6 +123,8 @@ public: //-------------------------------------------------------------------- // Region state //-------------------------------------------------------------------- + void resetRegionCrossingTimer() { mRegionCrossingTimer.reset(); } + private: U64 mLastRegionHandle; LLFrameTimer mRegionCrossingTimer; diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp index 0b903e62b1..145ee31260 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -28,6 +28,7 @@ #include "llvocache.h" #include "llerror.h" #include "llregionhandle.h" +#include "llviewercontrol.h" BOOL check_read(LLAPRFile* apr_file, void* src, S32 n_bytes) { @@ -44,25 +45,27 @@ BOOL check_write(LLAPRFile* apr_file, void* src, S32 n_bytes) //--------------------------------------------------------------------------- LLVOCacheEntry::LLVOCacheEntry(U32 local_id, U32 crc, LLDataPackerBinaryBuffer &dp) + : + mLocalID(local_id), + mCRC(crc), + mHitCount(0), + mDupeCount(0), + mCRCChangeCount(0) { - mLocalID = local_id; - mCRC = crc; - mHitCount = 0; - mDupeCount = 0; - mCRCChangeCount = 0; mBuffer = new U8[dp.getBufferSize()]; mDP.assignBuffer(mBuffer, dp.getBufferSize()); mDP = dp; } LLVOCacheEntry::LLVOCacheEntry() + : + mLocalID(0), + mCRC(0), + mHitCount(0), + mDupeCount(0), + mCRCChangeCount(0), + mBuffer(NULL) { - mLocalID = 0; - mCRC = 0; - mHitCount = 0; - mDupeCount = 0; - mCRCChangeCount = 0; - mBuffer = NULL; mDP.assignBuffer(mBuffer, 0); } @@ -73,7 +76,7 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) success = check_read(apr_file, &mLocalID, sizeof(U32)); if(success) -{ + { success = check_read(apr_file, &mCRC, sizeof(U32)); } if(success) @@ -83,27 +86,24 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) if(success) { success = check_read(apr_file, &mDupeCount, sizeof(S32)); -} + } if(success) -{ + { 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)) - { - // We've got a bogus size, skip reading it. - // We won't bother seeking, because the rest of this file - // is likely bogus, and will be tossed anyway. - llwarns << "Bogus cache entry, size " << size << ", aborting!" << llendl; - mLocalID = 0; - mCRC = 0; - mBuffer = NULL; - return; - } + // Corruption in the cache entries + if ((size > 10000) || (size < 1)) + { + // We've got a bogus size, skip reading it. + // We won't bother seeking, because the rest of this file + // is likely bogus, and will be tossed anyway. + llwarns << "Bogus cache entry, size " << size << ", aborting!" << llendl; + success = FALSE; + } } if(success && size > 0) { @@ -112,8 +112,8 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) if(success) { - mDP.assignBuffer(mBuffer, size); -} + mDP.assignBuffer(mBuffer, size); + } else { delete[] mBuffer ; @@ -125,6 +125,9 @@ LLVOCacheEntry::LLVOCacheEntry(LLAPRFile* apr_file) { mLocalID = 0; mCRC = 0; + mHitCount = 0; + mDupeCount = 0; + mCRCChangeCount = 0; mBuffer = NULL; } } @@ -221,7 +224,6 @@ BOOL LLVOCacheEntry::writeToFile(LLAPRFile* apr_file) const // 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"; @@ -230,11 +232,11 @@ LLVOCache* LLVOCache::sInstance = NULL; //static LLVOCache* LLVOCache::getInstance() -{ +{ if(!sInstance) { sInstance = new LLVOCache() ; -} + } return sInstance ; } @@ -257,15 +259,20 @@ void LLVOCache::destroyClass() LLVOCache::LLVOCache(): mInitialized(FALSE), mReadOnly(TRUE), - mNumEntries(0) + mNumEntries(0), + mCacheSize(1) { + mEnabled = gSavedSettings.getBOOL("ObjectCacheEnabled"); mLocalAPRFilePoolp = new LLVolatileAPRPool() ; } LLVOCache::~LLVOCache() { - writeCacheHeader(); - clearCacheInMemory(); + if(mEnabled) + { + writeCacheHeader(); + clearCacheInMemory(); + } delete mLocalAPRFilePoolp; } @@ -279,7 +286,7 @@ void LLVOCache::setDirNames(ELLPath location) void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version) { - if(mInitialized) + if(mInitialized || !mEnabled) { return ; } @@ -288,9 +295,9 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version) if (!mReadOnly) { LLFile::mkdir(mObjectCacheDirName); - } - mCacheSize = llmin(size, MAX_NUM_OBJECT_ENTRIES) ; - mCacheSize = llmax(mCacheSize, NUM_ENTRIES_TO_PURGE); + } + + mCacheSize = size; mMetaInfo.mVersion = cache_version; readCacheHeader(); @@ -406,6 +413,11 @@ BOOL LLVOCache::checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes) void LLVOCache::readCacheHeader() { + if(!mEnabled) + { + return ; + } + //clear stale info. clearCacheInMemory(); @@ -421,7 +433,7 @@ void LLVOCache::readCacheHeader() HeaderEntryInfo* entry ; mNumEntries = 0 ; - while(mNumEntries < MAX_NUM_OBJECT_ENTRIES) + while(mNumEntries < mCacheSize) { entry = new HeaderEntryInfo() ; if(!checkRead(apr_file, entry, sizeof(HeaderEntryInfo))) @@ -450,7 +462,7 @@ void LLVOCache::readCacheHeader() void LLVOCache::writeCacheHeader() { - if(mReadOnly) + if(mReadOnly || !mEnabled) { return ; } @@ -474,10 +486,10 @@ void LLVOCache::writeCacheHeader() } mNumEntries = mHeaderEntryQueue.size() ; - if(mNumEntries < MAX_NUM_OBJECT_ENTRIES) + if(mNumEntries < mCacheSize) { HeaderEntryInfo* entry = new HeaderEntryInfo() ; - for(S32 i = mNumEntries ; i < MAX_NUM_OBJECT_ENTRIES ; i++) + for(U32 i = mNumEntries ; i < mCacheSize; i++) { //fill the cache with the default entry. if(!checkWrite(apr_file, entry, sizeof(HeaderEntryInfo))) @@ -501,6 +513,10 @@ BOOL LLVOCache::updateEntry(const HeaderEntryInfo* entry) void LLVOCache::readFromCache(U64 handle, const LLUUID& id, LLVOCacheEntry::vocache_entry_map_t& cache_entry_map) { + if(!mEnabled) + { + return ; + } llassert_always(mInitialized); handle_entry_map_t::iterator iter = mHandleEntryMap.find(handle) ; @@ -570,6 +586,10 @@ void LLVOCache::purgeEntries() void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry::vocache_entry_map_t& cache_entry_map, BOOL dirty_cache) { + if(!mEnabled) + { + return ; + } llassert_always(mInitialized); if(mReadOnly) diff --git a/indra/newview/llvocache.h b/indra/newview/llvocache.h index 56b48ef705..ed2bc8bafe 100644 --- a/indra/newview/llvocache.h +++ b/indra/newview/llvocache.h @@ -30,6 +30,7 @@ #include "lluuid.h" #include "lldatapacker.h" #include "lldlinked.h" +#include "lldir.h" //--------------------------------------------------------------------------- @@ -128,6 +129,7 @@ private: BOOL checkWrite(LLAPRFile* apr_file, void* src, S32 n_bytes) ; private: + BOOL mEnabled; BOOL mInitialized ; BOOL mReadOnly ; HeaderMetaInfo mMetaInfo; @@ -142,7 +144,7 @@ private: static LLVOCache* sInstance ; public: static LLVOCache* getInstance() ; - static BOOL hasInstance() ; + static BOOL hasInstance() ; static void destroyClass() ; }; diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 9e3d61ae44..b692093fb9 100644 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -497,14 +497,28 @@ void LLVoiceChannelGroup::activate() mURI, mCredentials); -#if 0 // *TODO if (!gAgent.isInGroup(mSessionID)) // ad-hoc channel { - // Add the party to the list of people with which we've recently interacted. - for (/*people in the chat*/) - LLRecentPeople::instance().add(buddy_id); + LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionID); + // Adding ad-hoc call participants to Recent People List. + // If it's an outgoing ad-hoc, we can use mInitialTargetIDs that holds IDs of people we + // called(both online and offline) as source to get people for recent (STORM-210). + if (session->isOutgoingAdHoc()) + { + for (uuid_vec_t::iterator it = session->mInitialTargetIDs.begin(); + it!=session->mInitialTargetIDs.end();++it) + { + const LLUUID id = *it; + LLRecentPeople::instance().add(id); + } + } + // If this ad-hoc is incoming then trying to get ids of people from mInitialTargetIDs + // would lead to EXT-8246. So in this case we get them from speakers list. + else + { + LLIMModel::addSpeakersToRecent(mSessionID); + } } -#endif //Mic default state is OFF on initiating/joining Ad-Hoc/Group calls if (LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle()) diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index c8d338b0a3..7cef3c13d1 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -76,6 +76,9 @@ public: virtual void getChannelInfo(); virtual BOOL isActive(); virtual BOOL callStarted(); + + // Session name is a UI label used for feedback about which person, + // group, or phone number you are talking to const std::string& getSessionName() const { return mSessionName; } boost::signals2::connection setStateChangedCallback(const state_changed_signal_t::slot_type& callback) diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index e674fec053..019629084f 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -31,6 +31,8 @@ #include "llsdutil.h" +// Linden library includes +#include "llavatarnamecache.h" #include "llvoavatarself.h" #include "llbufferstream.h" #include "llfile.h" @@ -46,6 +48,8 @@ #include "llviewercontrol.h" #include "llkeyboard.h" #include "llappviewer.h" // for gDisconnected, gDisableVoice + +// Viewer includes #include "llmutelist.h" // to check for muted avatars #include "llagent.h" #include "llcachename.h" @@ -2807,12 +2811,16 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) void LLVivoxVoiceClient::checkFriend(const LLUUID& id) { - std::string name; buddyListEntry *buddy = findBuddy(id); // Make sure we don't add a name before it's been looked up. - if(gCacheName->getFullName(id, name)) + LLAvatarName av_name; + if(LLAvatarNameCache::get(id, &av_name)) { + // *NOTE: For now, we feed legacy names to Vivox because I don't know + // if their service can support a mix of new and old clients with + // different sorts of names. + std::string name = av_name.getLegacyName(); const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id); bool canSeeMeOnline = false; @@ -6364,16 +6372,18 @@ void LLVivoxVoiceClient::notifyFriendObservers() void LLVivoxVoiceClient::lookupName(const LLUUID &id) { - BOOL is_group = FALSE; - gCacheName->get(id, is_group, &LLVivoxVoiceClient::onAvatarNameLookup); + LLAvatarNameCache::get(id, + boost::bind(&LLVivoxVoiceClient::onAvatarNameCache, + this, _1, _2)); } -//static -void LLVivoxVoiceClient::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group) +void LLVivoxVoiceClient::onAvatarNameCache(const LLUUID& agent_id, + const LLAvatarName& av_name) { - std::string name = llformat("%s %s", first.c_str(), last.c_str()); - LLVivoxVoiceClient::getInstance()->avatarNameResolved(id, name); - + // For Vivox, we use the legacy name because I'm uncertain whether or + // not their service can tolerate switching to Username or Display Name + std::string legacy_name = av_name.getLegacyName(); + avatarNameResolved(agent_id, legacy_name); } void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name) diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 08f2f75a39..3ba517bf36 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -45,7 +45,7 @@ class LLVivoxProtocolParser; #endif #include "llvoiceclient.h" - +class LLAvatarName; class LLVivoxVoiceAccountProvisionResponder; class LLVivoxVoiceClientMuteListObserver; class LLVivoxVoiceClientFriendsObserver; @@ -649,7 +649,7 @@ protected: void leaveAudioSession(); void lookupName(const LLUUID &id); - static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); + void onAvatarNameCache(const LLUUID& id, const LLAvatarName& av_name); void avatarNameResolved(const LLUUID &id, const std::string &name); ///////////////////////////// diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index eba600b50a..2eb4398488 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -80,7 +80,7 @@ public: //============================================================================ LLVOSurfacePatch::LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) - : LLStaticViewerObject(id, LL_VO_SURFACE_PATCH, regionp), + : LLStaticViewerObject(id, pcode, regionp), mDirtiedPatch(FALSE), mPool(NULL), mBaseComp(0), diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 598938b710..71f08ec36d 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -60,8 +60,11 @@ const U32 WIDTH = (N_RES * WAVE_STEP); //128.f //64 // width of wave tile, in const F32 WAVE_STEP_INV = (1. / WAVE_STEP); -LLVOWater::LLVOWater(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp) -: LLStaticViewerObject(id, LL_VO_WATER, regionp) +LLVOWater::LLVOWater(const LLUUID &id, + const LLPCode pcode, + LLViewerRegion *regionp) : + LLStaticViewerObject(id, pcode, regionp), + mRenderType(LLPipeline::RENDER_TYPE_WATER) { // Terrain must draw during selection passes so it can block objects behind it. mbCanSelect = FALSE; @@ -114,7 +117,7 @@ LLDrawable *LLVOWater::createDrawable(LLPipeline *pipeline) { pipeline->allocDrawable(this); mDrawable->setLit(FALSE); - mDrawable->setRenderType(LLPipeline::RENDER_TYPE_WATER); + mDrawable->setRenderType(mRenderType); LLDrawPoolWater *pool = (LLDrawPoolWater*) gPipeline.getPool(LLDrawPool::POOL_WATER); @@ -152,11 +155,17 @@ BOOL LLVOWater::updateGeometry(LLDrawable *drawable) LLStrider<U16> indicesp; U16 index_offset; - S32 size = 16; - S32 num_quads = size*size; - face->setSize(4*num_quads, 6*num_quads); + // A quad is 4 vertices and 6 indices (making 2 triangles) + static const unsigned int vertices_per_quad = 4; + static const unsigned int indices_per_quad = 6; + const S32 size = gSavedSettings.getBOOL("RenderTransparentWater") ? 16 : 1; + + const S32 num_quads = size * size; + face->setSize(vertices_per_quad * num_quads, + indices_per_quad * num_quads); + if (face->mVertexBuffer.isNull()) { face->mVertexBuffer = new LLVertexBuffer(LLDrawPoolWater::VERTEX_DATA_MASK, GL_DYNAMIC_DRAW_ARB); @@ -268,6 +277,11 @@ U32 LLVOWater::getPartitionType() const return LLViewerRegion::PARTITION_WATER; } +U32 LLVOVoidWater::getPartitionType() const +{ + return LLViewerRegion::PARTITION_VOIDWATER; +} + LLWaterPartition::LLWaterPartition() : LLSpatialPartition(0, FALSE, 0) { @@ -275,3 +289,9 @@ LLWaterPartition::LLWaterPartition() mDrawableType = LLPipeline::RENDER_TYPE_WATER; mPartitionType = LLViewerRegion::PARTITION_WATER; } + +LLVoidWaterPartition::LLVoidWaterPartition() +{ + mDrawableType = LLPipeline::RENDER_TYPE_VOIDWATER; + mPartitionType = LLViewerRegion::PARTITION_VOIDWATER; +} diff --git a/indra/newview/llvowater.h b/indra/newview/llvowater.h index beefc3f17f..cb9584cabf 100644 --- a/indra/newview/llvowater.h +++ b/indra/newview/llvowater.h @@ -29,6 +29,7 @@ #include "llviewerobject.h" #include "llviewertexture.h" +#include "pipeline.h" #include "v2math.h" const U32 N_RES = 16; //32 // number of subdivisions of wave tile @@ -77,6 +78,19 @@ public: protected: BOOL mUseTexture; BOOL mIsEdgePatch; + S32 mRenderType; }; +class LLVOVoidWater : public LLVOWater +{ +public: + LLVOVoidWater(LLUUID const& id, LLPCode pcode, LLViewerRegion* regionp) : LLVOWater(id, pcode, regionp) + { + mRenderType = LLPipeline::RENDER_TYPE_VOIDWATER; + } + + /*virtual*/ U32 getPartitionType() const; +}; + + #endif // LL_VOSURFACEPATCH_H diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp index 7314894c2e..d239347810 100644 --- a/indra/newview/llwaterparammanager.cpp +++ b/indra/newview/llwaterparammanager.cpp @@ -89,7 +89,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false); + found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); if(found) { @@ -115,7 +115,7 @@ void LLWaterParamManager::loadAllPresets(const std::string& file_name) while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false); + found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); if(found) { name=name.erase(name.length()-4); diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 54accfe4ee..73a37a6993 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -78,36 +78,44 @@ void LLWeb::initClass() // static -void LLWeb::loadURL(const std::string& url) +void LLWeb::loadURL(const std::string& url, const std::string& target, const std::string& uuid) { - if (gSavedSettings.getBOOL("UseExternalBrowser")) + if(target == "_internal") + { + // Force load in the internal browser, as if with a blank target. + loadURLInternal(url, "", uuid); + } + else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) { loadURLExternal(url); } else { - loadURLInternal(url); + loadURLInternal(url, target, uuid); } } // static -void LLWeb::loadURLInternal(const std::string &url) +void LLWeb::loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid) { - LLFloaterReg::showInstance("media_browser", url); + LLFloaterMediaBrowser::create(url, target, uuid); } // static -void LLWeb::loadURLExternal(const std::string& url) +void LLWeb::loadURLExternal(const std::string& url, const std::string& uuid) { - loadURLExternal(url, true); + loadURLExternal(url, true, uuid); } // static -void LLWeb::loadURLExternal(const std::string& url, bool async) +void LLWeb::loadURLExternal(const std::string& url, bool async, const std::string& uuid) { + // Act like the proxy window was closed, since we won't be able to track targeted windows in the external browser. + LLViewerMedia::proxyWindowClosed(uuid); + LLSD payload; payload["url"] = url; LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, boost::bind(on_load_url_external_response, _1, _2, async)); diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index 1ba856babe..2915376583 100644 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -43,15 +43,19 @@ public: static void initClass(); /// Load the given url in the user's preferred web browser - static void loadURL(const std::string& url); + static void loadURL(const std::string& url, const std::string& target, const std::string& uuid = LLStringUtil::null); + static void loadURL(const std::string& url) { loadURL(url, LLStringUtil::null); } /// Load the given url in the user's preferred web browser - static void loadURL(const char* url) { loadURL( ll_safe_string(url) ); } + static void loadURL(const char* url, const std::string& target) { loadURL( ll_safe_string(url), target); } + static void loadURL(const char* url) { loadURL( ll_safe_string(url), LLStringUtil::null ); } /// Load the given url in the Second Life internal web browser - static void loadURLInternal(const std::string &url); + static void loadURLInternal(const std::string &url, const std::string& target, const std::string& uuid = LLStringUtil::null); + static void loadURLInternal(const std::string &url) { loadURLInternal(url, LLStringUtil::null); } /// Load the given url in the operating system's web browser, async if we want to return immediately /// before browser has spawned - static void loadURLExternal(const std::string& url); - static void loadURLExternal(const std::string& url, bool async); + static void loadURLExternal(const std::string& url) { loadURLExternal(url, LLStringUtil::null); }; + static void loadURLExternal(const std::string& url, const std::string& uuid); + static void loadURLExternal(const std::string& url, bool async, const std::string& uuid = LLStringUtil::null); /// Returns escaped url (eg, " " to "%20") - used by all loadURL methods static std::string escapeURL(const std::string& url); diff --git a/indra/newview/llwebsharing.cpp b/indra/newview/llwebsharing.cpp index 2b9e5cc8cb..43b1a320c3 100644 --- a/indra/newview/llwebsharing.cpp +++ b/indra/newview/llwebsharing.cpp @@ -3,31 +3,25 @@ * @author Aimee * @brief Web Snapshot Sharing * - * $LicenseInfo:firstyear=2010&license=viewergpl$ - * - * Copyright (c) 2010, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ * 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 + * 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. * - * 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 + * 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. * - * 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. + * 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 * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llwebsharing.h b/indra/newview/llwebsharing.h index 70046ff1d8..ad9c99c224 100644 --- a/indra/newview/llwebsharing.h +++ b/indra/newview/llwebsharing.h @@ -3,31 +3,25 @@ * @author Aimee * @brief Web Snapshot Sharing * - * $LicenseInfo:firstyear=2010&license=viewergpl$ - * - * Copyright (c) 2010, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2010&license=viewerlgpl$ * 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 + * 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. * - * 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 + * 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. * - * 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. + * 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 * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index 9b6047395a..e5f52dfc97 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -104,7 +104,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name) while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name, false); + found = gDirUtilp->getNextFileInDir(path_name, "*.xml", name); if(found) { @@ -130,7 +130,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name) while(found) { std::string name; - found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name, false); + found = gDirUtilp->getNextFileInDir(path_name2, "*.xml", name); if(found) { name=name.erase(name.length()-4); diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp index 5760d04a08..399442e5c4 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -55,6 +55,11 @@ #include "pipeline.h" #include "llappviewer.h" // for do_disconnect() +#include <deque> +#include <queue> +#include <map> +#include <cstring> + // // Globals // @@ -121,7 +126,10 @@ void LLWorld::destroyClass() LLViewerRegion* region_to_delete = *region_it++; removeRegion(region_to_delete->getHost()); } - LLVOCache::getInstance()->destroyClass() ; + if(LLVOCache::hasInstance()) + { + LLVOCache::getInstance()->destroyClass() ; + } LLViewerPartSim::getInstance()->destroyClass(); } @@ -423,14 +431,15 @@ BOOL LLWorld::positionRegionValidGlobal(const LLVector3d &pos_global) // Allow objects to go up to their radius underground. -F32 LLWorld::getMinAllowedZ(LLViewerObject* object) +F32 LLWorld::getMinAllowedZ(LLViewerObject* object, const LLVector3d &global_pos) { - F32 land_height = resolveLandHeightGlobal(object->getPositionGlobal()); + F32 land_height = resolveLandHeightGlobal(global_pos); F32 radius = 0.5f * object->getScale().length(); return land_height - radius; } + LLViewerRegion* LLWorld::resolveRegionGlobal(LLVector3 &pos_region, const LLVector3d &pos_global) { LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global); @@ -834,10 +843,69 @@ F32 LLWorld::getLandFarClip() const void LLWorld::setLandFarClip(const F32 far_clip) { + static S32 const rwidth = (S32)REGION_WIDTH_U32; + S32 const n1 = (llceil(mLandFarClip) - 1) / rwidth; + S32 const n2 = (llceil(far_clip) - 1) / rwidth; + bool need_water_objects_update = n1 != n2; + mLandFarClip = far_clip; + + if (need_water_objects_update) + { + updateWaterObjects(); + } } +// Some region that we're connected to, but not the one we're in, gave us +// a (possibly) new water height. Update it in our local copy. +void LLWorld::waterHeightRegionInfo(std::string const& sim_name, F32 water_height) +{ + for (region_list_t::iterator iter = mRegionList.begin(); iter != mRegionList.end(); ++iter) + { + if ((*iter)->getName() == sim_name) + { + (*iter)->setWaterHeight(water_height); + break; + } + } +} +// There are three types of water objects: +// Region water objects: the water in a region. +// Hole water objects: water in the void but within current draw distance. +// Edge water objects: the water outside the draw distance, up till the horizon. +// +// For example: +// +// -----------------------horizon------------------------- +// | | | | +// | Edge Water | | | +// | | | | +// | | | | +// | | | | +// | | | | +// | | rwidth | | +// | | <-----> | | +// ------------------------------------------------------- +// | |Hole |other| | | +// | |Water|reg. | | | +// | |-----------------| | +// | |other|cur. |<--> | | +// | |reg. | reg.| \__|_ draw distance | +// | |-----------------| | +// | | | |<--->| | +// | | | | \__|_ range | +// ------------------------------------------------------- +// | |<----width------>|<--horizon ext.->| +// | | | | +// | | | | +// | | | | +// | | | | +// | | | | +// | | | | +// | | | | +// ------------------------------------------------------- +// void LLWorld::updateWaterObjects() { if (!gAgent.getRegion()) @@ -850,128 +918,265 @@ void LLWorld::updateWaterObjects() return; } - // First, determine the min and max "box" of water objects - S32 min_x = 0; - S32 min_y = 0; - S32 max_x = 0; - S32 max_y = 0; + // Region width in meters. + S32 const rwidth = (S32)REGION_WIDTH_U32; + + // The distance we might see into the void + // when standing on the edge of a region, in meters. + S32 const draw_distance = llceil(mLandFarClip); + + // We can only have "holes" in the water (where there no region) if we + // can have existing regions around it. Taking into account that this + // code is only executed when we enter a region, and not when we walk + // around in it, we (only) need to take into account regions that fall + // within the draw_distance. + // + // Set 'range' to draw_distance, rounded up to the nearest multiple of rwidth. + S32 const nsims = (draw_distance + rwidth - 1) / rwidth; + S32 const range = nsims * rwidth; + + // Get South-West corner of current region. + LLViewerRegion const* regionp = gAgent.getRegion(); U32 region_x, region_y; - - S32 rwidth = 256; - - // We only want to fill in water for stuff that's near us, say, within 256 or 512m - S32 range = LLViewerCamera::getInstance()->getFar() > 256.f ? 512 : 256; - - LLViewerRegion* regionp = gAgent.getRegion(); from_region_handle(regionp->getHandle(), ®ion_x, ®ion_y); - min_x = (S32)region_x - range; - min_y = (S32)region_y - range; - max_x = (S32)region_x + range; - max_y = (S32)region_y + range; + // The min. and max. coordinates of the South-West corners of the Hole water objects. + S32 const min_x = (S32)region_x - range; + S32 const min_y = (S32)region_y - range; + S32 const max_x = (S32)region_x + range; + S32 const max_y = (S32)region_y + range; + + // Attempt to determine a sensible water height for all the + // Hole Water objects. + // + // It make little sense to try to guess what the best water + // height should be when that isn't completely obvious: if it's + // impossible to satisfy every region's water height without + // getting a jump in the water height. + // + // In order to keep the reasoning simple, we assume something + // logical as a group of connected regions, where the coastline + // is at the outer edge. Anything more complex that would "break" + // under such an assumption would probably break anyway (would + // depend on terrain editing and existing mega prims, say, if + // anything would make sense at all). + // + // So, what we do is find all connected regions within the + // draw distance that border void, and then pick the lowest + // water height of those (coast) regions. + S32 const n = 2 * nsims + 1; + S32 const origin = nsims + nsims * n; + std::vector<F32> water_heights(n * n); + std::vector<U8> checked(n * n, 0); // index = nx + ny * n + origin; + U8 const region_bit = 1; + U8 const hole_bit = 2; + U8 const bordering_hole_bit = 4; + U8 const bordering_edge_bit = 8; + // Use the legacy waterheight for the Edge water in the case + // that we don't find any Hole water at all. + F32 water_height = DEFAULT_WATER_HEIGHT; + int max_count = 0; + LL_DEBUGS("WaterHeight") << "Current region: " << regionp->getName() << "; water height: " << regionp->getWaterHeight() << " m." << LL_ENDL; + std::map<S32, int> water_height_counts; + typedef std::queue<std::pair<S32, S32>, std::deque<std::pair<S32, S32> > > nxny_pairs_type; + nxny_pairs_type nxny_pairs; + nxny_pairs.push(nxny_pairs_type::value_type(0, 0)); + water_heights[origin] = regionp->getWaterHeight(); + checked[origin] = region_bit; + // For debugging purposes. + int number_of_connected_regions = 1; + int uninitialized_regions = 0; + int bordering_hole = 0; + int bordering_edge = 0; + while(!nxny_pairs.empty()) + { + S32 const nx = nxny_pairs.front().first; + S32 const ny = nxny_pairs.front().second; + LL_DEBUGS("WaterHeight") << "nx,ny = " << nx << "," << ny << LL_ENDL; + S32 const index = nx + ny * n + origin; + nxny_pairs.pop(); + for (S32 dir = 0; dir < 4; ++dir) + { + S32 const cnx = nx + gDirAxes[dir][0]; + S32 const cny = ny + gDirAxes[dir][1]; + LL_DEBUGS("WaterHeight") << "dir = " << dir << "; cnx,cny = " << cnx << "," << cny << LL_ENDL; + S32 const cindex = cnx + cny * n + origin; + bool is_hole = false; + bool is_edge = false; + LLViewerRegion* new_region_found = NULL; + if (cnx < -nsims || cnx > nsims || + cny < -nsims || cny > nsims) + { + LL_DEBUGS("WaterHeight") << " Edge Water!" << LL_ENDL; + // Bumped into Edge water object. + is_edge = true; + } + else if (checked[cindex]) + { + LL_DEBUGS("WaterHeight") << " Already checked before!" << LL_ENDL; + // Already checked. + is_hole = (checked[cindex] & hole_bit); + } + else + { + S32 x = (S32)region_x + cnx * rwidth; + S32 y = (S32)region_y + cny * rwidth; + U64 region_handle = to_region_handle(x, y); + new_region_found = getRegionFromHandle(region_handle); + is_hole = !new_region_found; + checked[cindex] = is_hole ? hole_bit : region_bit; + } + if (is_hole) + { + // This was a region that borders at least one 'hole'. + // Count the found coastline. + F32 new_water_height = water_heights[index]; + LL_DEBUGS("WaterHeight") << " This is void; counting coastline with water height of " << new_water_height << LL_ENDL; + S32 new_water_height_cm = llround(new_water_height * 100); + int count = (water_height_counts[new_water_height_cm] += 1); + // Just use the lowest water height: this is mainly about the horizon water, + // and whatever we do, we don't want it to be possible to look under the water + // when looking in the distance: it is better to make a step downwards in water + // height when going away from the avie than a step upwards. However, since + // everyone is used to DEFAULT_WATER_HEIGHT, don't allow a single region + // to drag the water level below DEFAULT_WATER_HEIGHT on it's own. + if (bordering_hole == 0 || // First time we get here. + (new_water_height >= DEFAULT_WATER_HEIGHT && + new_water_height < water_height) || + (new_water_height < DEFAULT_WATER_HEIGHT && + count > max_count) + ) + { + water_height = new_water_height; + } + if (count > max_count) + { + max_count = count; + } + if (!(checked[index] & bordering_hole_bit)) + { + checked[index] |= bordering_hole_bit; + ++bordering_hole; + } + } + else if (is_edge && !(checked[index] & bordering_edge_bit)) + { + checked[index] |= bordering_edge_bit; + ++bordering_edge; + } + if (!new_region_found) + { + // Dead end, there is no region here. + continue; + } + // Found a new connected region. + ++number_of_connected_regions; + if (new_region_found->getName().empty()) + { + // Uninitialized LLViewerRegion, don't use it's water height. + LL_DEBUGS("WaterHeight") << " Uninitialized region." << LL_ENDL; + ++uninitialized_regions; + continue; + } + nxny_pairs.push(nxny_pairs_type::value_type(cnx, cny)); + water_heights[cindex] = new_region_found->getWaterHeight(); + LL_DEBUGS("WaterHeight") << " Found a new region (name: " << new_region_found->getName() << "; water height: " << water_heights[cindex] << " m)!" << LL_ENDL; + } + } + llinfos << "Number of connected regions: " << number_of_connected_regions << " (" << uninitialized_regions << + " uninitialized); number of regions bordering Hole water: " << bordering_hole << + "; number of regions bordering Edge water: " << bordering_edge << llendl; + llinfos << "Coastline count (height, count): "; + bool first = true; + for (std::map<S32, int>::iterator iter = water_height_counts.begin(); iter != water_height_counts.end(); ++iter) + { + if (!first) llcont << ", "; + llcont << "(" << (iter->first / 100.f) << ", " << iter->second << ")"; + first = false; + } + llcont << llendl; + llinfos << "Water height used for Hole and Edge water objects: " << water_height << llendl; - F32 height = 0.f; - - for (region_list_t::iterator iter = mRegionList.begin(); - iter != mRegionList.end(); ++iter) + // Update all Region water objects. + for (region_list_t::iterator iter = mRegionList.begin(); iter != mRegionList.end(); ++iter) { LLViewerRegion* regionp = *iter; LLVOWater* waterp = regionp->getLand().getWaterObj(); - height += regionp->getWaterHeight(); if (waterp) { gObjectList.updateActive(waterp); } } + // Clean up all existing Hole water objects. for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin(); - iter != mHoleWaterObjects.end(); ++ iter) + iter != mHoleWaterObjects.end(); ++iter) { LLVOWater* waterp = *iter; gObjectList.killObject(waterp); } mHoleWaterObjects.clear(); - // Now, get a list of the holes - S32 x, y; - for (x = min_x; x <= max_x; x += rwidth) + // Let the Edge and Hole water boxes be 1024 meter high so that they + // are never too small to be drawn (A LL_VO_*_WATER box has water + // rendered on it's bottom surface only), and put their bottom at + // the current regions water height. + F32 const box_height = 1024; + F32 const water_center_z = water_height + box_height / 2; + + // Create new Hole water objects within 'range' where there is no region. + for (S32 x = min_x; x <= max_x; x += rwidth) { - for (y = min_y; y <= max_y; y += rwidth) + for (S32 y = min_y; y <= max_y; y += rwidth) { U64 region_handle = to_region_handle(x, y); if (!getRegionFromHandle(region_handle)) { - LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion()); + LLVOWater* waterp = (LLVOWater*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER, gAgent.getRegion()); waterp->setUseTexture(FALSE); - waterp->setPositionGlobal(LLVector3d(x + rwidth/2, - y + rwidth/2, - 256.f+DEFAULT_WATER_HEIGHT)); - waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 512.f)); + waterp->setPositionGlobal(LLVector3d(x + rwidth / 2, y + rwidth / 2, water_center_z)); + waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, box_height)); gPipeline.createObject(waterp); mHoleWaterObjects.push_back(waterp); } } } - // Update edge water objects - S32 wx, wy; - S32 center_x, center_y; - wx = (max_x - min_x) + rwidth; - wy = (max_y - min_y) + rwidth; - center_x = min_x + (wx >> 1); - center_y = min_y + (wy >> 1); - - S32 add_boundary[4] = { - 512 - (max_x - region_x), - 512 - (max_y - region_y), - 512 - (region_x - min_x), - 512 - (region_y - min_y) }; + // Center of the region. + S32 const center_x = region_x + rwidth / 2; + S32 const center_y = region_y + rwidth / 2; + // Width of the area with Hole water objects. + S32 const width = rwidth + 2 * range; + S32 const horizon_extend = 2048 + 512 - range; // Legacy value. + // The overlap is needed to get rid of sky pixels being visible between the + // Edge and Hole water object at greater distances (due to floating point + // round off errors). + S32 const edge_hole_overlap = 1; // Twice the actual overlap. - S32 dir; - for (dir = 0; dir < 8; dir++) + for (S32 dir = 0; dir < 8; ++dir) { - S32 dim[2] = { 0 }; - switch (gDirAxes[dir][0]) - { - case -1: dim[0] = add_boundary[2]; break; - case 0: dim[0] = wx; break; - default: dim[0] = add_boundary[0]; break; - } - switch (gDirAxes[dir][1]) - { - case -1: dim[1] = add_boundary[3]; break; - case 0: dim[1] = wy; break; - default: dim[1] = add_boundary[1]; break; - } + // Size of the Edge water objects. + S32 const dim_x = (gDirAxes[dir][0] == 0) ? width : (horizon_extend + edge_hole_overlap); + S32 const dim_y = (gDirAxes[dir][1] == 0) ? width : (horizon_extend + edge_hole_overlap); + // And their position. + S32 const water_center_x = center_x + (width + horizon_extend) / 2 * gDirAxes[dir][0]; + S32 const water_center_y = center_y + (width + horizon_extend) / 2 * gDirAxes[dir][1]; - // Resize and reshape the water objects - const S32 water_center_x = center_x + llround((wx + dim[0]) * 0.5f * gDirAxes[dir][0]); - const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]); - LLVOWater* waterp = mEdgeWaterObjects[dir]; if (!waterp || waterp->isDead()) { // The edge water objects can be dead because they're attached to the region that the // agent was in when they were originally created. - mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, - gAgent.getRegion()); + mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_VOID_WATER, gAgent.getRegion()); waterp = mEdgeWaterObjects[dir]; waterp->setUseTexture(FALSE); - waterp->setIsEdgePatch(TRUE); + waterp->setIsEdgePatch(TRUE); // Mark that this is edge water and not hole water. gPipeline.createObject(waterp); } waterp->setRegion(gAgent.getRegion()); - LLVector3d water_pos(water_center_x, water_center_y, - DEFAULT_WATER_HEIGHT+256.f); - LLVector3 water_scale((F32) dim[0], (F32) dim[1], 512.f); - - //stretch out to horizon - water_scale.mV[0] += fabsf(2048.f * gDirAxes[dir][0]); - water_scale.mV[1] += fabsf(2048.f * gDirAxes[dir][1]); - - water_pos.mdV[0] += 1024.f * gDirAxes[dir][0]; - water_pos.mdV[1] += 1024.f * gDirAxes[dir][1]; + LLVector3d water_pos(water_center_x, water_center_y, water_center_z); + LLVector3 water_scale((F32) dim_x, (F32) dim_y, box_height); waterp->setPositionGlobal(water_pos); waterp->setScale(water_scale); diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index 4465fde210..d8ab4bc508 100644 --- a/indra/newview/llworld.h +++ b/indra/newview/llworld.h @@ -89,7 +89,7 @@ public: // Return the lowest allowed Z point to prevent objects from being moved // underground. - F32 getMinAllowedZ(LLViewerObject* object); + F32 getMinAllowedZ(LLViewerObject* object, const LLVector3d &global_pos); // takes a line segment defined by point_a and point_b, then // determines the closest (to point_a) point of intersection that is @@ -137,6 +137,7 @@ public: LLViewerTexture *getDefaultWaterTexture(); void updateWaterObjects(); + void waterHeightRegionInfo(std::string const& sim_name, F32 water_height); void shiftRegions(const LLVector3& offset); void setSpaceTimeUSec(const U64 space_time_usec); diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 0c17b5e297..8ef3a3b839 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -880,8 +880,10 @@ void LLWorldMapView::drawFrustum() F32 half_width_meters = far_clip_meters * tan( horiz_fov / 2 ); F32 half_width_pixels = half_width_meters * meters_to_pixels; - F32 ctr_x = getLocalRect().getWidth() * 0.5f + sPanX; - F32 ctr_y = getLocalRect().getHeight() * 0.5f + sPanY; + // Compute the frustum coordinates. Take the UI scale into account. + F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor"); + F32 ctr_x = (getLocalRect().getWidth() * 0.5f + sPanX) * ui_scale_factor; + F32 ctr_y = (getLocalRect().getHeight() * 0.5f + sPanY) * ui_scale_factor; gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b4a5777f10..15477e0a80 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -64,6 +64,8 @@ #include "llfloaterreg.h" #include "llgldbg.h" #include "llhudmanager.h" +#include "llhudnametag.h" +#include "llhudtext.h" #include "lllightconstants.h" #include "llresmgr.h" #include "llselectmgr.h" @@ -128,8 +130,6 @@ static S32 sDelayedVBOEnable = 0; BOOL gAvatarBacklight = FALSE; -BOOL gRenderForSelect = FALSE; - BOOL gDebugPipeline = FALSE; LLPipeline gPipeline; const LLMatrix4* gGLLastMatrix = NULL; @@ -531,7 +531,8 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mScreenWidth = resX; mScreenHeight = resY; - U32 samples = gSavedSettings.getU32("RenderFSAASamples"); + //never use more than 4 samples for render targets + U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4); U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); if (res_mod > 1 && res_mod < resX && res_mod < resY) @@ -552,8 +553,6 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); addDeferredAttachments(mDeferredScreen); - // always set viewport to desired size, since allocate resets the viewport - mScreen.allocate(resX, resY, GL_RGBA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); mEdgeMap.allocate(resX, resY, GL_ALPHA, FALSE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); @@ -596,7 +595,7 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) } - if (gGLManager.mHasFramebufferMultisample && samples > 1) + if (LLRenderTarget::sUseFBO && gGLManager.mHasFramebufferMultisample && samples > 1) { mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples); if (LLPipeline::sRenderDeferred) @@ -628,14 +627,14 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) //static void LLPipeline::updateRenderDeferred() { - BOOL deferred = (gSavedSettings.getBOOL("RenderDeferred") && - LLRenderTarget::sUseFBO && - LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && - gSavedSettings.getBOOL("VertexShaderEnable") && - gSavedSettings.getBOOL("RenderAvatarVP") && - (gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) && - !gUseWireframe; - + BOOL deferred = ((gSavedSettings.getBOOL("RenderDeferred") && + LLRenderTarget::sUseFBO && + LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && + gSavedSettings.getBOOL("VertexShaderEnable") && + gSavedSettings.getBOOL("RenderAvatarVP") && + gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) && + !gUseWireframe; + sRenderDeferred = deferred; } @@ -872,7 +871,7 @@ BOOL LLPipeline::canUseWindLightShadersOnObjects() const BOOL LLPipeline::canUseAntiAliasing() const { - return (gSavedSettings.getBOOL("RenderUseFBO")); + return TRUE; //(gSavedSettings.getBOOL("RenderUseFBO")); } void LLPipeline::unloadShaders() @@ -1637,20 +1636,14 @@ void LLPipeline::updateCull(LLCamera& camera, LLCullResult& result, S32 water_cl camera.disableUserClipPlane(); - if (gSky.mVOSkyp.notNull() && gSky.mVOSkyp->mDrawable.notNull()) + if (hasRenderType(LLPipeline::RENDER_TYPE_SKY) && + gSky.mVOSkyp.notNull() && + gSky.mVOSkyp->mDrawable.notNull()) { - // Hack for sky - always visible. - if (hasRenderType(LLPipeline::RENDER_TYPE_SKY)) - { - gSky.mVOSkyp->mDrawable->setVisible(camera); - sCull->pushDrawable(gSky.mVOSkyp->mDrawable); - gSky.updateCull(); - stop_glerror(); - } - } - else - { - llinfos << "No sky drawable!" << llendl; + gSky.mVOSkyp->mDrawable->setVisible(camera); + sCull->pushDrawable(gSky.mVOSkyp->mDrawable); + gSky.updateCull(); + stop_glerror(); } if (hasRenderType(LLPipeline::RENDER_TYPE_GROUND) && @@ -2113,6 +2106,7 @@ void LLPipeline::shiftObjects(const LLVector3 &offset) } LLHUDText::shiftAll(offset); + LLHUDNameTag::shiftAll(offset); display_update_camera(); } @@ -2219,6 +2213,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result) LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::RENDER_TYPE_TREE, LLPipeline::RENDER_TYPE_SKY, + LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_WATER, LLPipeline::END_RENDER_TYPES)) { @@ -3810,185 +3805,6 @@ void LLPipeline::renderDebug() gGL.flush(); } -void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render_transparent, const LLRect& screen_rect) -{ - assertInitialized(); - - gGL.setColorMask(true, false); - gPipeline.resetDrawOrders(); - - LLViewerCamera* camera = LLViewerCamera::getInstance(); - for (std::set<LLViewerObject*>::iterator iter = objects.begin(); iter != objects.end(); ++iter) - { - stateSort((*iter)->mDrawable, *camera); - } - - LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_SELECT); - - - - glMatrixMode(GL_MODELVIEW); - - LLGLSDefault gls_default; - LLGLSObjectSelect gls_object_select; - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - LLGLDepthTest gls_depth(GL_TRUE,GL_TRUE); - disableLights(); - - LLVertexBuffer::unbind(); - - //for each drawpool - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - LLGLState::checkClientArrays(); - U32 last_type = 0; - - // If we don't do this, we crash something on changing graphics settings - // from Medium -> Low, because we unload all the shaders and the - // draw pools aren't aware. I don't know if this has to be a separate - // loop before actual rendering. JC - for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter) - { - LLDrawPool *poolp = *iter; - if (poolp->isFacePool() && hasRenderType(poolp->getType())) - { - poolp->prerender(); - } - } - for (pool_set_t::iterator iter = mPools.begin(); iter != mPools.end(); ++iter) - { - LLDrawPool *poolp = *iter; - if (poolp->isFacePool() && hasRenderType(poolp->getType())) - { - LLFacePool* face_pool = (LLFacePool*) poolp; - face_pool->renderForSelect(); - LLVertexBuffer::unbind(); - gGLLastMatrix = NULL; - glLoadMatrixd(gGLModelView); - - if (poolp->getType() != last_type) - { - last_type = poolp->getType(); - LLGLState::checkStates(); - LLGLState::checkTextureChannels(); - LLGLState::checkClientArrays(); - } - } - } - - LLGLEnable alpha_test(GL_ALPHA_TEST); - if (render_transparent) - { - gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.f); - } - else - { - gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.2f); - } - - gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_COLOR); - gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA); - - U32 prim_mask = LLVertexBuffer::MAP_VERTEX | - LLVertexBuffer::MAP_TEXCOORD0; - - for (std::set<LLViewerObject*>::iterator i = objects.begin(); i != objects.end(); ++i) - { - LLViewerObject* vobj = *i; - LLDrawable* drawable = vobj->mDrawable; - if (vobj->isDead() || - vobj->isHUDAttachment() || - (LLSelectMgr::getInstance()->mHideSelectedObjects && vobj->isSelected()) || - drawable->isDead() || - !hasRenderType(drawable->getRenderType())) - { - continue; - } - - for (S32 j = 0; j < drawable->getNumFaces(); ++j) - { - LLFace* facep = drawable->getFace(j); - if (!facep->getPool()) - { - facep->renderForSelect(prim_mask); - } - } - } - - // pick HUD objects - if (isAgentAvatarValid() && sShowHUDAttachments) - { - glh::matrix4f save_proj(glh_get_current_projection()); - glh::matrix4f save_model(glh_get_current_modelview()); - - setup_hud_matrices(screen_rect); - for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); - iter != gAgentAvatarp->mAttachmentPoints.end(); ) - { - LLVOAvatar::attachment_map_t::iterator curiter = iter++; - LLViewerJointAttachment* attachment = curiter->second; - if (attachment->getIsHUDAttachment()) - { - for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin(); - attachment_iter != attachment->mAttachedObjects.end(); - ++attachment_iter) - { - if (LLViewerObject* attached_object = (*attachment_iter)) - { - LLDrawable* drawable = attached_object->mDrawable; - if (drawable->isDead()) - { - continue; - } - - for (S32 j = 0; j < drawable->getNumFaces(); ++j) - { - LLFace* facep = drawable->getFace(j); - if (!facep->getPool()) - { - facep->renderForSelect(prim_mask); - } - } - - //render child faces - LLViewerObject::const_child_list_t& child_list = attached_object->getChildren(); - for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin(); - iter != child_list.end(); iter++) - { - LLViewerObject* child = *iter; - LLDrawable* child_drawable = child->mDrawable; - for (S32 l = 0; l < child_drawable->getNumFaces(); ++l) - { - LLFace* facep = child_drawable->getFace(l); - if (!facep->getPool()) - { - facep->renderForSelect(prim_mask); - } - } - } - } - } - } - } - - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(save_proj.m); - glh_set_current_projection(save_proj); - - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(save_model.m); - glh_set_current_modelview(save_model); - - - } - - gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT); - - LLVertexBuffer::unbind(); - - gGL.setColorMask(true, true); -} - void LLPipeline::rebuildPools() { LLMemType mt(LLMemType::MTYPE_PIPELINE_REBUILD_POOLS); @@ -5010,6 +4826,10 @@ void LLPipeline::setLight(LLDrawable *drawablep, BOOL is_light) void LLPipeline::toggleRenderType(U32 type) { gPipeline.mRenderTypeEnabled[type] = !gPipeline.mRenderTypeEnabled[type]; + if (type == LLPipeline::RENDER_TYPE_WATER) + { + gPipeline.mRenderTypeEnabled[LLPipeline::RENDER_TYPE_VOIDWATER] = !gPipeline.mRenderTypeEnabled[LLPipeline::RENDER_TYPE_VOIDWATER]; + } } //static @@ -5332,7 +5152,8 @@ LLViewerObject* LLPipeline::lineSegmentIntersectInWorld(const LLVector3& start, ++iter) { LLVOAvatar* av = (LLVOAvatar*) *iter; - if (av->mNameText.notNull() && av->mNameText->lineSegmentIntersect(start, local_end, position)) + if (av->mNameText.notNull() + && av->mNameText->lineSegmentIntersect(start, local_end, position)) { drawable = av->mDrawable; local_end = position; @@ -7336,6 +7157,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) gPipeline.pushRenderTypeMask(); clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER, + LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_GROUND, LLPipeline::RENDER_TYPE_SKY, LLPipeline::RENDER_TYPE_CLOUDS, @@ -7388,6 +7210,7 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in) { camera.setFar(camera_in.getFar()); clearRenderTypeMask(LLPipeline::RENDER_TYPE_WATER, + LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_GROUND, END_RENDER_TYPES); stop_glerror(); @@ -7904,6 +7727,7 @@ void LLPipeline::generateGI(LLCamera& camera, LLVector3& lightDir, std::vector<L LLPipeline::RENDER_TYPE_TREE, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::RENDER_TYPE_WATER, + LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW, LLPipeline::RENDER_TYPE_AVATAR, LLPipeline::RENDER_TYPE_PASS_SIMPLE, @@ -8087,6 +7911,7 @@ void LLPipeline::generateSunShadow(LLCamera& camera) LLPipeline::RENDER_TYPE_TREE, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::RENDER_TYPE_WATER, + LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_PASS_ALPHA_SHADOW, LLPipeline::RENDER_TYPE_PASS_SIMPLE, LLPipeline::RENDER_TYPE_PASS_BUMP, diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index b80765dac6..3f785a99fe 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -245,7 +245,6 @@ public: void renderHighlights(); void renderDebug(); - void renderForSelect(std::set<LLViewerObject*>& objects, BOOL render_transparent, const LLRect& screen_rect); void rebuildPools(); // Rebuild pools void findReferences(LLDrawable *drawablep); // Find the lists which have references to this object @@ -359,6 +358,7 @@ public: RENDER_TYPE_AVATAR = LLDrawPool::POOL_AVATAR, RENDER_TYPE_TREE = LLDrawPool::POOL_TREE, RENDER_TYPE_INVISIBLE = LLDrawPool::POOL_INVISIBLE, + RENDER_TYPE_VOIDWATER = LLDrawPool::POOL_VOIDWATER, RENDER_TYPE_WATER = LLDrawPool::POOL_WATER, RENDER_TYPE_ALPHA = LLDrawPool::POOL_ALPHA, RENDER_TYPE_GLOW = LLDrawPool::POOL_GLOW, @@ -712,7 +712,6 @@ void render_bbox(const LLVector3 &min, const LLVector3 &max); void render_hud_elements(); extern LLPipeline gPipeline; -extern BOOL gRenderForSelect; extern BOOL gDebugPipeline; extern const LLMatrix4* gGLLastMatrix; diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index b489294f38..aeea2306f7 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -121,9 +121,6 @@ name="AlertTextColor" value="0.58 0.66 0.84 1" /> <color - name="AvatarNameColor" - reference="White" /> - <color name="AvatarListItemIconDefaultColor" reference="White" /> <color @@ -403,9 +400,6 @@ name="HighlightParentColor" value="0.67 0.83 0.96 1" /> <color - name="IMChatColor" - reference="LtGray" /> - <color name="IMHistoryBgColor" reference="Unused?" /> <color @@ -534,6 +528,29 @@ <color name="MultiSliderTriangleColor" reference="Unused?" /> + <!-- + <color + name="NameTagBackground" + value="0.85 0.85 0.85 0.80" /> + --> + <color + name="NameTagBackground" + value="0 0 0 1" /> + <color + name="NameTagChat" + reference="White" /> + <color + name="NameTagFriend" + value="0.447 0.784 0.663 1" /> + <color + name="NameTagLegacy" + reference="White" /> + <color + name="NameTagMatch" + reference="White" /> + <color + name="NameTagMismatch" + reference="White" /> <color name="NetMapBackgroundColor" value="0 0 0 1" /> @@ -568,6 +585,9 @@ name="NotifyTextColor" reference="White" /> <color + name="ObjectBubbleColor" + reference="DkGray_66" /> + <color name="ObjectChatColor" reference="EmphasisColor" /> <color @@ -744,9 +764,6 @@ name="SysWellItemSelected" value="0.3 0.3 0.3 1.0" /> <color - name="ChatToastAgentNameColor" - reference="EmphasisColor" /> - <color name="ColorSwatchBorderColor" value="0.45098 0.517647 0.607843 1"/> <color diff --git a/indra/newview/skins/default/textures/Rounded_Rect.png b/indra/newview/skins/default/textures/Rounded_Rect.png Binary files differnew file mode 100644 index 0000000000..c270c28039 --- /dev/null +++ b/indra/newview/skins/default/textures/Rounded_Rect.png diff --git a/indra/newview/skins/default/textures/icons/Copy.png b/indra/newview/skins/default/textures/icons/Copy.png Binary files differnew file mode 100644 index 0000000000..d45134e9dd --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Copy.png diff --git a/indra/newview/skins/default/textures/icons/Person_Check.png b/indra/newview/skins/default/textures/icons/Person_Check.png Binary files differnew file mode 100644 index 0000000000..f8638540d4 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Person_Check.png diff --git a/indra/newview/skins/default/textures/icons/Person_Star.png b/indra/newview/skins/default/textures/icons/Person_Star.png Binary files differnew file mode 100644 index 0000000000..ad10580ac4 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/Person_Star.png diff --git a/indra/newview/skins/default/textures/icons/pop_up_caution.png b/indra/newview/skins/default/textures/icons/pop_up_caution.png Binary files differnew file mode 100644 index 0000000000..78b681cb33 --- /dev/null +++ b/indra/newview/skins/default/textures/icons/pop_up_caution.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index fff118d69a..b2658d2525 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -110,7 +110,8 @@ with the same filename but different name <texture name="ComboButton_Off" file_name="widgets/ComboButton_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" /> <texture name="Container" file_name="containers/Container.png" preload="false" /> - + <texture name="Copy" file_name="icons/Copy.png" preload="false" /> + <texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" /> <texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" /> @@ -359,6 +360,8 @@ 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="Person_Check" file_name="icons/Person_Check.png" preload="false" /> + <texture name="Person_Star" file_name="icons/Person_Star.png" preload="false" /> <texture name="Permission_Visible_Online" file_name="icons/see_me_online.png" preload="false" /> <texture name="Permission_Visible_Map" file_name="icons/see_on_map.png" preload="false" /> @@ -393,6 +396,7 @@ with the same filename but different name <texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" /> + <texture name="Rounded_Rect" file_name="Rounded_Rect.png" preload="true" scale.left="6" scale.top="24" scale.right="58" scale.bottom="6" /> <texture name="Rounded_Square" file_name="rounded_square.j2c" preload="true" scale.left="16" scale.top="16" scale.right="112" scale.bottom="16" /> <texture name="Row_Selection" file_name="navbar/Row_Selection.png" preload="false" /> @@ -658,4 +662,13 @@ with the same filename but different name <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/> + <texture name="hint_background" file_name="windows/hint_background.png" preload="false" scale.left="8" scale.top="70" scale.right="195" scale.bottom="11"/> + <texture name="hint_arrow_left" file_name="windows/hint_arrow_left.png" preload="false"/> + <texture name="hint_arrow_right" file_name="windows/hint_arrow_right.png" preload="false"/> + <texture name="hint_arrow_up" file_name="windows/hint_arrow_up.png" preload="false"/> + <texture name="hint_arrow_down" file_name="windows/hint_arrow_down.png" preload="false"/> + <texture name="hint_arrow_lower_left" file_name="windows/hint_arrow_lower_left.png" preload="false"/> + + <texture name="Yellow_Gradient" file_name="windows/yellow_gradient.png"/> + <texture name="Popup_Caution" file_name="icons/pop_up_caution.png"/> </textures> diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_down.png b/indra/newview/skins/default/textures/windows/hint_arrow_down.png Binary files differnew file mode 100644 index 0000000000..ddadef0978 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/hint_arrow_down.png diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_left.png b/indra/newview/skins/default/textures/windows/hint_arrow_left.png Binary files differnew file mode 100644 index 0000000000..2794b967e8 --- /dev/null +++ b/indra/newview/skins/default/textures/windows/hint_arrow_left.png diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png b/indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png Binary files differnew file mode 100644 index 0000000000..0dfc99898d --- /dev/null +++ b/indra/newview/skins/default/textures/windows/hint_arrow_lower_left.png diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_right.png b/indra/newview/skins/default/textures/windows/hint_arrow_right.png Binary files differnew file mode 100644 index 0000000000..7ac57f805b --- /dev/null +++ b/indra/newview/skins/default/textures/windows/hint_arrow_right.png diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_up.png b/indra/newview/skins/default/textures/windows/hint_arrow_up.png Binary files differnew file mode 100644 index 0000000000..bb3e1c07fa --- /dev/null +++ b/indra/newview/skins/default/textures/windows/hint_arrow_up.png diff --git a/indra/newview/skins/default/textures/windows/hint_background.png b/indra/newview/skins/default/textures/windows/hint_background.png Binary files differnew file mode 100644 index 0000000000..cfac5deacb --- /dev/null +++ b/indra/newview/skins/default/textures/windows/hint_background.png diff --git a/indra/newview/skins/default/textures/windows/yellow_gradient.png b/indra/newview/skins/default/textures/windows/yellow_gradient.png Binary files differnew file mode 100644 index 0000000000..5fd847aaef --- /dev/null +++ b/indra/newview/skins/default/textures/windows/yellow_gradient.png diff --git a/indra/newview/skins/default/xui/da/floater_bumps.xml b/indra/newview/skins/default/xui/da/floater_bumps.xml index d22de6e7f1..1db2e93fd2 100644 --- a/indra/newview/skins/default/xui/da/floater_bumps.xml +++ b/indra/newview/skins/default/xui/da/floater_bumps.xml @@ -4,19 +4,19 @@ Ingen registreret </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] ramte dig + [TIME] [NAME] ramte dig </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] skubbede dig med et script + [TIME] [NAME] skubbede dig med et script </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] ramte dig med et objekt + [TIME] [NAME] ramte dig med et objekt </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] ramte dig med et scriptet objekt + [TIME] [NAME] ramte dig med et scriptet objekt </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] ramte dig med et fysisk objekt + [TIME] [NAME] ramte dig med et fysisk objekt </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml deleted file mode 100644 index a47e0d33df..0000000000 --- a/indra/newview/skins/default/xui/da/floater_customize.xml +++ /dev/null @@ -1,530 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UDSEENDE"> - <tab_container name="customize tab container"> - <text label="Krops Dele" name="body_parts_placeholder"> - Kropsdele - </text> - <panel label="Kropsbygning" name="Shape"> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - <button label="Krop" label_selected="Krop" name="Body"/> - <button label="Hoved" label_selected="Hoved" name="Head"/> - <button label="Øjne" label_selected="Øjne" name="Eyes"/> - <button label="Ører" label_selected="Ører" name="Ears"/> - <button label="Næse" label_selected="Næse" name="Nose"/> - <button label="Mund" label_selected="Mund" name="Mouth"/> - <button label="Kinder" label_selected="Kinder" name="Chin"/> - <button label="Overkrop" label_selected="Overkrop" name="Torso"/> - <button label="Ben" label_selected="Ben" name="Legs"/> - <radio_group name="sex radio"> - <radio_item label="Kvinde" name="radio" value="0"/> - <radio_item label="Mand" name="radio2" value="1"/> - </radio_group> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny kropsbygning ved at trække en sÃ¥dan fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Figur: - </text> - <button label="Lav ny krop" label_selected="Lav ny krop" name="Create New"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - </panel> - <panel label="Hud" name="Skin"> - <button label="Hudfarve" label_selected="Hudfarve" name="Skin Color"/> - <button label="Detaljer" label_selected="Detaljer" name="Face Detail"/> - <button label="Sminke" label_selected="Sminke" name="Makeup"/> - <button label="Kropsdetaljer" label_selected="Kropsdetaljer" name="Body Detail"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny hud ved at trække en sÃ¥dan fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Hud: - </text> - <texture_picker label="Tatoveringer hoved" name="Head Tattoos" tool_tip="Klik for at vælge et billede" width="98"/> - <texture_picker label="Tatover. overkrop" name="Upper Tattoos" tool_tip="Klik for at vælge et billede" width="98"/> - <texture_picker label="Tatover. underkrop" name="Lower Tattoos" tool_tip="Klik for at vælge et billede" width="98"/> - <button label="Lav ny hud" label_selected="Lav nyt hud" name="Create New"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="HÃ¥r" name="Hair"> - <button label="Farve" label_selected="Farve" name="Color"/> - <button label="Stil" label_selected="Stil" name="Style"/> - <button label="Øjenbryn" label_selected="Øjenbryn" name="Eyebrows"/> - <button label="Skæg" label_selected="Skæg" name="Facial"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et nyt hÃ¥r ved at trække et sÃ¥dant fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et fra bunden og bagefter 'tage det pÃ¥'. - </text> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - HÃ¥r: - </text> - <texture_picker label="Tekstur" name="Texture" tool_tip="Klik for at vælge et billede"/> - <button label="Lav nyt hÃ¥r" label_selected="Lav nyt hÃ¥r" name="Create New"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Øjne" name="Eyes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et nyt sæt øjne ved at trække et sÃ¥dant par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. - </text> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Øjne: - </text> - <texture_picker label="Iris" name="Iris" tool_tip="Klik for at vælge et billede"/> - <button label="Lav nye øjne" label_selected="Lav nye øjne" name="Create New"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <text label="Tøje" name="clothes_placeholder"> - Tøj - </text> - <panel label="Trøje" name="Shirt"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Lav ny trøje" label_selected="Lav ny trøje" name="Create New"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny trøje ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Trøje: - </text> - </panel> - <panel label="Bukser" name="Pants"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Lav nye bukser" label_selected="Lav nye bukser" name="Create New"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et nyt par bukser ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. - </text> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Bukser: - </text> - </panel> - <panel label="Sko" name="Shoes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et nyt par sko ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. - </text> - <button label="Lav nye sko" label_selected="Lav nye sko" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Sko: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Strømper" name="Socks"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et nyt par sokker ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. - </text> - <button label="Lav nye strømper" label_selected="Lav nye strømper" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Strømper: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Jakke" name="Jacket"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny jakke ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <button label="Lav ny jakke" label_selected="Lav ny jakke" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Jakke: - </text> - <texture_picker label="Stof øverst" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Stof nederst" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Handsker" name="Gloves"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et sæt nye handsker ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. - </text> - <button label="Lav nye handsker" label_selected="Lav nye handsker" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Handsker: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Undertrøje" name="Undershirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny undertrøje ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <button label="Lav ny undertrøje" label_selected="Lav ny undertrøje" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Undertrøje: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Underbukser" name="Underpants"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg et nyt par underbukser ved at trække et par fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette et par fra bunden og bagefter 'tage dem pÃ¥'. - </text> - <button label="Lav nye underbukser" label_selected="Lav nye underbukser" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Underbukser: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Nederdel" name="Skirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan ikke redigeres - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Fundet i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny nederdel ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <button label="Lav ny nederdel" label_selected="Lav ny nederdel" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at redigere denne del. - </text> - <text name="Item Action Label"> - Nederdel: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> - <color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at Ã¥bne farvevælger"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Annullér" label_selected="Annullér" name="Revert"/> - </panel> - <panel label="Tatovering" name="Tattoo"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: kan ikke ændre - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Placeret i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny tatovering ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at ændre denne. - </text> - <text name="Item Action Label"> - Tatovering: - </text> - <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> - </panel> - <panel label="Alpha" name="Alpha"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: kan ikke ændre - </text> - <text name="title_loading"> - [DESC]: indlæser... - </text> - <text name="title_not_worn"> - [DESC]: ikke bÃ¥ret - </text> - <text name="path"> - Placeret i [PATH] - </text> - <text name="not worn instructions"> - Vælg en ny 'alpha maske' ved at trække en fra din beholdning over pÃ¥ din avatar. Du kan ogsÃ¥ oprette en fra bunden og bagefter 'tage den pÃ¥'. - </text> - <button label="Lav ny "Alpha"" label_selected="Lav ny "Alpha"" name="Create New"/> - <text name="no modify instructions"> - Du har ikke rettigheder til at ændre denne. - </text> - <text name="Item Action Label"> - Alpha: - </text> - <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Alpha - hÃ¥r" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/> - <button label="Tag af" label_selected="Tag af" name="Take Off"/> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Gem som..." label_selected="Gem som..." name="Save As"/> - <button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/> - </panel> - </tab_container> - <scroll_container name="panel_container"/> - <button label="Script info" label_selected="Script info" name="script_info" tool_tip="Vis scripts vedhæftet pÃ¥ din avatar"/> - <button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/> - <button label="Annullér" label_selected="Annullér" name="Cancel"/> - <button label="OK" label_selected="OK" name="Ok"/> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_device_settings.xml b/indra/newview/skins/default/xui/da/floater_device_settings.xml deleted file mode 100644 index 06d431a8f9..0000000000 --- a/indra/newview/skins/default/xui/da/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="STEMME CHAT ENHEDSOPSÆTNING"/> diff --git a/indra/newview/skins/default/xui/da/floater_event.xml b/indra/newview/skins/default/xui/da/floater_event.xml index 1816144b45..58f2e555dd 100644 --- a/indra/newview/skins/default/xui/da/floater_event.xml +++ b/indra/newview/skins/default/xui/da/floater_event.xml @@ -1,72 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Event" name="Event" title="EVENT DETALJER"> - <floater.string name="none"> - ingen +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + follows="all" + height="400" + can_resize="true" + help_topic="event_details" + label="Event" + layout="topleft" + name="Event" + save_rect="true" + save_visibility="false" + title="EVENT DETAILS" + width="600"> + <floater.string + name="loading_text"> + Henter... </floater.string> - <floater.string name="notify"> - Meddel - </floater.string> - <floater.string name="dont_notify"> - Meddel ikke - </floater.string> - <floater.string name="moderate"> - Moderat - </floater.string> - <floater.string name="adult"> - Voksent - </floater.string> - <floater.string name="general"> - Generelt - </floater.string> - <floater.string name="unknown"> - Ukendt - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Event uden navn. - </text> - <text name="event_category"> - (ingen kategori) - </text> - <text name="event_runby_label"> - Afholdt af: - </text> - <text initial_value="(henter)" name="event_runby"/> - <text name="event_date_label"> - Dato: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - Varighed: - </text> - <text name="event_duration"> - 1 time - </text> - <text name="event_covercharge_label"> - Pris: - </text> - <text name="event_cover"> - Gratis - </text> - <text name="event_location_label"> - Lokation: - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="Rating:"/> - <text name="rating_value" value="ukendt"/> - <expandable_text name="event_desc"> - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - </expandable_text> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Opret event"/> - <button name="god_delete_event_btn" tool_tip="Slet event"/> - <button label="Giv besked" name="notify_btn"/> - <button label="Teleport" name="teleport_btn"/> - <button label="Kort" name="map_btn"/> - </layout_panel> - </layout_stack> + <floater.string + name="done_text"> + Done + </floater.string> + <web_browser + trusted_content="true" + follows="left|right|top|bottom" + layout="topleft" + left="10" + name="browser" + height="365" + width="580" + top="0"/> + <text + follows="bottom|left" + height="16" + layout="topleft" + left_delta="0" + name="status_text" + top_pad="10" + width="150" /> </floater> + diff --git a/indra/newview/skins/default/xui/da/floater_im.xml b/indra/newview/skins/default/xui/da/floater_im.xml deleted file mode 100644 index 776bc9ab13..0000000000 --- a/indra/newview/skins/default/xui/da/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Personlig samtale (IM)"> - <string name="only_user_message"> - Du er den eneste beboer i denne session. - </string> - <string name="offline_message"> - [FIRST] [LAST] er ikke logget pÃ¥. - </string> - <string name="invite_message"> - Tryk pÃ¥ [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. - </string> - <string name="muted_message"> - Du har blokeret denne beboer. Hvis du sender en besked til beboeren vil dette automatisk medføre fjernelse af blokeringen - </string> - <string name="generic_request_error"> - Kunne ikke etablere forbindelse, prøv igen senere - </string> - <string name="insufficient_perms_error"> - Du har ikke de fornødne rettigheder. - </string> - <string name="session_does_not_exist_error"> - Denne samtale er lukket ned - </string> - <string name="no_ability_error"> - Du har ikke den mulighed. - </string> - <string name="not_a_mod_error"> - Du er ikke moderator for denne samtale. - </string> - <string name="muted_error"> - Du er blevet "blokeret". - </string> - <string name="add_session_event"> - Kunne ikke tilføje beboere til chat session med [RECIPIENT]. - </string> - <string name="message_session_event"> - Ikke muligt at sende din besked til samtalen med [RECIPIENT]. - </string> - <string name="removed_from_group"> - Du er blevet fjernet fra gruppen. - </string> - <string name="close_on_no_ability"> - Du har ikke længere mulighed for at deltage i samtalen - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/da/floater_im_session.xml b/indra/newview/skins/default/xui/da/floater_im_session.xml index aa7df6ad2b..16df7e4b03 100644 --- a/indra/newview/skins/default/xui/da/floater_im_session.xml +++ b/indra/newview/skins/default/xui/da/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="IM kontrol panel" name="panel_im_control_panel"/> <layout_panel> <line_editor label="Til" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/da/floater_my_friends.xml b/indra/newview/skins/default/xui/da/floater_my_friends.xml deleted file mode 100644 index c3db53ce63..0000000000 --- a/indra/newview/skins/default/xui/da/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="KONTAKTER"> - <tab_container name="friends_and_groups"> - <panel label="Venner" name="friends_panel"/> - <panel label="Grupper" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml deleted file mode 100644 index 0bcb96b151..0000000000 --- a/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Gem sæt"> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Annullér" label_selected="Annullér" name="Cancel"/> - <text name="Save item as:"> - Gem hvad jeg har pÃ¥ som et nyt sæt: - </text> - <line_editor name="name ed"> - [DESC] (ny) - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_pay.xml b/indra/newview/skins/default/xui/da/floater_pay.xml index b2cdc0bfe7..5ebdd3f084 100644 --- a/indra/newview/skins/default/xui/da/floater_pay.xml +++ b/indra/newview/skins/default/xui/da/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Person"/> <text name="payee_name"> - [FIRST] [LAST] + Test Name That Is Extremely Long To Check Clipping </text> <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/da/floater_pay_object.xml b/indra/newview/skins/default/xui/da/floater_pay_object.xml index 368d678681..260b257c33 100644 --- a/indra/newview/skins/default/xui/da/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/da/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Person"/> <text name="payee_name"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text name="object_name_label"> Via objekt: diff --git a/indra/newview/skins/default/xui/da/floater_preview_classified.xml b/indra/newview/skins/default/xui/da/floater_preview_classified.xml deleted file mode 100644 index bc232f3e9f..0000000000 --- a/indra/newview/skins/default/xui/da/floater_preview_classified.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="ANNONCE INFORMATION"> - <floater.string name="Title"> - Annonce: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_event.xml b/indra/newview/skins/default/xui/da/floater_preview_event.xml deleted file mode 100644 index 3e870b58ae..0000000000 --- a/indra/newview/skins/default/xui/da/floater_preview_event.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="EVENT INFORMATION"> - <floater.string name="Title"> - Event: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml deleted file mode 100644 index 9892a92e4c..0000000000 --- a/indra/newview/skins/default/xui/da/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="BEVÆGELSE GENVEJ"/> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml deleted file mode 100644 index 4d4cca1d90..0000000000 --- a/indra/newview/skins/default/xui/da/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GENVEJ BEVÆGELSER"> - <text name="trigger_label"> - Chat: - </text> - <text name="key_label"> - Tastatur: - </text> - <combo_box label="Intet" name="modifier_combo"/> - <combo_box label="Intet" name="key_combo"/> - <text name="replace_text" tool_tip="Erstat udløser ord med disse ord. For eksempel uløser "hello" erstat med "hej" vil ændre chat 'Jeg ville bare sige hello' til 'Jeg ville bare sige hej' samtidig med bevægelsen afspilles!"> - Erstat: - </text> - <line_editor name="replace_editor" tool_tip="Erstat udløser ord med disse ord. For eksempel uløser "hello" erstat med "hej" vil ændre chat 'Jeg ville bare sige hello' til 'Jeg ville bare sige hej' samtidig med bevægelsen afspilles!"/> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml deleted file mode 100644 index 9892a92e4c..0000000000 --- a/indra/newview/skins/default/xui/da/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="BEVÆGELSE GENVEJ"/> diff --git a/indra/newview/skins/default/xui/da/floater_statistics.xml b/indra/newview/skins/default/xui/da/floater_statistics.xml deleted file mode 100644 index 8c33f3ecb3..0000000000 --- a/indra/newview/skins/default/xui/da/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATISTIK"/> diff --git a/indra/newview/skins/default/xui/da/floater_voice_controls.xml b/indra/newview/skins/default/xui/da/floater_voice_controls.xml index 2e59dfd649..4c956f13a7 100644 --- a/indra/newview/skins/default/xui/da/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/da/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Min avatar:"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Forlad opkald" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Forlad opkald" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml deleted file mode 100644 index 17d5b9c205..0000000000 --- a/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title=""> - <button label="Gem" label_selected="Gem" name="Save"/> - <button label="Annullér" label_selected="Annullér" name="Cancel"/> - <text name="Save item as:"> - Gem genstand i min beholdning som: - </text> - <line_editor name="name ed"> - Ny [DESC] - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml index 65f3f67a70..56f94b24e9 100644 --- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml +++ b/indra/newview/skins/default/xui/da/floater_windlight_options.xml @@ -1,18 +1,18 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL"> <text name="KeyFramePresetsText"> Faste indstillinger: </text> - <button label="Ny" label_selected="Ny" name="WLNewPreset"/> - <button label="Gem" label_selected="Gem" name="WLSavePreset"/> - <button label="Slet" label_selected="Slet" name="WLDeletePreset"/> - <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton"/> + <button label="Ny" label_selected="Ny" name="WLNewPreset" /> + <button label="Gem" label_selected="Gem" name="WLSavePreset" /> + <button label="Slet" label_selected="Slet" name="WLDeletePreset" /> + <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton" /> <tab_container name="WindLight Tabs"> <panel label="ATMOSFÆRE" name="Atmosphere"> <text name="BHText"> BlÃ¥ - horisont </text> - <button label="?" name="WLBlueHorizonHelp"/> + <button label="?" name="WLBlueHorizonHelp" /> <text name="BHText2"> R </text> @@ -25,19 +25,19 @@ <text name="BHText5"> I </text> - <slider label="" name="WLBlueHorizonR"/> - <slider label="" name="WLBlueHorizonG"/> - <slider label="" name="WLBlueHorizonB"/> - <slider label="" name="WLBlueHorizonI"/> + <slider label="" name="WLBlueHorizonR" /> + <slider label="" name="WLBlueHorizonG" /> + <slider label="" name="WLBlueHorizonB" /> + <slider label="" name="WLBlueHorizonI" /> <text name="BDensText"> Dis - horisont </text> - <button label="?" name="WLHazeHorizonHelp"/> - <slider label="" name="WLHazeHorizon"/> + <button label="?" name="WLHazeHorizonHelp" /> + <slider label="" name="WLHazeHorizon" /> <text name="BDensText2"> BlÃ¥ - tæthed </text> - <button label="?" name="WLBlueDensityHelp"/> + <button label="?" name="WLBlueDensityHelp" /> <text name="BHText6"> R </text> @@ -50,36 +50,36 @@ <text name="BHText9"> I </text> - <slider label="" name="WLBlueDensityR"/> - <slider label="" name="WLBlueDensityG"/> - <slider label="" name="WLBlueDensityB"/> - <slider label="" name="WLBlueDensityI"/> + <slider label="" name="WLBlueDensityR" /> + <slider label="" name="WLBlueDensityG" /> + <slider label="" name="WLBlueDensityB" /> + <slider label="" name="WLBlueDensityI" /> <text name="HDText"> Dis - intensitet </text> - <button label="?" name="WLHazeDensityHelp"/> - <slider label="" name="WLHazeDensity"/> + <button label="?" name="WLHazeDensityHelp" /> + <slider label="" name="WLHazeDensity" /> <text name="DensMultText"> Densitet faktor </text> - <button label="?" name="WLDensityMultHelp"/> - <slider label="" name="WLDensityMult"/> + <button label="?" name="WLDensityMultHelp" /> + <slider label="" name="WLDensityMult" /> <text name="WLDistanceMultText"> Distance faktor </text> - <button label="?" name="WLDistanceMultHelp"/> - <slider label="" name="WLDistanceMult"/> + <button label="?" name="WLDistanceMultHelp" /> + <slider label="" name="WLDistanceMult" /> <text name="MaxAltText"> Maximum højde </text> - <button label="?" name="WLMaxAltitudeHelp"/> - <slider label="" name="WLMaxAltitude"/> + <button label="?" name="WLMaxAltitudeHelp" /> + <slider label="" name="WLMaxAltitude" /> </panel> <panel label="LYS" name="Lighting"> <text name="SLCText"> Sol/MÃ¥ne farve </text> - <button label="?" name="WLSunlightColorHelp"/> + <button label="?" name="WLSunlightColorHelp" /> <text name="BHText"> R </text> @@ -92,19 +92,19 @@ <text name="BHText4"> I </text> - <slider label="" name="WLSunlightR"/> - <slider label="" name="WLSunlightG"/> - <slider label="" name="WLSunlightB"/> - <slider label="" name="WLSunlightI"/> + <slider label="" name="WLSunlightR" /> + <slider label="" name="WLSunlightG" /> + <slider label="" name="WLSunlightB" /> + <slider label="" name="WLSunlightI" /> <text name="TODText"> Sol/MÃ¥ne position </text> - <button label="?" name="WLTimeOfDayHelp"/> - <slider label="" name="WLSunAngle"/> + <button label="?" name="WLTimeOfDayHelp" /> + <slider label="" name="WLSunAngle" /> <text name="WLAmbientText"> Omgivende </text> - <button label="?" name="WLAmbientHelp"/> + <button label="?" name="WLAmbientHelp" /> <text name="BHText5"> R </text> @@ -117,37 +117,37 @@ <text name="BHText8"> I </text> - <slider label="" name="WLAmbientR"/> - <slider label="" name="WLAmbientG"/> - <slider label="" name="WLAmbientB"/> - <slider label="" name="WLAmbientI"/> + <slider label="" name="WLAmbientR" /> + <slider label="" name="WLAmbientG" /> + <slider label="" name="WLAmbientB" /> + <slider label="" name="WLAmbientI" /> <text name="WLEastAngleText"> Øst vinkel </text> - <button label="?" name="WLEastAngleHelp"/> - <slider label="" name="WLEastAngle"/> + <button label="?" name="WLEastAngleHelp" /> + <slider label="" name="WLEastAngle" /> <text name="SunGlowText"> Sol glød </text> - <button label="?" name="WLSunGlowHelp"/> - <slider label="Fokus " name="WLGlowB"/> - <slider label="Størr. " name="WLGlowR"/> + <button label="?" name="WLSunGlowHelp" /> + <slider label="Fokus " name="WLGlowB" /> + <slider label="Størr. " name="WLGlowR" /> <text name="SceneGammaText"> Lysintensitet (gamma) </text> - <button label="?" name="WLSceneGammaHelp"/> - <slider label="" name="WLGamma"/> + <button label="?" name="WLSceneGammaHelp" /> + <slider label="" name="WLGamma" /> <text name="WLStarText"> Stjerne intensitet </text> - <button label="?" name="WLStarBrightnessHelp"/> - <slider label="" name="WLStarAlpha"/> + <button label="?" name="WLStarBrightnessHelp" /> + <slider label="" name="WLStarAlpha" /> </panel> <panel label="SKYER" name="Clouds"> <text name="WLCloudColorText"> Farve pÃ¥ skyer </text> - <button label="?" name="WLCloudColorHelp"/> + <button label="?" name="WLCloudColorHelp" /> <text name="BHText"> R </text> @@ -160,14 +160,14 @@ <text name="BHText4"> I </text> - <slider label="" name="WLCloudColorR"/> - <slider label="" name="WLCloudColorG"/> - <slider label="" name="WLCloudColorB"/> - <slider label="" name="WLCloudColorI"/> + <slider label="" name="WLCloudColorR" /> + <slider label="" name="WLCloudColorG" /> + <slider label="" name="WLCloudColorB" /> + <slider label="" name="WLCloudColorI" /> <text name="WLCloudColorText2"> Skyer XY/Tæthed </text> - <button label="?" name="WLCloudDensityHelp"/> + <button label="?" name="WLCloudDensityHelp" /> <text name="BHText5"> X </text> @@ -177,23 +177,23 @@ <text name="BHText7"> T </text> - <slider label="" name="WLCloudX"/> - <slider label="" name="WLCloudY"/> - <slider label="" name="WLCloudDensity"/> + <slider label="" name="WLCloudX" /> + <slider label="" name="WLCloudY" /> + <slider label="" name="WLCloudDensity" /> <text name="WLCloudCoverageText"> Skydække </text> - <button label="?" name="WLCloudCoverageHelp"/> - <slider label="" name="WLCloudCoverage"/> + <button label="?" name="WLCloudCoverageHelp" /> + <slider label="" name="WLCloudCoverage" /> <text name="WLCloudScaleText"> Skystørrelse </text> - <button label="?" name="WLCloudScaleHelp"/> - <slider label="" name="WLCloudScale"/> + <button label="?" name="WLCloudScaleHelp" /> + <slider label="" name="WLCloudScale" /> <text name="WLCloudDetailText"> Sky detaljer(XY/tæthed) </text> - <button label="?" name="WLCloudDetailHelp"/> + <button label="?" name="WLCloudDetailHelp" /> <text name="BHText8"> X </text> @@ -203,23 +203,23 @@ <text name="BHText10"> T </text> - <slider label="" name="WLCloudDetailX"/> - <slider label="" name="WLCloudDetailY"/> - <slider label="" name="WLCloudDetailDensity"/> + <slider label="" name="WLCloudDetailX" /> + <slider label="" name="WLCloudDetailY" /> + <slider label="" name="WLCloudDetailDensity" /> <text name="WLCloudScrollXText"> Sky drift X </text> - <button label="?" name="WLCloudScrollXHelp"/> - <check_box label="LÃ¥s" name="WLCloudLockX"/> - <slider label="" name="WLCloudScrollX"/> + <button label="?" name="WLCloudScrollXHelp" /> + <check_box label="LÃ¥s" name="WLCloudLockX" /> + <slider label="" name="WLCloudScrollX" /> <text name="WLCloudScrollYText"> Sky drift Y </text> - <button label="?" name="WLCloudScrollYHelp"/> - <check_box label="LÃ¥s" name="WLCloudLockY"/> - <slider label="" name="WLCloudScrollY"/> - <check_box label="Benyt simple skyer" name="DrawClassicClouds"/> - <button label="?" name="WLClassicCloudsHelp"/> + <button label="?" name="WLCloudScrollYHelp" /> + <check_box label="LÃ¥s" name="WLCloudLockY" /> + <slider label="" name="WLCloudScrollY" /> + <check_box label="Benyt simple skyer" name="DrawClassicClouds" /> + <button label="?" name="WLClassicCloudsHelp" /> </panel> </tab_container> <string name="WLDefaultSkyNames"> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index eaae513e74..a8849861cf 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -931,10 +931,10 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati Erstattet manglende tøj/kropsdele med standard. </notification> <notification name="FriendOnline"> - [FIRST] [LAST] er Online + [NAME] er Online </notification> <notification name="FriendOffline"> - [FIRST] [LAST] er Offline + [NAME] er Offline </notification> <notification name="AddSelfFriend"> Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven. @@ -1002,9 +1002,6 @@ Prøv venligst igen. <notification name="CannotRemoveProtectedCategories"> Du kan ikke fjerne beskyttede kategorier. </notification> - <notification name="OfferedCard"> - Du har tilbudt et visitkort til [FIRST] [LAST] - </notification> <notification name="UnableToBuyWhileDownloading"> Ikke muligt at købe, imens genstandens data hentes. Prøv venligst igen. @@ -1085,8 +1082,7 @@ Prøv at vælge mindre stykker land. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teleportér"/> - <button name="Description" text="Beskrivelse"/> + <button name="Details" text="Beskrivelse"/> <button name="Cancel" text="Annullér"/> </form> </notification> @@ -1121,7 +1117,7 @@ Prøv venligst at geninstallere plugin eller kontakt leverandøren hvis probleme De genstande du ejer pÃ¥ det valgte stykke land er blevet returneret til din beholdning. </notification> <notification name="OtherObjectsReturned"> - Genstandene pÃ¥ det valgte stykke land der er ejet af [FIRST] [LAST] er blevet returneret til hans eller hendes beholdning. + Genstandene pÃ¥ det valgte stykke land der er ejet af [NAME] er blevet returneret til hans eller hendes beholdning. </notification> <notification name="OtherObjectsReturned2"> Objekterne i den valgte parcel, ejet af beboeren '[NAME]', er blevet returneret til deres ejer. @@ -1322,7 +1318,7 @@ Prøv igen om lidt. Tilbud om venskab afvist. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] tilbyder dig et visitkort. + [NAME] tilbyder dig et visitkort. Dette vil lave et bogmørke i din beholding, sÃ¥ du hurtigt kan sende en IM til denne beboer. <form name="form"> <button name="Accept" text="Acceptér"/> @@ -1381,7 +1377,7 @@ Tillad denne anmodning? </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST]'s '[TITLE]' + [NAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorér"/> @@ -1425,13 +1421,13 @@ Klik pÃ¥ Acceptér for at deltage eller Afvis for at afvise invitationen. Klik p </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] fik tilsendt en personlig besked og er dermed automatisk ikke mere blokeret. + [NAME] fik tilsendt en personlig besked og er dermed automatisk ikke mere blokeret. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] blev givet penge og er dermed automatisk ikke mere blokeret. + [NAME] blev givet penge og er dermed automatisk ikke mere blokeret. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] blev tilbudt en genstand og er dermed automatisk ikke mere blokeret. + [NAME] blev tilbudt en genstand og er dermed automatisk ikke mere blokeret. </notification> <notification name="VoiceInviteGroup"> [NAME] har has sluttet sig til stemme-chaten i gruppen [GROUP]. diff --git a/indra/newview/skins/default/xui/da/panel_audio_device.xml b/indra/newview/skins/default/xui/da/panel_audio_device.xml deleted file mode 100644 index f6d817540e..0000000000 --- a/indra/newview/skins/default/xui/da/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="device_settings"> - <text name="Audio Devices"> - Lydenheder - </text> - <text name="Input device (microphone):"> - Input enhed (mikrofon): - </text> - <text name="Output device (speakers):"> - Output enhed (højtalere): - </text> - <text name="Input level:"> - Input niveau - </text> - <text_editor name="voice_intro_text1"> - Med denne skyder kan du regulere hvor højt du lyder i forhold til andre beboere. for at test input niveau kan du blot tale i mikrofon. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Ændre lydstyrke med denne skyder" /> - <text name="wait_text"> - Vent venligst - </text> - <string name="default_text"> - Standard - </string> -</panel> diff --git a/indra/newview/skins/default/xui/da/panel_classified_info.xml b/indra/newview/skins/default/xui/da/panel_classified_info.xml index 5790f1f19f..a54d320ffd 100644 --- a/indra/newview/skins/default/xui/da/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/da/panel_classified_info.xml @@ -40,7 +40,7 @@ </layout_panel> <layout_panel name="descr_layout_panel"> <text name="classified_desc_label" value="Beskrivelse:"/> - <text_editor name="classified_desc" value="[description]"/> + <text_editor name="classified_desc" value="[description]"/> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_friends.xml b/indra/newview/skins/default/xui/da/panel_friends.xml deleted file mode 100644 index a1a25bdc77..0000000000 --- a/indra/newview/skins/default/xui/da/panel_friends.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="friends"> - <string name="Multiple"> - Flere venner - </string> - <scroll_list name="friend_list" tool_tip="Hold Shift eller Ctrl nede imens du klikker for at vælge flere venner"> - <column name="icon_online_status" tool_tip="Online status"/> - <column label="Name" name="friend_name" tool_tip="Navn"/> - <column name="icon_visible_online" tool_tip="Venner kan se at du er online"/> - <column name="icon_visible_map" tool_tip="Venner kan finde dig pÃ¥ kortet"/> - <column name="icon_edit_mine" tool_tip="Venner kan rette i, slette eller tage dine objekter"/> - <column name="icon_edit_theirs" tool_tip="Du kan rette i denne vens objekter"/> - </scroll_list> - <button label="IM" name="im_btn" tool_tip="Skriv en personlig besked (IM)"/> - <button label="Profil" name="profile_btn" tool_tip="Vis billede, grupper og anden information"/> - <button label="Teleport" name="offer_teleport_btn" tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position"/> - <button label="Betal" name="pay_btn" tool_tip="Giv Linden dollars (L$) til denne ven"/> - <button label="Fjern" name="remove_btn" tool_tip="Fjern denne beboer fra din venneliste"/> - <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til en beboer"/> -</panel> diff --git a/indra/newview/skins/default/xui/da/panel_groups.xml b/indra/newview/skins/default/xui/da/panel_groups.xml deleted file mode 100644 index 5877226e57..0000000000 --- a/indra/newview/skins/default/xui/da/panel_groups.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="groups"> - <scroll_list name="group list"> - <column label="" name="name" /> - </scroll_list> - <text name="groupdesc" width="300"> - Din nuværende aktive gruppe er fremhævet i listen. - </text> - <text name="groupcount" width="300"> - Du er medlem i [COUNT] grupper (ud af maksimalt [MAX]). - </text> - <button label="IM/Opkald" name="IM" tool_tip="Ã…bner IM session" /> - <button label="Info" name="Info" /> - <button label="Aktivér" name="Activate" /> - <button label="Forlad" name="Leave" /> - <button label="Opret..." name="Create" /> - <button label="Søg..." name="Search..." /> -</panel> diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat.xml deleted file mode 100644 index 7f94345976..0000000000 --- a/indra/newview/skins/default/xui/da/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name"> - CHAT NÆRVED - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/da/panel_online_status.xml b/indra/newview/skins/default/xui/da/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/da/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml index d3b3c7e21e..cfb32500c6 100644 --- a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml @@ -13,9 +13,9 @@ 50 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="Medie hentes"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/da/panel_region_general_layout.xml b/indra/newview/skins/default/xui/da/panel_region_general_layout.xml deleted file mode 100644 index f3c32d6169..0000000000 --- a/indra/newview/skins/default/xui/da/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Region" name="General"> - <text name="region_text_lbl"> - Region: - </text> - <text name="region_text"> - ukendt - </text> - <text name="version_channel_text_lbl"> - Version: - </text> - <text name="version_channel_text"> - ukendt - </text> - <text name="region_type_lbl"> - Type: - </text> - <text name="region_type"> - ukendt - </text> - <check_box label="Blokér for redigering af terræn" name="block_terraform_check"/> - <check_box label="Blokér for flyvning" name="block_fly_check"/> - <check_box label="Tillad skader" name="allow_damage_check"/> - <check_box label="Begræns skubning" name="restrict_pushobject"/> - <check_box label="Tillad at sælge land" name="allow_land_resell_check"/> - <check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/> - <check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/> - <spinner label="Max besøgende" name="agent_limit_spin"/> - <spinner label="Objekt bonus" name="object_bonus_spin"/> - <text label="Rating" name="access_text"> - Rating: - </text> - <combo_box label="Moderat" name="access_combo"> - <combo_box.item label="Voksent" name="Adult"/> - <combo_box.item label="Moderat" name="Mature"/> - <combo_box.item label="Generel" name="PG"/> - </combo_box> - <button label="Gem" name="apply_btn"/> - <button label="Teleportér en beboer hjem..." name="kick_btn"/> - <button label="Teleportér alle beboere hjem..." name="kick_all_btn"/> - <button label="Send besked til region..." name="im_btn"/> - <button label="Vedligehold telehub..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index 9f4119e73b..1c583f2e95 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -774,7 +774,7 @@ <string name="xml_file"> XML Fil </string> - <string name="dot_raw_file"> + <string name="raw_file"> RAW Fil </string> <string name="compressed_image_files"> @@ -3469,7 +3469,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. Du er den eneste deltager i denne samtale </string> <string name="offline_message"> - [FIRST] [LAST] er ikke logget pÃ¥. + [NAME] er ikke logget pÃ¥. </string> <string name="invite_message"> Tryk pÃ¥ [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml index 6eb99f8b42..f66b87b76c 100644 --- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml @@ -26,7 +26,10 @@ Person ein: </text> <line_editor bottom_delta="-76" name="Edit" top_pad="16"/> <button label="Los" label_selected="Los" name="Find" top="70"/> - <scroll_list top="80" height="54" name="SearchResults"/> + <scroll_list height="54" name="SearchResults" top="80"> + <columns label="Name" name="name"/> + <columns label="Benutzername" name="username"/> + </scroll_list> </panel> <panel label="Freunde" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -41,24 +44,11 @@ Person ein: <text name="meters"> Meter </text> - <button - follows="top|left" - layout="topleft" - left_pad="0" - height="28" - width="28" - name="Refresh" - image_overlay="Refresh_Off" /> - <scroll_list - follows="all" - height="100" - border="false" - layout="topleft" - left="0" - name="NearMe" - sort_column="0" - top="50" - width="132" /> + <button follows="top|left" height="28" image_overlay="Refresh_Off" layout="topleft" left_pad="0" name="Refresh" width="28"/> + <scroll_list border="false" follows="all" height="100" layout="topleft" left="0" name="NearMe" sort_column="0" top="50" width="132"> + <columns label="Name" name="name"/> + <columns label="Benutzername" name="username"/> + </scroll_list> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/de/floater_bumps.xml b/indra/newview/skins/default/xui/de/floater_bumps.xml index dafca44fa3..5d02511ab1 100644 --- a/indra/newview/skins/default/xui/de/floater_bumps.xml +++ b/indra/newview/skins/default/xui/de/floater_bumps.xml @@ -4,19 +4,19 @@ Nicht erkannt </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] hat Sie gestoßen + [TIME] [NAME] hat Sie gestoßen </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] hat Sie mit einem Skript gestoßen + [TIME] [NAME] hat Sie mit einem Skript gestoßen </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] hat Sie mit einem Objekt getroffen + [TIME] [NAME] hat Sie mit einem Objekt getroffen </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] hat Sie mit einem Skript-Objekt getroffen + [TIME] [NAME] hat Sie mit einem Skript-Objekt getroffen </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] hat Sie mit einem physischen Objekt getroffen + [TIME] [NAME] hat Sie mit einem physischen Objekt getroffen </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml index c697014b04..29b49f57b3 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml @@ -1,26 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="KOPIE DES OBJEKTES KAUFEN"> - <text name="contents_text"> - Inhalt: - </text> - <text name="buy_text"> - [AMOUNT] L$ von [NAME] kaufen? - </text> - <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> - <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> - <text name="title_buy_text"> + <floater.string name="title_buy_text"> Kaufen - </text> - <string name="title_buy_copy_text"> + </floater.string> + <floater.string name="title_buy_copy_text"> Kopie kaufen von - </string> - <text name="no_copy_text"> + </floater.string> + <floater.string name="no_copy_text"> (kein Kopieren) - </text> - <text name="no_modify_text"> + </floater.string> + <floater.string name="no_modify_text"> (kein Bearbeiten) - </text> - <text name="no_transfer_text"> + </floater.string> + <floater.string name="no_transfer_text"> (kein Transferieren) + </floater.string> + <text name="contents_text"> + Inhalt: + </text> + <text name="buy_text"> + [AMOUNT] L$ kaufen von: + </text> + <text name="buy_name_text"> + [NAME]? </text> + <button label="Kaufen" label_selected="Kaufen" name="buy_btn"/> + <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_device_settings.xml b/indra/newview/skins/default/xui/de/floater_device_settings.xml deleted file mode 100644 index 3d7e9c96c1..0000000000 --- a/indra/newview/skins/default/xui/de/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="EINSTELLUNGEN FÃœR VOICE-CHAT"/> diff --git a/indra/newview/skins/default/xui/de/floater_display_name.xml b/indra/newview/skins/default/xui/de/floater_display_name.xml new file mode 100644 index 0000000000..4c2914fccb --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_display_name.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Display Name" title="ANZEIGENAMEN ÄNDERN"> + <text name="info_text"> + Der Anzeigename ist der Name, den Sie Ihrem Avatar geben. Sie können ihn einmal pro Woche ändern. + </text> + <text name="lockout_text"> + Sie können Ihren Anzeigenamen erst wieder zu diesem Zeitpunkt ändern: [TIME]. + </text> + <text name="set_name_label"> + Neuer Anzeigename: + </text> + <text name="name_confirm_label"> + Geben Sie den neuen Namen zur Bestätigung noch einmal ein: + </text> + <button label="Speichern" name="save_btn" tool_tip="Speichern Sie Ihren neuen Anzeigenamen"/> + <button label="Zurücksetzen" name="reset_btn" tool_tip="Benutzernamen als Anzeigenamen verwenden"/> + <button label="Abbrechen" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_event.xml b/indra/newview/skins/default/xui/de/floater_event.xml index cf663e2e1b..5b3267d7c9 100644 --- a/indra/newview/skins/default/xui/de/floater_event.xml +++ b/indra/newview/skins/default/xui/de/floater_event.xml @@ -1,69 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Event" name="Event" title="EVENT-DETAILS"> - <floater.string name="none"> - keines +<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600"> + <floater.string name="loading_text"> + Wird geladen... </floater.string> - <floater.string name="notify"> - Benachrichtigen + <floater.string name="done_text"> + Fertig </floater.string> - <floater.string name="dont_notify"> - Nicht benachrichtigen - </floater.string> - <floater.string name="moderate"> - Moderat - </floater.string> - <floater.string name="adult"> - Adult - </floater.string> - <floater.string name="general"> - Allgemein - </floater.string> - <floater.string name="unknown"> - Unbekannt - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Namenloses Event....namenlos! Tadaaa! Tadatadaaaah! - </text> - <text name="event_category"> - (keine Kategorie) - </text> - <text name="event_runby_label"> - Ausgeführt von: - </text> - <text initial_value="(wird in Datenbank gesucht)" name="event_runby"/> - <text name="event_date_label"> - Datum: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - Dauer: - </text> - <text name="event_duration"> - 1 Stunde - </text> - <text name="event_covercharge_label"> - Eintritt: - </text> - <text name="event_cover"> - Kostenlos - </text> - <text name="event_location_label"> - Standort: - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="Einstufung:"/> - <text name="rating_value" value="unbekannt"/> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Event erstellen"/> - <button name="god_delete_event_btn" tool_tip="Event löschen"/> - <button label="Mich benachrichtigen" name="notify_btn"/> - <button label="Teleportieren" name="teleport_btn"/> - <button label="Karte" name="map_btn"/> - </layout_panel> - </layout_stack> + <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/> + <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/> </floater> diff --git a/indra/newview/skins/default/xui/de/floater_first_time_tip.xml b/indra/newview/skins/default/xui/de/floater_first_time_tip.xml deleted file mode 100644 index 9546cc2c42..0000000000 --- a/indra/newview/skins/default/xui/de/floater_first_time_tip.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="set_name_in_the_cladd"> - <check_box label="Turn off Quick Tips" name="DontShowFirstTimeTip_checkbox"/> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_im.xml b/indra/newview/skins/default/xui/de/floater_im.xml deleted file mode 100644 index 8ae8f120cf..0000000000 --- a/indra/newview/skins/default/xui/de/floater_im.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Instant Message"> - <string name="only_user_message"> - Sie sind der einzige Einwohner in dieser Sitzung. - </string> - <string name="offline_message"> - [FIRST] [LAST] ist offline. - </string> - <string name="invite_message"> - Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. - </string> - <string name="muted_message"> - Sie haben diesen Einwohner ignoriert. Wenn Sie eine Nachricht senden, wird dieser freigeschaltet. - </string> - <string name="generic_request_error"> - Fehler bei Anfrage, bitte versuchen Sie es später. - </string> - <string name="insufficient_perms_error"> - Sie sind dazu nicht berechtigt. - </string> - <string name="session_does_not_exist_error"> - Die Sitzung ist abgelaufen - </string> - <string name="no_ability_error"> - Sie besitzen diese Fähigkeit nicht. - </string> - <string name="not_a_mod_error"> - Sie sind kein Sitzungsmoderator. - </string> - <string name="muted_error"> - Ein Gruppenmoderator hat Ihren Text-Chat deaktiviert. - </string> - <!-- ALL of the event strings should have [RECIPIENT] in them --> - <string name="add_session_event"> - Es konnten keine Einwohner zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden. - </string> - <string name="message_session_event"> - Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden. - </string> - <string name="removed_from_group"> - Sie wurden von der Gruppe ausgeschlossen. - </string> - <string name="close_on_no_ability"> - Sie haben nicht mehr die Berechtigung an der Chat-Sitzung teilzunehmen. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml index c69bb600ea..abaf275651 100644 --- a/indra/newview/skins/default/xui/de/floater_im_session.xml +++ b/indra/newview/skins/default/xui/de/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="IM Steuerkonsole" name="panel_im_control_panel"/> <layout_panel> <line_editor label="An" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/de/floater_incoming_call.xml b/indra/newview/skins/default/xui/de/floater_incoming_call.xml index 0312f7dfe9..213d9f54f5 100644 --- a/indra/newview/skins/default/xui/de/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/de/floater_incoming_call.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="ANRUF VON UNBEKANNT"> +<floater name="incoming call" title="Eingehender Anruf"> <floater.string name="lifetime"> 5 </floater.string> diff --git a/indra/newview/skins/default/xui/de/floater_my_friends.xml b/indra/newview/skins/default/xui/de/floater_my_friends.xml deleted file mode 100644 index 61cb0d5c14..0000000000 --- a/indra/newview/skins/default/xui/de/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="KONTAKTE"> - <tab_container name="friends_and_groups"> - <panel label="Freunde" name="friends_panel"/> - <panel label="Gruppen" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml index ec3c45dccf..a0a622ecbc 100644 --- a/indra/newview/skins/default/xui/de/floater_pay.xml +++ b/indra/newview/skins/default/xui/de/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Person"/> <text left="130" name="payee_name"> - [FIRST] [LAST] + Extrem langen Namen testen, um zu prüfen, ob er abgeschnitten wird </text> <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml index 59494cc100..7159bbadb3 100644 --- a/indra/newview/skins/default/xui/de/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Person"/> <text left="128" name="payee_name" width="168"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text halign="left" name="object_name_label"> Ãœber Objekt: diff --git a/indra/newview/skins/default/xui/de/floater_preview_classified.xml b/indra/newview/skins/default/xui/de/floater_preview_classified.xml deleted file mode 100644 index 401758769d..0000000000 --- a/indra/newview/skins/default/xui/de/floater_preview_classified.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFORMATIONEN ÃœBER ANZEIGE"> - <floater.string name="Title"> - Anzeige: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_event.xml b/indra/newview/skins/default/xui/de/floater_preview_event.xml deleted file mode 100644 index 7e46bbab54..0000000000 --- a/indra/newview/skins/default/xui/de/floater_preview_event.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="EVENT-INFORMATION"> - <floater.string name="Title"> - Veranstaltung: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml deleted file mode 100644 index 0d0d28f96f..0000000000 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTE - SCHNELLTASTE"/> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml deleted file mode 100644 index 0b5df13395..0000000000 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTE - SCHNELLTASTE"> - <text name="trigger_label"> - Chat: - </text> - <text name="key_label"> - Tastatur: - </text> - <combo_box label="Keiner" name="modifier_combo"/> - <combo_box label="Keiner" name="key_combo"/> - <text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt."> - Ersetzen: - </text> - <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht's“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht's sagen“ und die zugehörige Geste wird abgespielt."/> -</floater> diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml deleted file mode 100644 index 0d0d28f96f..0000000000 --- a/indra/newview/skins/default/xui/de/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTE - SCHNELLTASTE"/> diff --git a/indra/newview/skins/default/xui/de/floater_statistics.xml b/indra/newview/skins/default/xui/de/floater_statistics.xml deleted file mode 100644 index 72a87a9566..0000000000 --- a/indra/newview/skins/default/xui/de/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATISTIKEN"/> diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml index fe4c505cee..2d30814974 100644 --- a/indra/newview/skins/default/xui/de/floater_tools.xml +++ b/indra/newview/skins/default/xui/de/floater_tools.xml @@ -171,13 +171,13 @@ Ersteller: </text> <text name="Creator Name"> - Esbee Linden + Frau Esbee Linden (esbee.linden) </text> <text name="Owner:"> Eigentümer: </text> <text name="Owner Name"> - Erica Linden + Frau Erica "Elch" Linden (erica.linden) </text> <text name="Group:"> Gruppe: diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml index 07b7689cd0..c97852b6e7 100644 --- a/indra/newview/skins/default/xui/de/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/de/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mein Avatar:"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Anruf beenden" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Anruf beenden" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml index a0bd24a69f..92d9bc37c4 100644 --- a/indra/newview/skins/default/xui/de/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml @@ -10,10 +10,12 @@ <string name="Details"> [SL_PROFILE] </string> + <text name="user_name_small" value="Launische Produktengine mit langem Namen"/> <text name="user_name" value="Grumpity ProductEngine"/> + <text name="user_slid" value="james.linden"/> <text name="user_subtitle" value="11 Monate und 3 Tage alt"/> <text name="user_details"> - Dies ist meine Beschreibung und ich finde sie wirklich gut! + Dies ist meine Second Life-Beschreibung und ich finde sie wirklich gut! Meine Beschreibung ist deshalb so lang, weil ich gerne rede. </text> <slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/> <button label="Freund hinzufügen" name="add_friend_btn" width="110"/> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index bb9a4c8354..489990608f 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -85,6 +85,7 @@ <menu_item_call label="Kopie nehmen" name="Take Copy"/> <menu_item_call label="Objekt wieder in meinem Inventar speichern" name="Save Object Back to My Inventory"/> <menu_item_call label="Wieder in Objektinhalt speichern" name="Save Object Back to Object Contents"/> + <menu_item_call label="Objekt zurückgeben" name="Return Object back to Owner"/> </menu> <menu label="Skripts" name="Scripts"> <menu_item_call label="Skripts rekompilieren (Mono)" name="Mono"/> @@ -98,6 +99,7 @@ <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/> <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/> <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/> + <menu_item_check label="Auswahlumrandung anzeigen" name="Show Selection Outlines"/> <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/> <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/> <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/> @@ -118,6 +120,7 @@ <menu_item_call label="Missbrauch melden" name="Report Abuse"/> <menu_item_call label="Fehler melden" name="Report Bug"/> <menu_item_call label="INFO ÃœBER [APP_NAME]" name="About Second Life"/> + <menu_item_check label="Hinweise aktivieren" name="Enable Hints"/> </menu> <menu label="Erweitert" name="Advanced"> <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> @@ -309,7 +312,7 @@ <menu_item_call label="Ausgewählte Objektinfo drucken" name="Print Selected Object Info"/> <menu_item_call label="Agent-Info drucken" name="Print Agent Info"/> <menu_item_call label="Speicher-Stats" name="Memory Stats"/> - <menu_item_check label="Doppelklicken: Auto-Pilot" name="Double-Click Auto-Pilot"/> + <menu_item_check label="Doppelklicken: Auto-Pilot" name="Double-ClickAuto-Pilot"/> <menu_item_check label="Doppelklicken: Teleport" name="DoubleClick Teleport"/> <menu_item_check label="Fehler in SelectMgr beseitigen" name="Debug SelectMgr"/> <menu_item_check label="Fehler in Klicks beseitigen" name="Debug Clicks"/> @@ -326,6 +329,7 @@ <menu_item_call label="Als XML speichern" name="Save to XML"/> <menu_item_check label="XUI-Namen anzeigen" name="Show XUI Names"/> <menu_item_call label="Test-IMs senden" name="Send Test IMs"/> + <menu_item_call label="Namen-Cache leeren" name="Flush Names Caches"/> </menu> <menu label="Avatar" name="Character"> <menu label="Geladene Textur nehmen" name="Grab Baked Texture"> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index 0d966de380..a904604b62 100644 --- a/indra/newview/skins/default/xui/de/notifications.xml +++ b/indra/newview/skins/default/xui/de/notifications.xml @@ -110,8 +110,8 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut. <usetemplate name="okbutton" yestext="Ja"/> </notification> <notification name="GrantModifyRights"> - Wenn Sie einem anderen Einwohner die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern, löschen oder nehmen. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren! -Möchten Sie [FIRST_NAME] [LAST_NAME] die Erlaubnis zum Bearbeiten gewähren? + Wenn Sie einem anderen Einwohner Änderungsrechte gewähren, dann kann dieser JEDES Objekt, das Sie inworld besitzen, ändern, löschen oder an sich nehmen. Seien Sie daher beim Gewähren dieser Rechte sehr vorsichtig! +Möchten Sie [NAME] Änderungsrechte gewähren? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> <notification name="GrantModifyRightsMultiple"> @@ -120,7 +120,7 @@ Möchten Sie den ausgewählten Einwohnern Änderungsrechte gewähren? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> <notification name="RevokeModifyRights"> - Möchten Sie [FIRST_NAME] [LAST_NAME] die Änderungsrechte entziehen? + Möchten Sie [NAME] die Änderungsrechte entziehen? <usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -324,17 +324,17 @@ Der Outfit-Ordner enthält keine Kleidung, Körperteile oder Anhänge. Sie können das Objekt nicht anziehen, weil es noch nicht geladen wurde. Warten Sie kurz und versuchen Sie es dann noch einmal. </notification> <notification name="MustHaveAccountToLogIn"> - Hoppla! Da fehlt noch etwas. -Geben Sie bitte den Vor- und den Nachnamen Ihres Avatars ein. + Sue haben ein Feld leer gelassen. +Sie müssen den Benutzernamen Ihres Avatars eingeben. -Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Benutzerkonto anlegen? +Sie benötigen ein Konto, um [SECOND_LIFE] betreten zu können. Möchten Sie jetzt ein Konto erstellen? <url name="url"> https://join.secondlife.com/index.php?lang=de-DE </url> <usetemplate name="okcancelbuttons" notext="Erneut versuchen" yestext="Neues Benutzerkonto anlegen"/> </notification> <notification name="InvalidCredentialFormat"> - Sie müssen den Vor- und Nachnamen Ihres Avatars in das Feld Benutzername eingeben, und sich dann erneut anmelden. + Sie müssen entweder den Benutzernamen oder den Vor- und Nachnamen Ihres Avatars in das Feld „Benutzername“ eingeben und die Anmeldung dann erneut versuchen. </notification> <notification name="AddClassified"> Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen" und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt. @@ -932,12 +932,6 @@ Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Landkauf für Gruppe nicht möglich: Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. </notification> - <notification label="Freund hinzufügen" name="AddFriend"> - Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu sehen und den Online-Status anzuzeigen. - -[NAME] Freundschaft anbieten? - <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> - </notification> <notification label="Freund hinzufügen" name="AddFriendWithMessage"> Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu sehen und den Online-Status anzuzeigen. @@ -981,7 +975,7 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen. </form> </notification> <notification name="RemoveFromFriends"> - Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen? + Möchten Sie [NAME] aus Ihrer Freundesliste entfernen? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="RemoveMultipleFromFriends"> @@ -1104,11 +1098,10 @@ Der Gruppe „[GROUP_NAME]“ </notification> <notification name="DeedLandToGroupWithContribution"> Die Schenkung dieser Parzelle setzt voraus, dass die Gruppe über ausreichende Landnutzungsrechte verfügt. -Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[FIRST_NAME] [LAST_NAME]“. +Die Schenkung beinhaltet eine Landübertragung an die Gruppe von „[NAME]“. Dem Eigentümer wird der Kaufpreis für das Land nicht rückerstattet. Bei Verkauf der übertragenen Parzelle wird der Erlös zwischen den Gruppenmitgliedern aufgeteilt. -Der Gruppe „[GROUP_NAME]“ - [AREA] m² Land schenken? +Der Gruppe „[GROUP_NAME]“ [AREA] m² an Land schenken? <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/> </notification> <notification name="DisplaySetToSafe"> @@ -1479,6 +1472,46 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht <button name="Cancel" text="Abbrechen"/> </form> </notification> + <notification name="SetDisplayNameSuccess"> + Hallo [DISPLAY_NAME], + +wir bitten Sie um Geduld, während Ihr Name im System geändert wird. Es kann einige Tage dauern, bis Ihr [http://wiki.secondlife.com/wiki/Setting_your_display_name neuer Name] in Objekten, Skripts, Suchen usw. erscheint. + </notification> + <notification name="SetDisplayNameBlocked"> + Ihr Anzeigename kann leider nicht geändert werden. Wenn Sie der Ansicht sind, dass Sie diese Meldung fälschlicherweise erhalten haben, wenden Sie sich bitte an unseren Support. + </notification> + <notification name="SetDisplayNameFailedLength"> + Dieser Name ist leider zu lang. Anzeigenamen können maximal [LENGTH] Zeichen enthalten. + +Wählen Sie einen kürzeren Namen. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Ihr Anzeigename konnte leider nicht festgelegt werden. Versuchen Sie es später erneut. + </notification> + <notification name="SetDisplayNameMismatch"> + Die eingegebenen Anzeigenamen stimmen nicht überein. Wiederholen Sie die Eingabe. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Sie müssen leider noch ein bisschen warten, bevor Sie Ihren Anzeigenamen ändern können. + +Weitere Informationen finden Sie unter http://wiki.secondlife.com/wiki/Setting_your_display_name. + +Versuchen Sie es später erneut. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Der angeforderte Name enthält ein unzulässiges Wort und konnte deshalb nicht festgelegt werden. + + Versuchen Sie einen anderen Namen. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + Der gewünschte Anzeigename enthält ungültige Zeichen. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Ihr Anzeigenamen muss Buchstaben enthalten und kann nicht ausschließlich aus Satzzeichen bestehen. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([OLD_NAME] ([SLID]) hat einen neuen Namen: [NEW_NAME]. + </notification> <notification name="OfferTeleport"> Teleport an Ihre Position mit der folgenden Meldung anbieten? <form name="form"> @@ -2047,10 +2080,10 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies Betreff: [SUBJECT], Nachricht: [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] ist online + [NAME] ist online </notification> <notification name="FriendOffline"> - [FIRST] [LAST] ist offline + [NAME] ist offline </notification> <notification name="AddSelfFriend"> Obwohl Sie ein sehr netter Mensch sind, können Sie sich nicht selbst als Freund hinzufügen. @@ -2117,9 +2150,6 @@ Dies kann die Eingabe Ihres Passworts beeinflussen. <notification name="CannotRemoveProtectedCategories"> Geschützte Kategorien können nicht entfernt werden. </notification> - <notification name="OfferedCard"> - Sie haben [FIRST] [LAST] eine Visitenkarte angeboten. - </notification> <notification name="UnableToBuyWhileDownloading"> Kauf nicht möglich. Objektdaten werden noch geladen. Bitte versuchen Sie es erneut. @@ -2190,7 +2220,10 @@ Wählen Sie eine kleinere Landfläche. <notification name="SystemMessage"> [MESSAGE] </notification> - <notification name="PaymentRecived"> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> [MESSAGE] </notification> <notification name="EventNotification"> @@ -2199,8 +2232,7 @@ Wählen Sie eine kleinere Landfläche. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teleportieren"/> - <button name="Description" text="Beschreibung"/> + <button name="Details" text="Details"/> <button name="Cancel" text="Abbrechen"/> </form> </notification> @@ -2236,7 +2268,7 @@ Bitte installieren Sie das Plugin erneut. Falls weiterhin Problem auftreten, kon Ihre Objekte auf der ausgewählten Parzelle wurden in Ihr Inventar transferiert. </notification> <notification name="OtherObjectsReturned"> - Die Objekte von [FIRST] [LAST] auf dieser Parzelle wurden in das Inventar dieser Person transferiert. + Alle Objekte auf der ausgewählten Parzelle, die Einwohner „[NAME]“ gehören, wurden an ihren Eigentümer zurückgegeben. </notification> <notification name="OtherObjectsReturned2"> Alle Objekte auf der ausgewählten Parzelle, die Einwohner '[NAME]' gehören, wurden an ihren Eigentümern zurückgegeben. @@ -2363,7 +2395,7 @@ Versuchen Sie es in einigen Minuten erneut. Es konnte keine gültige Parzelle gefunden werden. </notification> <notification name="ObjectGiveItem"> - Ein Objekt namens [OBJECTFROMNAME] von [NAME_SLURL] hat Ihnen folgendes übergeben [OBJECTTYPE]: + Ein Objekt namens <nolink>[OBJECTFROMNAME]</nolink>, das [NAME_SLURL] gehört, hat Ihnen folgende/n/s [OBJECTTYPE] übergeben: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Behalten"/> @@ -2428,9 +2460,9 @@ Versuchen Sie es in einigen Minuten erneut. Sie haben [TO_NAME] die Freundschaft angeboten. </notification> <notification name="OfferFriendshipNoMessage"> - [NAME] bietet Ihnen die Freundschaft an. + [NAME_SLURL] bietet die Freundschaft an. -(Sie werden dadurch den gegenseitigen Online-Status sehen können.) +(Standardmäßig können Sie gegenseitig ihren Online-Status sehen.) <form name="form"> <button name="Accept" text="Akzeptieren"/> <button name="Decline" text="Ablehnen"/> @@ -2449,7 +2481,7 @@ Versuchen Sie es in einigen Minuten erneut. Ihr Freundschaftsangebot wurde abgelehnt. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] bietet Ihnen ihre/seine Visitenkarte an. + [NAME] bietet Ihnen ihre/seine Visitenkarte an. Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach eine IM schicken können. <form name="form"> <button name="Accept" text="Akzeptieren"/> @@ -2469,7 +2501,7 @@ Wenn Sie in dieser Region bleiben, werden Sie abgemeldet. [MESSAGE] -Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? +Von Objekt: <nolink>[OBJECTNAME]</nolink>, Eigentümer: [NAME]? <form name="form"> <button name="Gotopage" text="Zur Seite"/> <button name="Cancel" text="Abbrechen"/> @@ -2485,7 +2517,7 @@ Von Objekt: [OBJECTNAME], Eigentümer: [NAME]? Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um dieses Objekt anziehen zu können. </notification> <notification name="ScriptQuestion"> - Das Objekt „[OBJECTNAME]“, Eigentum von „[NAME]“, möchte: + Das Objekt „<nolink>[OBJECTNAME]</nolink>“, das „[NAME]“ gehört, stellt folgende Anfrage: [QUESTIONS] Ist das OK? @@ -2496,7 +2528,7 @@ Ist das OK? </form> </notification> <notification name="ScriptQuestionCaution"> - Ein Objekt namens „[OBJECTNAME]“ des Eigentümers „[NAME]“ möchte: + Das Objekt „<nolink>[OBJECTNAME]</nolink>“, das „[NAME]“ gehört, stellt folgende Anfrage: [QUESTIONS] Wenn Sie diesem Objekt und seinem Ersteller nicht vertrauen, sollten Sie diese Anfrage ablehnen. @@ -2509,14 +2541,14 @@ Anfrage gestatten? </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST]s „[TITLE]“ + „<nolink>[TITLE]</nolink>“ von [NAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorieren"/> </form> </notification> <notification name="ScriptDialogGroup"> - [GROUPNAME]s „[TITLE]“ + „<nolink>[TITLE]</nolink>“ von [GROUPNAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorieren"/> @@ -2554,13 +2586,13 @@ Klicken Sie auf 'Akzeptieren ', um dem Gespräch beizutreten, oder au </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] hat eine Benachrichtigung erhalten und wird nicht länger ignoriert. + [NAME] hat eine Instant Message erhalten und wird nicht länger ignoriert. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] wurde bezahlt und wird nicht länger ignoriert. + [NAME] hat Geld erhalten und wird nicht länger ignoriert. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] wurde Inventar angeboten und wird nicht länger ignoriert. + [NAME] wurde ein Inventarobjekt angeboten und wird nicht länger ignoriert. </notification> <notification name="VoiceInviteGroup"> [NAME] ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten. @@ -2787,6 +2819,37 @@ auch dann stummgeschaltet werden, wenn Sie den Anruf verlassen haben. Alle stummschalten? <usetemplate ignoretext="Bestätigen, bevor alle Teilnehmer in einem Gruppengespräch stummgeschaltet werden." name="okcancelignore" notext="Abbrechen" yestext="OK"/> </notification> + <notification label="Chat" name="HintChat"> + Um mitzureden, geben Sie Text in das Chat-Feld unten ein. + </notification> + <notification label="Stehen" name="HintSit"> + Um aufzustehen, klicken Sie auf die Schaltfläche „Stehen“. + </notification> + <notification label="Welt erkunden" name="HintDestinationGuide"> + Im Reiseführer finden Sie Tausende von interessanten Orten. Wählen Sie einfach einen Ort aus und klicken Sie auf „Teleportieren“. + </notification> + <notification label="Seitenleiste" name="HintSidePanel"> + In der Seitenleiste können Sie schnell auf Ihr Inventar, Ihre Outfits, Ihre Profile u. ä. zugreifen. + </notification> + <notification label="Bewegen" name="HintMove"> + Um zu gehen oder zu rennen, öffnen Sie das Bedienfeld „Bewegen“ und klicken Sie auf die Pfeile. Sie können auch die Pfeiltasten auf Ihrer Tastatur verwenden. + </notification> + <notification label="Anzeigename" name="HintDisplayName"> + Hier können Sie Ihren anpassbaren Anzeigenamen festlegen. Der Anzeigename unterscheidet sich von Ihrem eindeutigen Benutzernamen, der nicht geändert werden kann. In den Einstellungen können Sie festlegen, welcher Name von anderen Einwohnern angezeigt wird. + </notification> + <notification label="Inventar" name="HintInventory"> + In Ihrem Inventar befinden sich verschiedene Objekte. Die neuesten Objekte finden Sie in der Registerkarte „Aktuell“. + </notification> + <notification label="Sie haben Linden-Dollar!" name="HintLindenDollar"> + Hier wird Ihr aktueller L$-Kontostand angezeigt. Klicken Sie auf „L$ kaufen“, um mehr Linden-Dollar zu kaufen. + </notification> + <notification name="PopupAttempt"> + Ein Popup konnte nicht geöffnet werden. + <form name="form"> + <ignore name="ignore" text="Alle Popups aktivieren"/> + <button name="open" text="Popup-Fenster öffnen"/> + </form> + </notification> <global name="UnsupportedCPU"> - Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen. </global> diff --git a/indra/newview/skins/default/xui/de/panel_audio_device.xml b/indra/newview/skins/default/xui/de/panel_audio_device.xml deleted file mode 100644 index 6ecd1f0241..0000000000 --- a/indra/newview/skins/default/xui/de/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="device_settings"> - <text name="Audio Devices"> - Audiogeräte - </text> - <text name="Output device (speakers):"> - Ausgabegerät (Lautsprecher): - </text> - <text name="Input device (microphone):"> - Eingabegerät (Mikro): - </text> - <text name="Input level:"> - Eingangslautstärke - </text> - <text_editor name="voice_intro_text1"> - Mit dem Regler steuern Sie, wie laut andere Einwohner Sie hören. Testen Sie die Eingangslautstärke, indem Sie in das Mikro sprechen. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Ändern Sie die Lautstärke mit dem Regler" /> - <text name="wait_text"> - Bitte warten - </text> - <text name="default_text"> - Standard - </text> -</panel> diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml index b689856f8c..be124050e8 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml @@ -26,6 +26,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="data_panel"> + <text name="display_name_label" value="Anzeigename:"/> + <text name="solo_username_label" value="Benutzername:"/> + <button name="set_name" tool_tip="Anzeigenamen festlegen"/> + <text name="solo_user_name" value="Hamilton Hitchings"/> + <text name="user_name" value="Hamilton Hitchings"/> + <text name="user_name_small" value="Hamilton Hitchings"/> + <text name="user_label" value="Benutzername:"/> + <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <panel name="second_life_image_panel"> <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/> @@ -46,7 +54,7 @@ <text name="my_account_link" value="[[URL] Meine Startseite aufrufen]"/> <text name="title_partner_text" value="Mein Partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text" value="[FIRST] [LAST]"/> + <text initial_value="(wird in Datenbank gesucht)" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] bearbeiten]"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml index 125bf1436e..d9d237be2e 100644 --- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml @@ -24,6 +24,7 @@ <scroll_list.columns label="Region" name="location"/> <scroll_list.columns label="Typ" name="type"/> <scroll_list.columns label="Gebiet" name="area"/> + <scroll_list.columns label="Ausgeblendet" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Gesamtbeitrag: diff --git a/indra/newview/skins/default/xui/de/panel_groups.xml b/indra/newview/skins/default/xui/de/panel_groups.xml deleted file mode 100644 index f857a6c7ac..0000000000 --- a/indra/newview/skins/default/xui/de/panel_groups.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="groups"> - <text name="groupdesc" width="300"> - Die derzeit aktive Gruppe ist fett hervorgehoben. - </text> - <text name="groupcount" width="360"> - Sie sind Mitglied bei [COUNT] Gruppen (von max. [MAX]). - </text> - <button label="IM/Anruf" name="IM" tool_tip="Beginnt eine Instant Message-Sitzung" /> - <button label="Info" name="Info" /> - <button label="Aktivieren" name="Activate" /> - <button label="Verlassen" name="Leave" /> - <button label="Erstellen..." name="Create" /> - <button label="Suchen..." name="Search..." /> -</panel> diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml index b373be4382..0fc4fa7117 100644 --- a/indra/newview/skins/default/xui/de/panel_login.xml +++ b/indra/newview/skins/default/xui/de/panel_login.xml @@ -11,7 +11,7 @@ <text name="username_text"> Benutzername: </text> - <line_editor label="Benutzername" name="username_edit" tool_tip="[SECOND_LIFE]-Benutzername"/> + <line_editor label="berndschmidt12 oder Liebe Sonne" name="username_edit" tool_tip="Bei der Registrierung gewählter Benutzername wie „berndschmidt12“ oder „Liebe Sonne“"/> <text name="password_text"> Kennwort: </text> @@ -31,7 +31,7 @@ Registrieren </text> <text name="forgot_password_text"> - Namen oder Kennwort vergessen? + Benutzernamen oder Kennwort vergessen? </text> <text name="login_help"> Sie brauchen Hilfe? diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml deleted file mode 100644 index 3f4f5a71b5..0000000000 --- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name" width="200"> - CHAT IN DER NÄHE - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/de/panel_notifications_channel.xml b/indra/newview/skins/default/xui/de/panel_notifications_channel.xml index e2166f7baf..35bd76ce70 100644 --- a/indra/newview/skins/default/xui/de/panel_notifications_channel.xml +++ b/indra/newview/skins/default/xui/de/panel_notifications_channel.xml @@ -1,15 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="notifications_panel"> <layout_stack name="stack1"> - <scroll_list name="notifications_list"> - <column label="Name" name="name"/> - <column label="Inhalt" name="content"/> - <column label="Datum" name="date"/> - </scroll_list> - <scroll_list name="notification_rejects_list"> - <column label="Name" name="name"/> - <column label="Inhalt" name="content"/> - <column label="Datum" name="date"/> - </scroll_list> + <layout_panel name="notifications_list_panel" > + <scroll_list name="notifications_list"> + <column label="Name" name="name"/> + <column label="Inhalt" name="content"/> + <column label="Datum" name="date"/> + </scroll_list> + </layout_panel> + <layout_panel name="rejects_list_panel" > + <scroll_list name="notification_rejects_list"> + <column label="Name" name="name"/> + <column label="Inhalt" name="content"/> + <column label="Datum" name="date"/> + </scroll_list> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_online_status.xml b/indra/newview/skins/default/xui/de/panel_online_status.xml deleted file mode 100644 index 7c7448c061..0000000000 --- a/indra/newview/skins/default/xui/de/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Freunde_online_Status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml index 9d1a582b7c..555fa56d57 100644 --- a/indra/newview/skins/default/xui/de/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml @@ -80,7 +80,7 @@ <text name="region_rating_label" value="Einstufung:"/> <text name="region_rating" value="Adult"/> <text name="region_owner_label" value="Eigentümer:"/> - <text name="region_owner" value="moose Van Moose"/> + <text name="region_owner" value="Elch von Elch extra langer Name Elch"/> <text name="region_group_label" value="Gruppe:"/> <text name="region_group"> The Mighty Moose of mooseville soundvillemoose @@ -93,6 +93,7 @@ <text name="estate_name_label" value="Grundbesitz:"/> <text name="estate_rating_label" value="Einstufung:"/> <text name="estate_owner_label" value="Eigentümer:"/> + <text name="estate_owner" value="Länge des Eigentümernamens mit langem Namen testen"/> <text name="covenant_label" value="Vertrag:"/> </panel> </accordion_tab> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index b59a779853..8492d36bc7 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -44,9 +44,10 @@ <radio_item label="An" name="radio2" value="1"/> <radio_item label="Kurz anzeigen" name="radio3" value="2"/> </radio_group> - <check_box label="Meinen Namen anzeigen" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Kleine Avatarnamen" name="small_avatar_names_checkbox"/> - <check_box label="Gruppentitel anzeigen" name="show_all_title_checkbox1"/> + <check_box label="Mein Name" name="show_my_name_checkbox1"/> + <check_box label="Benutzernamen" name="show_slids" tool_tip="Benutzernamen wie berndschmidt123 anzeigen"/> + <check_box label="Gruppentitel" name="show_all_title_checkbox1" tool_tip="Gruppentitel wie „Vorstand“ oder „Mitglied“"/> + <check_box label="Freunde hervorheben" name="show_friends" tool_tip="Avatarnamen Ihrer Freunde hervorheben"/> <text name="effects_color_textbox"> Meine Effekte: </text> @@ -61,6 +62,7 @@ <combo_box.item label="30 Minuten" name="item3"/> <combo_box.item label="nie" name="item4"/> </combo_box> + <check_box label="Anzeigenamen anzeigen" name="display_names_check" tool_tip="Aktivieren Sie diese Option, um Anzeigenamen in Chat, IM, Avatarnamen usw. zu verwenden."/> <text name="text_box3"> Antwort, wenn im „Beschäftigt“-Modus: </text> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml index 02c6fb0606..140b1ce7a4 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Hardware/Internet" name="Input panel"> - <button label="Andere Geräte" name="joystick_setup_button"/> <text name="Mouselook:"> Mouselook: </text> @@ -40,6 +39,7 @@ <check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Cookies annehmen" name="cookies_enabled"/> <check_box initial_value="true" label="Javascript aktivieren" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Medienbrowser-Popups aktivieren" name="media_popup_enabled"/> <check_box initial_value="false" label="Web-Proxy aktivieren" name="web_proxy_enabled"/> <text name="Proxy location"> Proxy-Standort: diff --git a/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml index 0a19483f8b..c85f2762b1 100644 --- a/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/de/panel_prim_media_controls.xml @@ -7,9 +7,9 @@ 0.2 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="Medien werden geladen"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml index f02457dd80..b44c128000 100644 --- a/indra/newview/skins/default/xui/de/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml @@ -6,8 +6,14 @@ <string name="status_offline"> Offline </string> - <text_editor name="user_name" value="(wird geladen...)"/> + <text name="display_name_label" value="Anzeigename:"/> + <text name="solo_username_label" value="Benutzername:"/> <text name="status" value="Online"/> + <text name="user_name_small" value="Dieser Name ist ein ganz außerordentlich langer Name"/> + <text name="user_name" value="Jack Linden"/> + <button name="copy_to_clipboard" tool_tip="In Zwischenablage kopieren"/> + <text name="user_label" value="Benutzername:"/> + <text name="user_slid" value="jack.linden"/> <tab_container name="tabs" tab_min_width="60"> <panel label="PROFIL" name="panel_profile"/> <panel label="AUSWAHL" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml deleted file mode 100644 index 09142ada6f..0000000000 --- a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Region" name="General"> - <text name="region_text_lbl"> - Region: - </text> - <text name="region_text"> - unbekannt - </text> - <text name="version_channel_text_lbl"> - Version: - </text> - <text name="version_channel_text"> - unbekannt - </text> - <text name="region_type_lbl"> - Typ: - </text> - <text name="region_type"> - unbekannt - </text> - <check_box label="Terraformen blockieren" name="block_terraform_check"/> - <check_box label="Fliegen blockieren" name="block_fly_check"/> - <check_box label="Schaden zulassen" name="allow_damage_check"/> - <check_box label="Stoßen beschränken" name="restrict_pushobject"/> - <check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/> - <check_box label="Zusammenlegen/Teilen von Land zulassen" name="allow_parcel_changes_check"/> - <check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/> - <spinner label="Avatar-Limit" name="agent_limit_spin"/> - <spinner label="Objektbonus" name="object_bonus_spin"/> - <text label="Alterseinstufung" name="access_text"> - Einstufung: - </text> - <combo_box label="Moderat" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Moderat" name="Mature"/> - <combo_box.item label="Allgemein" name="PG"/> - </combo_box> - <button label="Ãœbernehmen" name="apply_btn"/> - <button label="Einen Einwohner nach Hause teleportieren..." name="kick_btn"/> - <button label="Alle Einwohner nach Hause teleportieren..." name="kick_all_btn"/> - <button label="Nachricht an Region senden..." name="im_btn"/> - <button label="Telehub verwalten..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml index b20fcabc82..5d9dcacd51 100644 --- a/indra/newview/skins/default/xui/de/role_actions.xml +++ b/indra/newview/skins/default/xui/de/role_actions.xml @@ -1,76 +1,73 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> <action_set description="Diese Fähigkeiten ermöglichen das Hinzufügen und Entfernen von Mitgliedern sowie den Beitritt ohne Einladung." name="Membership"> - <action description="Personen in diese Gruppe einladen" longdescription="Leute in diese Gruppe mit der Schaltfläche „Einladen“ im Abschnitt „Rollen“ > Registerkarte „Mitglieder“ in die Gruppe einladen." name="member invite"/> - <action description="Mitglieder aus dieser Gruppe werfen" longdescription="Leute aus dieser Gruppe mit der Schaltfläche „Hinauswerfen“ im Abschnitt „Rollen“ > Registerkarte „Mitglieder“ aus der Gruppe werfen. Ein Eigentümer kann jeden, außer einen anderen Eigentümer, ausschließen. Wenn Sie kein Eigentümer sind, können Sie ein Mitglied nur dann aus der Gruppe werfen, wenn es die Rolle Jeder inne hat, jedoch KEINE andere Rolle. Um Mitgliedern Rollen entziehen zu können, müssen Sie über die Fähigkeit „Mitgliedern Rollen entziehen“ verfügen." name="member eject"/> - <action description="„Registrierung offen“ aktivieren/deaktivieren und „Beitrittsgebühr“ ändern." longdescription="„Registrierung offen“ aktivieren, um damit neue Mitglieder ohne Einladung beitreten können, und die „Beitrittsgebühr“ im Abschnitt „Allgemein“ ändern." name="member options"/> + <action description="Personen in diese Gruppe einladen" longdescription="Leute in diese Gruppe mit der Schaltfläche „Einladen“ im Abschnitt „Rollen“ > Registerkarte „Mitglieder“ in die Gruppe einladen." name="member invite" value="1"/> + <action description="Mitglieder aus dieser Gruppe werfen" longdescription="Leute aus dieser Gruppe mit der Schaltfläche „Hinauswerfen“ im Abschnitt „Rollen“ > Registerkarte „Mitglieder“ aus der Gruppe werfen. Ein Eigentümer kann jeden, außer einen anderen Eigentümer, ausschließen. Wenn Sie kein Eigentümer sind, können Sie ein Mitglied nur dann aus der Gruppe werfen, wenn es die Rolle Jeder inne hat, jedoch KEINE andere Rolle. Um Mitgliedern Rollen entziehen zu können, müssen Sie über die Fähigkeit „Mitgliedern Rollen entziehen“ verfügen." name="member eject" value="2"/> + <action description="„Registrierung offen“ aktivieren/deaktivieren und „Beitrittsgebühr“ ändern." longdescription="„Registrierung offen“ aktivieren, um damit neue Mitglieder ohne Einladung beitreten können, und die „Beitrittsgebühr“ im Abschnitt „Allgemein“ ändern." name="member options" value="3"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen das Hinzufügen, Entfernen und Ändern von Gruppenrollen, das Zuweisen und Entfernen von Rollen und das Zuweisen von Fähigkeiten zu Rollen." name="Roles"> - <action description="Neue Rollen erstellen" longdescription="Neue Rollen im Abschnitt „Rollen“ > Registerkarte „Rollen“ erstellen." name="role create"/> - <action description="Rollen löschen" longdescription="Neue Rollen im Abschnitt „Rollen“ > Registerkarte „Rollen“ löschen." name="role delete"/> - <action description="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern." longdescription="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern. Dies wird im unteren Bereich des Abschnitts „Rollen“ > Registerkarte „Rollen“ eingestellt, nachdem eine Rolle ausgewählt wurde." name="role properties"/> - <action description="Mitgliedern nur eigene Rollen zuweisen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ > Registerkarte „Mitglieder“) können Mitgliedern Rollen zugewiesen werden. Ein Mitglied mit dieser Fähigkeit kann anderen Mitgliedern nur die eigenen Rollen zuweisen." name="role assign member limited"/> - <action description="Mitgliedern beliebige Rolle zuweisen" longdescription="Sie können Mitglieder jede beliebige Rolle der Liste „Rollen“ (Abschnitt „Rollen“ > Registerkarte „Mitglieder“) zuweisen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) Rollen mit weitreichenden Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Ãœberlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role assign member"/> - <action description="Mitgliedern Rollen entziehen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ > Registerkarte „Mitglieder“) können Mitgliedern Rollen abgenommen werden. Eigentümer können nicht entfernt werden." name="role remove member"/> - <action description="Rollenfähigkeiten zuweisen und entfernen" longdescription="Fähigkeiten für jede Rolle können in der Liste „Zulässige Fähigkeiten" (Abschnitt „Rollen" > Registerkarte „Rollen“) zugewiesen und auch entzogen werden. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) alle Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Ãœberlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role change actions"/> + <action description="Neue Rollen erstellen" longdescription="Neue Rollen im Abschnitt „Rollen“ > Registerkarte „Rollen“ erstellen." name="role create" value="4"/> + <action description="Rollen löschen" longdescription="Neue Rollen im Abschnitt „Rollen“ > Registerkarte „Rollen“ löschen." name="role delete" value="5"/> + <action description="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern." longdescription="Rollennamen, Titel, Beschreibungen und ob die Rolleninhaber öffentlich bekannt sein sollen, ändern. Dies wird im unteren Bereich des Abschnitts „Rollen“ > Registerkarte „Rollen“ eingestellt, nachdem eine Rolle ausgewählt wurde." name="role properties" value="6"/> + <action description="Mitgliedern nur eigene Rollen zuweisen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ > Registerkarte „Mitglieder“) können Mitgliedern Rollen zugewiesen werden. Ein Mitglied mit dieser Fähigkeit kann anderen Mitgliedern nur die eigenen Rollen zuweisen." name="role assign member limited" value="7"/> + <action description="Mitgliedern beliebige Rolle zuweisen" longdescription="Sie können Mitglieder jede beliebige Rolle der Liste „Rollen“ (Abschnitt „Rollen“ > Registerkarte „Mitglieder“) zuweisen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) Rollen mit weitreichenden Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Ãœberlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role assign member" value="8"/> + <action description="Mitgliedern Rollen entziehen" longdescription="In der Liste „Rollen“ (Abschnitt „Rollen“ > Registerkarte „Mitglieder“) können Mitgliedern Rollen abgenommen werden. Eigentümer können nicht entfernt werden." name="role remove member" value="9"/> + <action description="Rollenfähigkeiten zuweisen und entfernen" longdescription="Fähigkeiten für jede Rolle können in der Liste „Zulässige Fähigkeiten" (Abschnitt „Rollen" > Registerkarte „Rollen“) zugewiesen und auch entzogen werden. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann sich selbst und jedem anderen Mitglied (außer dem Eigentümer) alle Fähigkeiten zuweisen und damit fast Eigentümerrechte erreichen. Ãœberlegen Sie sich gut, wem Sie diese Fähigkeit verleihen." name="role change actions" value="10"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, die Gruppenidentität zu ändern, z. B. öffentliche Sichtbarkeit, Charta und Insignien." name="Group Identity"> - <action description="Charta, Insignien und „Im Web veröffentlichen“ ändern und festlegen, welche Mitglieder in der Gruppeninfo öffentlich sichtbar sind." longdescription="Charta, Insignien und „In Suche anzeigen" ändern. Diese Einstellungen werden im Abschnitt „Allgemein" vorgenommen." name="group change identity"/> + <action description="Charta, Insignien und „Im Web veröffentlichen“ ändern und festlegen, welche Mitglieder in der Gruppeninfo öffentlich sichtbar sind." longdescription="Charta, Insignien und „In Suche anzeigen" ändern. Diese Einstellungen werden im Abschnitt „Allgemein" vorgenommen." name="group change identity" value="11"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, gruppeneigenes Land zu übertragen, zu bearbeiten und zu verkaufen. Klicken Sie mit rechts auf den Boden und wählen Sie „Land-Info...“ oder klicken Sie in der Navigationsleiste auf das Symbol „i"." name="Parcel Management"> - <action description="Land übertragen und für Gruppe kaufen" longdescription="Land übertragen und für Gruppe kaufen. Diese Einstellung finden Sie unter „Land-Info“ > „Allgemein“." name="land deed"/> - <action description="Land Governor Linden überlassen" longdescription="Land Governor Linden überlassen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann gruppeneigenes Land unter „Land-Info“ > „Allgemein“ aufgeben und es ohne Verkauf in das Eigentum von Linden zurückführen! Ãœberlegen Sie sich, wem Sie diese Fähigkeit verleihen." name="land release"/> - <action description="Land.zu.verkaufen-Info einstellen" longdescription="Land zu verkaufen-Info einstellen. *WARNUNG* Mitglieder in einer Rolle mit dieser Fähigkeit können gruppeneigenes Land jederzeit unter „Land-Info“ > „Allgemein“ verkaufen! Ãœberlegen Sie sich, wem Sie diese Fähigkeit verleihen." name="land set sale info"/> - <action description="Parzellen teilen und zusammenlegen" longdescription="Parzellen teilen und zusammenlegen. Klicken Sie dazu mit rechts auf den Boden, wählen sie „Terrain bearbeiten“ und ziehen Sie die Maus auf das Land, um eine Auswahl zu treffen. Zum Teilen treffen Sie eine Auswahl und klicken auf „Unterteilen“. Zum Zusammenlegen von zwei oder mehr angrenzenden Parzellen klicken Sie auf „Zusammenlegen“." name="land divide join"/> + <action description="Land übertragen und für Gruppe kaufen" longdescription="Land übertragen und für Gruppe kaufen. Diese Einstellung finden Sie unter „Land-Info“ > „Allgemein“." name="land deed" value="12"/> + <action description="Land Governor Linden überlassen" longdescription="Land Governor Linden überlassen. *WARNUNG* Jedes Mitglied in einer Rolle mit dieser Fähigkeit kann gruppeneigenes Land unter „Land-Info“ > „Allgemein“ aufgeben und es ohne Verkauf in das Eigentum von Linden zurückführen! Ãœberlegen Sie sich, wem Sie diese Fähigkeit verleihen." name="land release" value="13"/> + <action description="Land.zu.verkaufen-Info einstellen" longdescription="Land zu verkaufen-Info einstellen. *WARNUNG* Mitglieder in einer Rolle mit dieser Fähigkeit können gruppeneigenes Land jederzeit unter „Land-Info“ > „Allgemein“ verkaufen! Ãœberlegen Sie sich, wem Sie diese Fähigkeit verleihen." name="land set sale info" value="14"/> + <action description="Parzellen teilen und zusammenlegen" longdescription="Parzellen teilen und zusammenlegen. Klicken Sie dazu mit rechts auf den Boden, wählen sie „Terrain bearbeiten“ und ziehen Sie die Maus auf das Land, um eine Auswahl zu treffen. Zum Teilen treffen Sie eine Auswahl und klicken auf „Unterteilen“. Zum Zusammenlegen von zwei oder mehr angrenzenden Parzellen klicken Sie auf „Zusammenlegen“." name="land divide join" value="15"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, den Parzellennamen und die Veröffentlichungseinstellungen sowie die Anzeige des Suchverzeichnisses, den Landepunkt und die TP-Routenoptionen festzulegen." name="Parcel Identity"> - <action description="„Ort in Suche anzeigen" ein-/ausschalten und Kategorie festlegen." longdescription="Auf der Registerkarte „Optionen“ unter „Land-Info“ können Sie „Ort in Suche anzeigen“ ein- und ausschalten und die Parzellenkategorie festlegen." name="land find places"/> - <action description="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen" ändern" longdescription="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen" ändern Diese Einstellungen finden Sie unter „Land-Info“ > Registerkarte „Optionen“." name="land change identity"/> - <action description="Landepunkt und Teleport-Route festlegen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle einen Landepunkt für ankommende Teleports und Teleport-Routen festlegen. Diese Einstellungen finden Sie unter „Land-Info“ > „Optionen“." name="land set landing point"/> + <action description="„Ort in Suche anzeigen" ein-/ausschalten und Kategorie festlegen." longdescription="Auf der Registerkarte „Optionen“ unter „Land-Info“ können Sie „Ort in Suche anzeigen“ ein- und ausschalten und die Parzellenkategorie festlegen." name="land find places" value="17"/> + <action description="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen" ändern" longdescription="Parzellenname, Beschreibung und Einstellung für „Ort in Suche anzeigen" ändern Diese Einstellungen finden Sie unter „Land-Info“ > Registerkarte „Optionen“." name="land change identity" value="18"/> + <action description="Landepunkt und Teleport-Route festlegen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle einen Landepunkt für ankommende Teleports und Teleport-Routen festlegen. Diese Einstellungen finden Sie unter „Land-Info“ > „Optionen“." name="land set landing point" value="19"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Parzellenoptionen wie „Objekte erstellen“, „Terrain bearbeiten“ sowie Musik- und Medieneinstellungen zu ändern." name="Parcel Settings"> - <action description="Musik- und Medieneinstellungen ändern" longdescription="Die Einstellungen für Streaming-Musik und Filme finden Sie unter „Land-Info“ > „Medien“." name="land change media"/> - <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ > „Optionen“ > „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundbesitzes und das Setzen und Verschieben von Linden-Pflanzen. Ãœberlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ > „Optionen“." name="land edit"/> - <action description="„Land-Info“-Optionen einstellen" longdescription="„Sicher (kein Schaden)“ und „Fliegen“ ein- und ausschalten und Einwohnern folgende Aktionen erlauben: „Terrain bearbeiten“, „Bauen“, „Landmarken erstellen“ und „Skripts ausführen“ auf gruppeneigenem Land in „Land-Info“ > Registerkarte „Optionen“." name="land options"/> + <action description="Musik- und Medieneinstellungen ändern" longdescription="Die Einstellungen für Streaming-Musik und Filme finden Sie unter „Land-Info“ > „Medien“." name="land change media" value="20"/> + <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ > „Optionen“ > „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundbesitzes und das Setzen und Verschieben von Linden-Pflanzen. Ãœberlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ > „Optionen“." name="land edit" value="21"/> + <action description="„Land-Info“-Optionen einstellen" longdescription="„Sicher (kein Schaden)“ und „Fliegen“ ein- und ausschalten und Einwohnern folgende Aktionen erlauben: „Terrain bearbeiten“, „Bauen“, „Landmarken erstellen“ und „Skripts ausführen“ auf gruppeneigenem Land in „Land-Info“ > Registerkarte „Optionen“." name="land options" value="22"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Umgehen von Restriktionen auf gruppeneigenen Parzellen zu erlauben." name="Parcel Powers"> - <action description="„Terrain bearbeiten“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle das Terrain bearbeiten, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow edit land"/> - <action description="„Fliegen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle fliegen, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow fly"/> - <action description="„Objekte erstellen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle Objekte erstellen, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow create"/> - <action description="„Landmarke erstellen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können für eine gruppeneigene Parzelle eine Landmarke erstellen, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow landmark"/> - <action description="„Hier als Zuhause wählen“ auf Gruppenland zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer an diese Gruppe übertragenen Parzelle die Funktion „Welt“ > „Landmarken“ > „Hier als Zuhause wählen“ verwenden." name="land allow set home"/> + <action description="„Terrain bearbeiten“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle das Terrain bearbeiten, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow edit land" value="23"/> + <action description="„Fliegen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle fliegen, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow fly" value="24"/> + <action description="„Objekte erstellen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer gruppeneigenen Parzelle Objekte erstellen, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow create" value="25"/> + <action description="„Landmarke erstellen“ zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können für eine gruppeneigene Parzelle eine Landmarke erstellen, selbst wenn diese Option unter „Land-Info“ > „Optionen“ deaktiviert ist." name="land allow landmark" value="26"/> + <action description="„Hier als Zuhause wählen“ auf Gruppenland zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können auf einer an diese Gruppe übertragenen Parzelle die Funktion „Welt“ > „Landmarken“ > „Hier als Zuhause wählen“ verwenden." name="land allow set home" value="28"/> + <action description="Veranstaltung von Events auf Gruppenland zulassen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Parzellen im Gruppenbesitz als Veranstaltungsorte für Events auswählen." name="land allow host event" value="41"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, den Zugang auf gruppeneigenen Parzellen zu steuern. Dazu gehört das Einfrieren und Ausschließen von Einwohnern." name="Parcel Access"> - <action description="Parzellen-Zugangslisten verwalten" longdescription="Parzellen-Zugangslisten bearbeiten Sie unter „Land-Info“ > „Zugang“." name="land manage allowed"/> - <action description="Parzellen-Bannlisten verwalten" longdescription="Bannlisten für Parzellen bearbeiten Sie unter „Land-Info“ > Registerkarte „Zugang“." name="land manage banned"/> - <action description="Parzelleneinstellungen für „Pässe verkaufen“ ändern" longdescription="Die Parzellen-Einstellungen für „Pässe verkaufen“ ändern Sie unter „Land-Info“ > Registerkarte „Zugang“." name="land manage passes"/> - <action description="Einwohner aus Parzellen werfen und einfrieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können gegen unerwünschte Einwohner auf einer gruppeneigenen Parzelle Maßnahmen ergreifen. Klicken Sie den Einwohner mit rechts an und wählen Sie „Hinauswerfen“ oder „Einfrieren“." name="land admin"/> + <action description="Parzellen-Zugangslisten verwalten" longdescription="Parzellen-Zugangslisten bearbeiten Sie unter „Land-Info“ > „Zugang“." name="land manage allowed" value="29"/> + <action description="Parzellen-Bannlisten verwalten" longdescription="Bannlisten für Parzellen bearbeiten Sie unter „Land-Info“ > Registerkarte „Zugang“." name="land manage banned" value="30"/> + <action description="Parzelleneinstellungen für „Pässe verkaufen“ ändern" longdescription="Die Parzellen-Einstellungen für „Pässe verkaufen“ ändern Sie unter „Land-Info“ > Registerkarte „Zugang“." name="land manage passes" value="31"/> + <action description="Einwohner aus Parzellen werfen und einfrieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können gegen unerwünschte Einwohner auf einer gruppeneigenen Parzelle Maßnahmen ergreifen. Klicken Sie den Einwohner mit rechts an und wählen Sie „Hinauswerfen“ oder „Einfrieren“." name="land admin" value="32"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können den Grundbesitz aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden." name="Parcel Content"> - <action description="Gruppeneigene Objekte zurückgeben" longdescription="Gruppeneigene Objekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return group owned"/> - <action description="Gruppenobjekte zurückgeben" longdescription="Gruppenobjekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return group set"/> - <action description="Gruppenfremde Objekte zurückgeben" longdescription="Objekte von gruppenfremden Personen auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return non group"/> - <action description="Landschaftsgestaltung mit Linden-Pflanzen" longdescription="Die Fähigkeit zur Landschaftsgestaltung ermöglicht das Platzieren und Verschieben von Linden-Bäumen, -Pflanzen und -Gräsern. Diese Objekte finden Sie im Bibliotheksordner des Inventars unter Objekte. Sie lassen sich auch mit der Menü Erstellen erzeugen." name="land gardening"/> + <action description="Gruppeneigene Objekte zurückgeben" longdescription="Gruppeneigene Objekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return group owned" value="48"/> + <action description="Gruppenobjekte zurückgeben" longdescription="Gruppenobjekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return group set" value="33"/> + <action description="Gruppenfremde Objekte zurückgeben" longdescription="Objekte von gruppenfremden Personen auf gruppeneigenen Parzellen können Sie unter „Land-Info“ > „Objekte“ zurückgeben." name="land return non group" value="34"/> + <action description="Landschaftsgestaltung mit Linden-Pflanzen" longdescription="Die Fähigkeit zur Landschaftsgestaltung ermöglicht das Platzieren und Verschieben von Linden-Bäumen, -Pflanzen und -Gräsern. Diese Objekte finden Sie im Bibliotheksordner des Inventars unter Objekte. Sie lassen sich auch mit der Menü Erstellen erzeugen." name="land gardening" value="35"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, gruppeneigene Objekte zu übertragen, zu bearbeiten und zu verkaufen. Änderungen werden im Werkzeug Bearbeiten auf der Registerkarte Allgemein vorgenommen. Klicken Sie mit rechts auf ein Objekt und wählen Sie 'Bearbeiten ', um seine Einstellungen anzuzeigen." name="Object Management"> - <action description="Objekte an Gruppe übertragen" longdescription="Objekte an eine Gruppe übertragen können Sie im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“." name="object deed"/> - <action description="Gruppeneigene Objekte manipulieren (verschieben, kopieren, bearbeiten)" longdescription="Gruppeneigene Objekte lassen sich im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“ manipulieren (verschieben, kopieren, bearbeiten)." name="object manipulate"/> - <action description="Gruppeneigene Objekte zum Verkauf freigeben" longdescription="Gruppeneigene Objekte zum Verkauf freigeben, können Sie im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“." name="object set sale"/> + <action description="Objekte an Gruppe übertragen" longdescription="Objekte an eine Gruppe übertragen können Sie im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“." name="object deed" value="36"/> + <action description="Gruppeneigene Objekte manipulieren (verschieben, kopieren, bearbeiten)" longdescription="Gruppeneigene Objekte lassen sich im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“ manipulieren (verschieben, kopieren, bearbeiten)." name="object manipulate" value="38"/> + <action description="Gruppeneigene Objekte zum Verkauf freigeben" longdescription="Gruppeneigene Objekte zum Verkauf freigeben, können Sie im Werkzeug „Bearbeiten“ auf der Registerkarte „Allgemein“." name="object set sale" value="39"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Gruppenschulden und Gruppendividenden zu aktivieren und den Zugriff auf das Gruppenkonto zu beschränken." name="Accounting"> - <action description="Gruppenschulden zahlen und Gruppendividende erhalten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit zahlen automatisch Gruppenschulden und erhalten Gruppendividenden. D. h. sie erhalten einen Anteil an Verkäufen von gruppeneigenem Land, der täglich verrechnet wird. Außerdem zahlen Sie automatisch für anfallende Kosten wie Parzellenlisten-Gebühren." name="accounting accountable"/> + <action description="Gruppenschulden zahlen und Gruppendividende erhalten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit zahlen automatisch Gruppenschulden und erhalten Gruppendividenden. D. h. sie erhalten einen Anteil an Verkäufen von gruppeneigenem Land, der täglich verrechnet wird. Außerdem zahlen Sie automatisch für anfallende Kosten wie Parzellenlisten-Gebühren." name="accounting accountable" value="40"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Senden, Empfangen und Anzeigen von Gruppennachrichten zu erlauben." name="Notices"> - <action description="Mitteilungen senden" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen im Abschnitt Gruppe > Mitteilungen senden." name="notices send"/> - <action description="Mitteilungen erhalten und ältere Mitteilungen anzeigen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen erhalten und im Abschnitt Gruppe > Mitteilungen ältere Mitteilungen anzeigen." name="notices receive"/> - </action_set> - <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Erstellen von Anfragen, das Abstimmen über Anfragen und das Anzeigen des Abstimmprotokolls zu erlauben." name="Proposals"> - <action description="Neue Anfragen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Anfragen stellen, über die auf der Registerkarte „Anfragen“ in der Gruppeninfo abgestimmt werden kann." name="proposal start"/> - <action description="Ãœber Anfragen abstimmen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können in der Gruppeninfo unter „Anfragen“ über Anfragen abstimmen." name="proposal vote"/> + <action description="Mitteilungen senden" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen im Abschnitt Gruppe > Mitteilungen senden." name="notices send" value="42"/> + <action description="Mitteilungen erhalten und ältere Mitteilungen anzeigen" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Mitteilungen erhalten und im Abschnitt Gruppe > Mitteilungen ältere Mitteilungen anzeigen." name="notices receive" value="43"/> </action_set> <action_set description="Diese Fähigkeiten ermöglichen es, den Zugang zu Gruppen-Chat und Gruppen-Voice-Chat zu steuern." name="Chat"> - <action description="Gruppen-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Chat und Gruppen-Voice-Chat beitreten." name="join group chat"/> - <action description="Gruppen-Voice-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Voice-Chat beitreten. HINWEIS: Sie benötigen die Fähigkeit „Gruppen-Chat beitreten“, um Zugang zu dieser Voice-Chat-Sitzung zu erhalten." name="join voice chat"/> - <action description="Gruppen-Chat moderieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können den Zugang zu und die Teilnahme an Gruppen-Chat- und Voice-Chat-Sitzungen steuern." name="moderate group chat"/> + <action description="Gruppen-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Chat und Gruppen-Voice-Chat beitreten." name="join group chat" value="16"/> + <action description="Gruppen-Voice-Chat beitreten" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können Gruppen-Voice-Chat beitreten. HINWEIS: Sie benötigen die Fähigkeit „Gruppen-Chat beitreten“, um Zugang zu dieser Voice-Chat-Sitzung zu erhalten." name="join voice chat" value="27"/> + <action description="Gruppen-Chat moderieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können den Zugang zu und die Teilnahme an Gruppen-Chat- und Voice-Chat-Sitzungen steuern." name="moderate group chat" value="37"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml index ae2991df45..f890506a5d 100644 --- a/indra/newview/skins/default/xui/de/strings.xml +++ b/indra/newview/skins/default/xui/de/strings.xml @@ -206,6 +206,9 @@ <string name="TooltipAgentUrl"> Anklicken, um das Profil dieses Einwohners anzuzeigen </string> + <string name="TooltipAgentInspect"> + Mehr über diesen Einwohner + </string> <string name="TooltipAgentMute"> Klicken, um diesen Einwohner stummzuschalten </string> @@ -762,6 +765,12 @@ <string name="Estate / Full Region"> Grundstück / Vollständige Region </string> + <string name="Estate / Homestead"> + Grundbesitz/Homestead + </string> + <string name="Mainland / Homestead"> + Mainland/Homestead + </string> <string name="Mainland / Full Region"> Mainland / Vollständige Region </string> @@ -798,7 +807,7 @@ <string name="xml_file"> XML-Datei </string> - <string name="dot_raw_file"> + <string name="raw_file"> RAW-Datei </string> <string name="compressed_image_files"> @@ -3574,7 +3583,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ Sie sind der einzige Benutzer in dieser Sitzung. </string> <string name="offline_message"> - [FIRST] [LAST] ist offline. + [NAME] ist offline. </string> <string name="invite_message"> Klicken Sie auf [BUTTON NAME], um eine Verbindung zu diesem Voice-Chat herzustellen. @@ -3643,7 +3652,10 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ http://secondlife.com/landing/voicemorphing </string> <string name="paid_you_ldollars"> - [NAME] hat Ihnen [AMOUNT] L$ bezahlt. + [NAME] hat Ihnen [REASON] [AMOUNT] L$ bezahlt. + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] hat Ihnen [AMOUNT] L$ bezahlt. </string> <string name="you_paid_ldollars"> Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt. @@ -3657,6 +3669,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="you_paid_ldollars_no_name"> Sie haben [REASON] [AMOUNT] L$ bezahlt. </string> + <string name="for item"> + für [ITEM] + </string> <string name="for a parcel of land"> für eine Landparzelle </string> @@ -3675,6 +3690,9 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_ <string name="to upload"> fürs Hochladen </string> + <string name="to publish a classified ad"> + um eine Anzeige aufzugeben + </string> <string name="giving"> [AMOUNT] L$ werden bezahlt </string> diff --git a/indra/newview/skins/default/xui/en/alert_check_box.xml b/indra/newview/skins/default/xui/en/alert_check_box.xml index 9f1bdb5193..5535a5dc2a 100644 --- a/indra/newview/skins/default/xui/en/alert_check_box.xml +++ b/indra/newview/skins/default/xui/en/alert_check_box.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <check_box - text_enabled_color="LabelTextColor" - text_disabled_color="LabelDisabledColor" + label_text.text_color="LabelTextColor" + label_text.text_readonly_color="LabelDisabledColor" font="SansSerif" follows="left|top" name="check"/>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml index 82bf5fc8da..54dbc698c8 100644 --- a/indra/newview/skins/default/xui/en/alert_line_editor.xml +++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml @@ -4,7 +4,7 @@ revert_on_esc="true" commit_on_focus_lost="true" ignore_tab="true" - max_length="254" + max_length_bytes="254" text_pad_right="0" text_pad_left="2" mouse_opaque="true"/> diff --git a/indra/newview/skins/default/xui/en/favorites_bar_button.xml b/indra/newview/skins/default/xui/en/favorites_bar_button.xml index b365040c20..e7dd62eb64 100644 --- a/indra/newview/skins/default/xui/en/favorites_bar_button.xml +++ b/indra/newview/skins/default/xui/en/favorites_bar_button.xml @@ -22,6 +22,6 @@ pad_right="9" scale_image="true" tab_stop="false" - top="0" + bottom="0" use_ellipses="true" width="140" /> diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml index d78fb281a9..930bbaa8cb 100644 --- a/indra/newview/skins/default/xui/en/floater_aaa.xml +++ b/indra/newview/skins/default/xui/en/floater_aaa.xml @@ -19,8 +19,8 @@ width="320"> <string name="nudge_parabuild" translate="false">Nudge 1</string> <string name="test_the_vlt">This string CHANGE2 is extracted.</string> - <string name="testing_eli">Testing access to beta branch</string> - <chat_history + <string name="testing_eli">Just a test. changes.</string> + <text_editor parse_urls="true" bg_readonly_color="ChatHistoryBgColor" bg_writeable_color="ChatHistoryBgColor" @@ -32,26 +32,51 @@ layout="topleft" height="260" name="chat_history" + max_length="200000" parse_highlights="true" text_color="ChatHistoryTextColor" text_readonly_color="ChatHistoryTextColor" translate="false" + track_end="true" + wrap="true" width="320"> -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. -Really long line that is long enough to wrap once with jyg descenders. - </chat_history> + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + Really long line that is long enough to wrap once with jyg descenders. + </text_editor> </floater> 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 e6f11cac60..3dd6c60095 100644 --- a/indra/newview/skins/default/xui/en/floater_about_land.xml +++ b/indra/newview/skins/default/xui/en/floater_about_land.xml @@ -128,7 +128,7 @@ height="23" layout="topleft" left_pad="2" - max_length="63" + max_length_bytes="63" name="Name" top_delta="0" width="365" /> @@ -220,7 +220,8 @@ layout="topleft" left_pad="2" name="OwnerText" - width="240"> + use_ellipses="true" + width="360"> Leyla Linden </text> <button @@ -254,7 +255,6 @@ </text> <!--TODO: HOOK UP GROUP ICON--> <text - enabled="false" follows="left|top" height="16" left_pad="2" @@ -374,7 +374,8 @@ Leyla Linden </text> left_delta="-199" name="For sale to" top_delta="20" - width="186"> + use_ellipses="true" + width="340"> For sale to: [BUYER] </text> <text @@ -410,7 +411,7 @@ Leyla Linden </text> right="-10" name="Cancel Land Sale" left_pad="5" - top_pad="-25" + top_pad="-15" width="180" /> <text type="string" @@ -541,7 +542,7 @@ Leyla Linden </text> layout="topleft" left_delta="0" name="Reclaim Land..." - top_delta="-61" + top_delta="-50" width="180" /> <button enabled="false" @@ -1079,7 +1080,7 @@ Leyla Linden </text> follows="left|top" height="23" layout="topleft" - max_length="6" + max_length_bytes="6" name="clean other time" left_pad="0" width="46" @@ -1623,7 +1624,7 @@ Only large parcels can be listed in search. height="23" layout="topleft" left_pad="0" - max_length="255" + max_length_bytes="255" name="media_url" select_on_focus="true" width="300" @@ -1664,7 +1665,7 @@ Only large parcels can be listed in search. height="20" layout="topleft" left="110" - max_length="255" + max_length_bytes="255" name="url_description" select_on_focus="true" tool_tip="Text displayed next to play/load button" @@ -1819,7 +1820,7 @@ Only large parcels can be listed in search. height="23" layout="topleft" left="100" - max_length="255" + max_length_bytes="255" name="music_url" top_delta="0" right="-15" diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml index f59badfcb4..a11946d352 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml @@ -5,11 +5,11 @@ height="350" layout="topleft" min_height="200" - min_width="265" + min_width="400" name="avatarpicker" help_topic="avatarpicker" title="CHOOSE RESIDENT" - width="265"> + width="500"> <floater.string name="not_found"> '[TEXT]' not found @@ -40,7 +40,7 @@ name="ResidentChooserTabs" tab_position="top" top="20" - width="265"> + width="500"> <panel border="none" height="150" @@ -83,14 +83,24 @@ left_pad="5" name="Find" width="45" /> - <scroll_list - follows="all" - height="98" - layout="topleft" - left="0" - name="SearchResults" - top="52" - width="132" /> + <scroll_list + draw_heading="true" + follows="all" + height="98" + layout="topleft" + left="0" + name="SearchResults" + top="52" + width="132"> + <columns + label="Name" + name="name" + width="150" /> + <columns + label="Username" + name="username" + width="150" /> + </scroll_list> </panel> <panel border="none" @@ -128,7 +138,7 @@ </button> <scroll_list follows="all" - height="100" + height="120" border="false" layout="topleft" left="0" @@ -194,7 +204,8 @@ width="28" name="Refresh" image_overlay="Refresh_Off" /> - <scroll_list + <scroll_list + draw_heading="true" follows="all" height="100" border="false" @@ -202,21 +213,30 @@ left="0" name="NearMe" sort_column="0" - top="50" - width="132" /> + top="52" + width="132"> + <columns + label="Name" + name="name" + width="150" /> + <columns + label="Username" + name="username" + width="150" /> + </scroll_list> </panel> </tab_container> <button - follows="right|bottom" + follows="left|bottom" height="23" label="OK" label_selected="OK" name="ok_btn" top_pad="3" - left="46" + left="10" width="100" /> <button - follows="right|bottom" + follows="left|bottom" height="23" label="Cancel" label_selected="Cancel" diff --git a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml index 457142f11c..4e0cfb0cd4 100644 --- a/indra/newview/skins/default/xui/en/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/en/floater_bulk_perms.xml @@ -7,7 +7,7 @@ name="floaterbulkperms" help_topic="floaterbulkperms" title="EDIT CONTENT PERMISSIONS" - width="300"> + width="410"> <floater.string name="nothing_to_modify_text"> Selection contains no editable contents. @@ -71,7 +71,7 @@ control_name="BulkChangeIncludeGestures" height="16" name="check_gesture" - left="65" + left="95" width="16" top="25" /> <icon @@ -87,7 +87,7 @@ height="16" layout="topleft" name="check_notecard" - left="65" + left="95" width="16" top_pad="5" /> <icon @@ -102,7 +102,7 @@ control_name="BulkChangeIncludeObjects" height="16" name="check_object" - left="65" + left="95" top_pad="5" width="16" /> <icon @@ -117,7 +117,7 @@ height="16" name="check_script" top="25" - left="120" + left="180" width="16" /> <icon @@ -133,7 +133,7 @@ height="16" name="check_sound" top_pad="5" - left="120" + left="180" width="16" /> <icon height="16" @@ -147,7 +147,7 @@ height="16" name="check_texture" top_pad="5" - left="120" + left="180" width="16" /> <icon height="16" @@ -162,7 +162,7 @@ layout="topleft" name="check_all" label="√ All" - left="180" + left="290" top="26" width="115"> <button.commit_callback @@ -221,7 +221,7 @@ height="28" layout="topleft" name="AnyoneLabel" - left="104" + left="124" top="110" width="92" word_wrap="true"> @@ -243,7 +243,7 @@ layout="topleft" name="NextOwnerLabel" top="110" - left="189" + left="275" width="92" word_wrap="true"> Next owner: @@ -292,7 +292,7 @@ height="23" label="OK" layout="topleft" - left="95" + left="205" name="apply" top_pad="10" width="90"> diff --git a/indra/newview/skins/default/xui/en/floater_bumps.xml b/indra/newview/skins/default/xui/en/floater_bumps.xml index 303c28d7c8..1f2fe62b3c 100644 --- a/indra/newview/skins/default/xui/en/floater_bumps.xml +++ b/indra/newview/skins/default/xui/en/floater_bumps.xml @@ -14,23 +14,23 @@ </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] bumped you + [TIME] [NAME] bumped you </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] pushed you with a script + [TIME] [NAME] pushed you with a script </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] hit you with an object + [TIME] [NAME] hit you with an object </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] hit you with a scripted object + [TIME] [NAME] hit you with a scripted object </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] hit you with a physical object + [TIME] [NAME] hit you with a physical object </floater.string> <floater.string name="timeStr"> diff --git a/indra/newview/skins/default/xui/en/floater_buy_contents.xml b/indra/newview/skins/default/xui/en/floater_buy_contents.xml index 77a0e9b91b..babbf0f5ca 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_contents.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_contents.xml @@ -56,7 +56,7 @@ <text type="string" length="1" - follows="left|bottom" + follows="left|right|bottom" font="SansSerif" height="16" layout="topleft" @@ -64,6 +64,7 @@ name="buy_text" text_color="white" top="220" + use_ellipses="true" width="260"> Buy for L$[AMOUNT] from [NAME]? </text> diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index 637f9f55d4..cd5922a9a2 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -114,7 +114,7 @@ </text> <line_editor type="string" - max_length="10" + max_length_bytes="10" halign="right" font="SansSerifMedium" select_on_focus="true" diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml index 4b990fa566..b9c415633f 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml @@ -16,6 +16,7 @@ https://quick-buy.secondlife.com/[LANGUAGE]/display/?sa=[SPECIFIC_AMOUNT]&sum=[SUM]&msg=[MSG]&bal=[BAL] </floater.string> <web_browser + trusted_content="true" follows="all" layout="topleft" left="1" diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml index c88de878f4..d5d4565ca1 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_land.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml @@ -569,7 +569,7 @@ sold with objects name="US$6.00/month,billedannually" /> </combo_box> <locate - height="10" + height="5" layout="topleft" /> <icon follows="top|left" @@ -590,7 +590,7 @@ sold with objects left="72" name="land_use_action" right="438" - top="284" + top="279" width="218" wrap="true"> Increase your monthly land use fees to US$ 40/month. @@ -610,7 +610,7 @@ sold with objects This parcel is 512 m² of land. </text> <locate - height="10" + height="5" layout="topleft" /> <icon follows="top|left" @@ -654,7 +654,7 @@ This parcel is 512 m² of land. left_delta="0" name="currency_action" top_pad="9" - width="90"> + width="95"> Buy additional L$ </text> <locate diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml index 3d8f5d678b..8dfb6ba00c 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml @@ -2,7 +2,7 @@ <floater legacy_header_height="18" can_resize="true" - height="290" + height="310" layout="topleft" min_height="150" min_width="225" @@ -84,16 +84,34 @@ length="1" follows="left|right|bottom" font="SansSerif" - height="16" + height="15" layout="topleft" left_delta="0" + line_spacing.pixels="7" name="buy_text" text_color="white" top_pad="5" use_ellipses="true" - width="260"> - Buy for L$[AMOUNT] from [NAME]? + width="260" + word_wrap="true"> +Buy for L$[AMOUNT] from: </text> + <text + type="string" + length="1" + follows="left|right|bottom" + font="SansSerif" + height="15" + layout="topleft" + left_delta="0" + line_spacing.pixels="7" + name="buy_name_text" + text_color="white" + top_pad="5" + use_ellipses="true" + width="260"> + [NAME]? + </text> <button follows="right|bottom" height="23" diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml deleted file mode 100644 index 01bced81d0..0000000000 --- a/indra/newview/skins/default/xui/en/floater_customize.xml +++ /dev/null @@ -1,3389 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_minimize="false" - follows="left|top" - height="583" - layout="topleft" - left_delta="-3" - name="floater customize" - help_topic="floater_customize" - save_rect="true" - title="APPEARANCE" - top_delta="-185" - width="600"> - <tab_container - height="517" - layout="topleft" - left="10" - name="customize tab container" - tab_min_width="96" - tab_position="left" - tab_height="50" - top="26" - width="580"> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="5" - name="body_parts_placeholder" - font="SansSerifSmallBold" - top="10" - width="100"> - Body Parts - </text> - <placeholder /> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Shape" - layout="topleft" - name="Shape" - help_topic="customize_shape_tab" - width="400"> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - left="315" - mouse_opaque="true" - name="square" - top="4" - width="18" /> - <icon - height="16" - top="10" - left="10" - layout="topleft" - mouse_opaque="true" - width="16" /> - <button - follows="left|top" - height="23" - label="Create New Shape" - label_selected="Create New Shape" - layout="topleft" - left="10" - name="Create New" - top="104" - width="160" /> - <button - follows="left|top" - height="23" - label="Body" - label_selected="Body" - layout="topleft" - left="10" - name="Body" - top="63" - width="82" /> - <button - follows="left|top" - height="23" - label="Head" - label_selected="Head" - layout="topleft" - left_delta="0" - name="Head" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Eyes" - label_selected="Eyes" - layout="topleft" - left_delta="0" - name="Eyes" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Ears" - label_selected="Ears" - layout="topleft" - left_delta="0" - name="Ears" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Nose" - label_selected="Nose" - layout="topleft" - left_delta="0" - name="Nose" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Mouth" - label_selected="Mouth" - layout="topleft" - left_delta="0" - name="Mouth" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Chin" - label_selected="Chin" - layout="topleft" - left_delta="0" - name="Chin" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Torso" - label_selected="Torso" - layout="topleft" - left_delta="0" - name="Torso" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Legs" - label_selected="Legs" - layout="topleft" - left_delta="0" - name="Legs" - top_pad="4" - width="82" /> - <radio_group - control_name="AvatarSex" - height="34" - layout="topleft" - name="sex radio" - top_pad="10" - width="82"> - <radio_item - height="16" - label="Female" - layout="topleft" - name="radio" - value="0" - width="82" /> - <radio_item - height="16" - label="Male" - layout="topleft" - name="radio2" - value="1" - width="82" /> - </radio_group> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new shape by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <text - type="string" - length="1" - top="488" - follows="left|top" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - left="10" - name="Item Action Label" - width="130"> - Shape: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - name="Save" - left_pad="2" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - name="Save As" - top="477" - left_pad="3" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Skin" - layout="topleft" - name="Skin" - help_topic="customize_skin_tab" - width="400"> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - left="315" - mouse_opaque="true" - name="square" - top="4" - width="18" /> - <icon - height="16" - top="10" - left="10" - layout="topleft" - mouse_opaque="true" - width="16" /> - <button - follows="left|top" - height="23" - label="Create New Skin" - label_selected="Create New Skin" - layout="topleft" - left_delta="0" - name="Create New" - top_delta="-249" - width="160" /> - <button - follows="left|top" - height="23" - label="Skin Color" - label_selected="Skin Color" - layout="topleft" - left="10" - name="Skin Color" - top="63" - width="82" /> - <button - follows="left|top" - height="23" - label="Face Detail" - label_selected="Face Detail" - layout="topleft" - left_delta="0" - name="Face Detail" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Makeup" - label_selected="Makeup" - layout="topleft" - left_delta="0" - name="Makeup" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Body Detail" - label_selected="Body Detail" - layout="topleft" - left_delta="0" - name="Body Detail" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new skin by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - allow_no_texture="true" - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Head Tattoos" - layout="topleft" - left="10" - name="Head Tattoos" - tool_tip="Click to choose a picture" - top="176" - width="82" /> - <texture_picker - allow_no_texture="true" - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Upper Tattoos" - layout="topleft" - left_delta="0" - name="Upper Tattoos" - tool_tip="Click to choose a picture" - top_delta="102" - width="82" /> - <texture_picker - allow_no_texture="true" - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Lower Tattoos" - layout="topleft" - left_delta="0" - name="Lower Tattoos" - tool_tip="Click to choose a picture" - top_delta="102" - width="82" /> - <text - type="string" - length="1" - top="488" - follows="left|top" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - left="10" - name="Item Action Label" - width="130"> - Skin: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Hair" - layout="topleft" - name="Hair" - help_topic="customize_hair_tab" - width="400"> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - left="315" - mouse_opaque="true" - name="square" - top="4" - width="18" /> - <icon - height="16" - top="10" - left="10" - layout="topleft" - mouse_opaque="true" - width="16" /> - <button - follows="left|top" - height="23" - label="Color" - label_selected="Color" - layout="topleft" - left="10" - name="Color" - top="63" - width="82" /> - <button - follows="left|top" - height="23" - label="Style" - label_selected="Style" - layout="topleft" - left_delta="0" - name="Style" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Eyebrows" - label_selected="Eyebrows" - layout="topleft" - name="Eyebrows" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Facial" - label_selected="Facial" - layout="topleft" - name="Facial" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new hair by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Texture" - layout="topleft" - left="10" - name="Texture" - tool_tip="Click to choose a picture" - top="176" - width="82" /> - <button - follows="left|top" - height="23" - label="Create New Hair" - label_selected="Create New Hair" - layout="topleft" - left_delta="0" - name="Create New" - top_delta="-89" - width="160" /> - <text - type="string" - length="1" - top="488" - follows="left|top" - font="SansSerif" - halign="right" - height="23" - layout="topleft" - name="Item Action Label" - left="10" - width="130"> - Hair: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Eyes" - layout="topleft" - name="Eyes" - help_topic="customize_eyes_tab" - width="400"> - <icon - follows="top|right" - height="18" - image_name="Lock" - layout="topleft" - left="315" - mouse_opaque="true" - name="square" - top="4" - width="18" /> - <icon - height="16" - top="10" - left="10" - layout="topleft" - mouse_opaque="true" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new set of eyes by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Iris" - layout="topleft" - left="10" - name="Iris" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <button - follows="left|top" - height="23" - label="Create New Eyes" - label_selected="Create New Eyes" - layout="topleft" - name="Create New" - top="66" - width="160" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - left="10" - width="130"> - Eyes: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="5" - name="clothes_placeholder" - font="SansSerifSmallBold" - top="125" - width="100"> - Clothes - </text> - <placeholder /> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Shirt" - layout="topleft" - name="Shirt" - help_topic="customize_shirt_tab" - top_delta="0" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - top="10" - left="10" - layout="topleft" - mouse_opaque="true" - width="16" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Create New Shirt" - label_selected="Create New Shirt" - layout="topleft" - name="Create New" - top="66" - width="160" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - left="10" - width="130"> - Shirt: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new shirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Pants" - layout="topleft" - name="Pants" - help_topic="customize_pants_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <button - follows="left|top" - height="23" - label="Create New Pants" - label_selected="Create New Pants" - layout="topleft" - name="Create New" - top="66" - width="160" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - name="Item Action Label" - left="10" - width="130"> - Pants: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on new pants by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Shoes" - layout="topleft" - name="Shoes" - help_topic="customize_shoes_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new pair of shoes by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Shoes" - label_selected="Create New Shoes" - layout="topleft" - name="Create New" - top_pad="18" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Shoes: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Socks" - layout="topleft" - name="Socks" - help_topic="customize_socks_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on new socks by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Socks" - label_selected="Create New Socks" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Socks: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Jacket" - layout="topleft" - name="Jacket" - help_topic="customize_jacket_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new jacket by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Jacket" - label_selected="Create New Jacket" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Upper Fabric" - layout="topleft" - left="10" - name="Upper Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Lower Fabric" - layout="topleft" - name="Lower Fabric" - tool_tip="Click to choose a picture" - top_delta="102" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Jacket: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Gloves" - layout="topleft" - name="Gloves" - help_topic="customize_gloves_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on new gloves by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Gloves" - label_selected="Create New Gloves" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Gloves: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Undershirt" - layout="topleft" - name="Undershirt" - help_topic="customize_undershirt_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new undershirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Undershirt" - label_selected="Create New Undershirt" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Undershirt: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Underpants" - layout="topleft" - name="Underpants" - help_topic="customize_underpants_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on new underpants by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Underpants" - label_selected="Create New Underpants" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Underpants: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Skirt" - layout="topleft" - name="Skirt" - help_topic="customize_skirt_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new skirt by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Skirt" - label_selected="Create New Skirt" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Fabric" - layout="topleft" - left="10" - name="Fabric" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="108" - label="Color/Tint" - layout="topleft" - name="Color/Tint" - tool_tip="Click to open color picker" - top_delta="102" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Skirt: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Tattoo" - layout="topleft" - name="Tattoo" - help_topic="customize_tattoo_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new tattoo by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Tattoo" - label_selected="Create New Tattoo" - layout="topleft" - name="Create New" - top_pad="7" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Head Tattoo" - layout="topleft" - left="10" - name="Head Tattoo" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Upper Tattoo" - layout="topleft" - name="Upper Tattoo" - tool_tip="Click to choose a picture" - left_delta="90" - width="82" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Lower Tattoo" - layout="topleft" - name="Lower Tattoo" - tool_tip="Click to choose a picture" - left_delta="90" - width="82" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - top_pad="4" - left="10" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Tattoo: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - <panel - border="false" - background_visible="true" - bg_alpha_color="DkGray2" - follows="left|top|right|bottom" - height="508" - label="Alpha" - layout="topleft" - name="Alpha" - help_topic="customize_alpha_tab" - width="400"> - <icon - follows="top|left" - height="18" - image_name="Lock" - layout="topleft" - left="10" - mouse_opaque="true" - name="square" - top="10" - width="18" /> - <icon - height="16" - layout="topleft" - left="10" - mouse_opaque="true" - top="10" - width="16" /> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title" - top="10" - width="355"> - [DESC] - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_no_modify" - top="10" - width="355"> - [DESC]: cannot modify - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_loading" - top="10" - width="355"> - [DESC]: loading... - </text> - <text - type="string" - length="1" - follows="left|top|right" - font="SansSerif" - height="16" - layout="topleft" - left="31" - name="title_not_worn" - top="10" - width="355"> - [DESC]: not worn - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="14" - layout="topleft" - left="10" - name="path" - top="36" - width="373"> - Located in [PATH] - </text> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="not worn instructions" - top="31" - word_wrap="true" - width="373"> - Put on a new alpha mask by dragging one from your inventory to your avatar. Alternately, you create a new one from scratch and wear it. - </text> - <button - follows="left|top" - height="23" - label="Create New Alpha" - label_selected="Create New Alpha" - layout="topleft" - name="Create New" - top_pad="18" - width="160" /> - <text - type="string" - length="1" - follows="left|top|right" - height="28" - layout="topleft" - left="10" - name="no modify instructions" - top="31" - word_wrap="true" - width="373"> - You do not have permission to modify this wearable. - </text> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Lower Alpha" - layout="topleft" - left="10" - name="Lower Alpha" - tool_tip="Click to choose a picture" - top="66" - width="82" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Upper Alpha" - layout="topleft" - name="Upper Alpha" - tool_tip="Click to choose a picture" - left_delta="90" - width="82" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Head Alpha" - layout="topleft" - name="Head Alpha" - tool_tip="Click to choose a picture" - left_delta="90" - width="82" /> - <check_box - control_name="LowerAlphaTextureInvisible" - follows="left" - height="16" - layout="topleft" - left="43" - name="lower alpha texture invisible" - top_delta="96" - width="16" /> - <check_box - control_name="UpperAlphaTextureInvisible" - follows="left" - height="16" - layout="topleft" - left_pad="72" - name="upper alpha texture invisible" - width="16" /> - <check_box - control_name="HeadAlphaTextureInvisible" - follows="left" - height="16" - layout="topleft" - left_pad="72" - name="head alpha texture invisible" - width="16" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Eye Alpha" - layout="topleft" - name="Eye Alpha" - tool_tip="Click to choose a picture" - left="10" - top_pad="20" - width="82" /> - <texture_picker - can_apply_immediately="true" - default_image_name="Default" - follows="left|top" - height="108" - label="Hair Alpha" - layout="topleft" - name="Hair Alpha" - left_delta="90" - tool_tip="Click to choose a picture" - width="82" /> - <check_box - control_name="Eye AlphaTextureInvisible" - follows="left" - height="16" - layout="topleft" - left="43" - name="eye alpha texture invisible" - top_delta="96" - width="16" /> - <check_box - control_name="HairAlphaTextureInvisible" - follows="left" - height="16" - layout="topleft" - left_pad="72" - name="hair alpha texture invisible" - width="16" /> - <button - follows="left|top" - height="23" - label="Take Off" - label_selected="Take Off" - layout="topleft" - name="Take Off" - left="10" - top_pad="20" - width="82" /> - <text - type="string" - length="1" - bottom="4" - follows="left|bottom" - font="SansSerif" - halign="right" - height="23" - layout="bottomleft" - left="10" - name="Item Action Label" - width="130"> - Alpha: - </text> - <button - follows="left|bottom" - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left_pad="2" - name="Save" - top="477" - width="82" /> - <button - follows="left|bottom" - height="23" - label="Save As..." - label_selected="Save As..." - layout="topleft" - left_pad="3" - name="Save As" - top="477" - width="115" /> - <button - follows="left|bottom" - height="23" - label="Revert" - label_selected="Revert" - layout="topleft" - left_pad="3" - name="Revert" - top="477" - width="120" /> - </panel> - </tab_container> - <scroll_container - follows="left|top|right|bottom" - height="409" - layout="topleft" - left="247" - mouse_opaque="false" - name="panel_container" - top="92" - width="330"> - <scrolling_panel_list - follows="left|bottom" - layout="topleft" - name="panel_list" /> - </scroll_container> - <button - bottom="460" - follows="right|left" - height="23" - label="Script Info" - label_selected="Script Info" - layout="topleft" - name="script_info" - tool_tip="Show scripts attached to your avatar" - left="13" - width="90" ></button> - <button - bottom="574" - follows="right|bottom" - height="23" - label="Make Outfit" - label_selected="Make Outfit" - layout="topleft" - name="make_outfit_btn" - right="-218" - width="120" /> - <button - bottom="574" - follows="right|bottom" - height="23" - label="Cancel" - label_selected="Cancel" - layout="topleft" - name="Cancel" - right="-10" - width="100" /> - <button - bottom="574" - follows="right|bottom" - height="23" - label="OK" - label_selected="OK" - layout="topleft" - name="Ok" - right="-114" - width="100" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_device_settings.xml b/indra/newview/skins/default/xui/en/floater_device_settings.xml deleted file mode 100644 index 91a7a678da..0000000000 --- a/indra/newview/skins/default/xui/en/floater_device_settings.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - height="260" - layout="topleft" - name="floater_device_settings" - help_topic="floater_device_settings" - title="VOICE CHAT DEVICE SETTINGS" - width="405"> - <panel - bottom="260" - filename="panel_audio_device.xml" - layout="topleft" - left="2" - name="device_settings" - right="-5" - top="20" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_display_name.xml b/indra/newview/skins/default/xui/en/floater_display_name.xml new file mode 100644 index 0000000000..9a9fd32a77 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_display_name.xml @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + can_minimize="false" + can_close="false" + height="300" + layout="topleft" + name="Display Name" + help_topic="display_name" + save_rect="false" + title="CHANGE DISPLAY NAME" + width="445"> + <text + type="string" + length="1" + follows="left|top" + font="SansSerif" + height="40" + layout="topleft" + left="25" + name="info_text" + top="40" + use_ellipses="true" + width="380" + wrap="true"> + The name you give your avatar is called your Display Name. You can change it once a week. + </text> + <text + type="string" + length="1" + follows="left|top" + font="SansSerif" + height="25" + layout="topleft" + left="25" + text_color="EmphasisColor" + name="lockout_text" + top="80" + use_ellipses="true" + visible="false" + width="410" + wrap="true"> + You cannot change your Display Name until: [TIME]. + </text> + <text + top_pad="10" + width="150" + height="20" + font="SansSerif" + name="set_name_label"> + New Display Name: + </text> + <line_editor + width="330" + name="display_name_editor" + max_length_chars="31" + height="20" + top_pad="5" + left="50" /> + <text + top_pad="15" + left="25" + width="300" + height="20" + font="SansSerif" + name="name_confirm_label"> + Type your new name again to confirm: + </text> + <line_editor + width="330" + name="display_name_confirm" + max_length_chars="31" + height="20" + top_pad="5" + left="50" /> + <button + height="23" + label="Save" + layout="topleft" + font="SansSerif" + left="35" + name="save_btn" + tool_tip="Save your new Display Name" + top_pad="40" + width="120" /> + <button + height="23" + label="Reset" + layout="topleft" + font="SansSerif" + left_pad="5" + name="reset_btn" + tool_tip="Make Display Name the same as Username" + width="120" /> + <button + height="23" + label="Cancel" + font="SansSerif" + layout="topleft" + left_pad="5" + name="cancel_btn" + width="120" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml index 9864083442..7ed020f832 100644 --- a/indra/newview/skins/default/xui/en/floater_event.xml +++ b/indra/newview/skins/default/xui/en/floater_event.xml @@ -1,311 +1,40 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater follows="all" - height="350" + height="400" + can_resize="true" help_topic="event_details" label="Event" layout="topleft" name="Event" + save_rect="true" + save_visibility="false" title="EVENT DETAILS" - width="330"> - <floater.string - name="none"> - none - </floater.string> - <floater.string - name="notify"> - Notify - </floater.string> - <floater.string - name="dont_notify"> - Don't Notify - </floater.string> - <floater.string - name="moderate"> - Moderate - </floater.string> - <floater.string - name="adult"> - Adult - </floater.string> - <floater.string - name="general"> - General - </floater.string> - <floater.string - name="unknown"> - Unknown - </floater.string> - <layout_stack - name="layout" - orientation="vertical" - follows="all" - layout="topleft" - left="0" - top="0" - height="350" - width="330" - border_size="0"> - <layout_panel - name="profile_stack" - follows="top|left" - layout="topleft" - top="0" - left="0" - height="305" - width="330"> - <text - follows="top|left|right" - font="SansSerifLarge" - text_color="white" - height="17" - layout="topleft" - left="10" - name="event_name" - top="5" - use_ellipses="true" - width="310"> - Nameless Event...of Doom! De doom! Doom doom. - </text> - <text - type="string" - length="1" - follows="top|left" - height="13" - text_color="LtGray_50" - layout="topleft" - left="25" - name="event_category" - width="300"> - (no category) - </text> - - <text - type="string" - length="1" - follows="top|left" - layout="topleft" - left="10" - top_pad="7" - name="event_runby_label" - width="90"> - Run by: - </text> - <text - follows="left|top" - height="20" - initial_value="(retrieving)" - layout="topleft" - left_pad="0" - link="true" - name="event_runby" - top_delta="0" - use_ellipses="true" - width="240" /> - <text - type="string" - length="1" - follows="top|left" - layout="topleft" - left="10" - top_pad="5" - name="event_date_label" - width="90"> - Date: - </text> - <text - type="string" - length="1" - left_pad="0" - height="17" - top_delta="0" - follows="top|left" + width="600"> + <floater.string + name="loading_text"> + Loading... + </floater.string> + <floater.string + name="done_text"> + Done + </floater.string> + <web_browser + trusted_content="true" + follows="left|right|top|bottom" layout="topleft" - name="event_date" - width="240"> - 10/10/2010 - </text> - <text - type="string" - length="1" - follows="top|left" - layout="topleft" - left="10" - top_pad="5" - name="event_duration_label" - width="90"> - Duration: - </text> - <text - type="string" - height="14" - length="1" - left_pad="0" - follows="top|left" - layout="topleft" - name="event_duration" - top_delta="0" - width="240"> - 1 hour - </text> - <text - type="string" - length="1" - follows="top|left" - layout="topleft" - left="10" - top_pad="5" - name="event_covercharge_label" - width="90"> - Cover charge: - </text> - <text - type="string" - follows="left|top" - height="16" - layout="topleft" - left_pad="0" - name="event_cover" - visible="true" - width="240" - top_delta="0"> - Free - </text> - <text - type="string" - length="1" - follows="top|left" - layout="topleft" - left="10" - top_pad="5" - name="event_location_label" - width="90"> - Location: - </text> - <text - type="string" - length="1" - height="20" - left_pad="0" - follows="top|left" - layout="topleft" - name="event_location" - use_ellipses="true" - top_delta="0" - value="SampleParcel, Name Long (145, 228, 26)" - width="240" /> - <icon - follows="top|left" - height="16" - image_name="Parcel_PG_Dark" - layout="topleft" - left="10" - name="rating_icon_pg" - width="18" /> - <icon - follows="top|left" - height="16" - image_name="Parcel_M_Dark" - layout="topleft" - left="10" - name="rating_icon_m" - top_delta="0" - width="18" /> - <icon - follows="top|left" - height="16" - image_name="Parcel_R_Dark" - layout="topleft" - left="10" - name="rating_icon_r" - top_delta="0" - width="18" /> - <text - follows="left|top" - height="16" - layout="topleft" - left_pad="12" - name="rating_label" - top_delta="3" - value="Rating:" - width="90" /> - <text - follows="left|right|top" - height="16" - layout="topleft" - left_pad="2" - name="rating_value" - top_delta="0" - value="unknown" - width="240" /> - <expandable_text - follows="left|top|right" - height="65" - layout="topleft" - left="6" - name="event_desc" - width="322"> - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</expandable_text> - </layout_panel> - <layout_panel - follows="left|right" - height="24" - layout="topleft" - mouse_opaque="false" - name="button_panel" - top="0" - left="0" - user_resize="false"> - <button - follows="left|top" - height="18" - image_selected="AddItem_Press" - image_unselected="AddItem_Off" - image_disabled="AddItem_Disabled" - layout="topleft" - left="6" - name="create_event_btn" - tool_tip="Create Event" - width="18" /> - <button - follows="left|top" - height="18" - image_selected="MinusItem_Press" - image_unselected="MinusItem_Off" - image_disabled="MinusItem_Disabled" - layout="topleft" - visible="false" - left="6" - top_pad="-7" - name="god_delete_event_btn" - tool_tip="Delete Event" - width="18" /> - <button - follows="left|top" - height="23" - label="Notify Me" - layout="topleft" - left_pad="3" - top_delta="-12" - name="notify_btn" - width="100" /> - <button - follows="left|top" - height="23" - label="Teleport" - layout="topleft" - left_pad="5" - name="teleport_btn" - width="100" /> - <button - follows="left|top" - height="23" - label="Map" - layout="topleft" - left_pad="5" - name="map_btn" - width="85" /> - </layout_panel> - </layout_stack> - </floater> + left="10" + name="browser" + height="365" + width="580" + top="0"/> + <text + follows="bottom|left" + height="16" + layout="topleft" + left_delta="0" + name="status_text" + top_pad="10" + width="150" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_first_time_tip.xml b/indra/newview/skins/default/xui/en/floater_first_time_tip.xml deleted file mode 100644 index e4ac8fed77..0000000000 --- a/indra/newview/skins/default/xui/en/floater_first_time_tip.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_close="true" - can_minimize="false" - height="250" - layout="topleft" - name="set_name_in_the_cladd" - help_topic="set_name_in_the_cladd" - save_rect="true" - width="300"> - <check_box - height="20" - follows="left|bottom|right" - label="Turn off Quick Tips" - layout="topleft" - left="5" - name="DontShowFirstTimeTip_checkbox" - text_enabled_color="white" - top="225" - width="200" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml index dfe3cf4485..e7131e20cb 100644 --- a/indra/newview/skins/default/xui/en/floater_god_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml @@ -73,7 +73,7 @@ height="20" layout="topleft" left_pad="0" - max_length="63" + max_length_bytes="63" name="region name" top_delta="0" width="250"> @@ -236,7 +236,7 @@ height="16" layout="topleft" left_delta="108" - max_length="10" + max_length_bytes="10" name="estate" top_delta="0" width="50" /> @@ -260,7 +260,7 @@ height="16" layout="topleft" left_delta="108" - max_length="10" + max_length_bytes="10" name="parentestate" tool_tip="This is the parent estate for this region" top_delta="0" @@ -287,7 +287,7 @@ height="16" layout="topleft" left_delta="88" - max_length="10" + max_length_bytes="10" name="gridposx" tool_tip="This is the grid x position for this region" top_delta="0" @@ -302,7 +302,7 @@ height="16" layout="topleft" left_pad="10" - max_length="10" + max_length_bytes="10" name="gridposy" tool_tip="This is the grid y position for this region" top_delta="0" @@ -329,7 +329,7 @@ height="16" layout="topleft" left_pad="0" - max_length="10" + max_length_bytes="10" name="redirectx" width="50"> <line_editor.commit_callback @@ -342,7 +342,7 @@ height="16" layout="topleft" left_pad="10" - max_length="10" + max_length_bytes="10" name="redirecty" top_delta="0" width="40"> @@ -754,7 +754,7 @@ height="22" layout="topleft" left_pad="10" - max_length="63" + max_length_bytes="63" name="parameter" top_delta="0" width="290" /> diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml index 27f8b4bb39..0ea42f9757 100644 --- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml @@ -71,6 +71,18 @@ name="16x" value="16" /> </combo_box> + <text + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_pad="10" + name="antialiasing restart" + top_delta="0" + width="188"> + (requires viewer restart) + </text> <spinner control_name="RenderGamma" decimal_digits="2" diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml index 470997d28b..837923bcf6 100644 --- a/indra/newview/skins/default/xui/en/floater_help_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml @@ -24,6 +24,7 @@ follows="left|right|top|bottom" layout="topleft" left="5" + orientation="vertical" name="stack1" top="20" width="640"> @@ -35,6 +36,7 @@ user_resize="false" width="620"> <web_browser + trusted_content="true" bottom="-25" follows="left|right|top|bottom" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml deleted file mode 100644 index 55efe83820..0000000000 --- a/indra/newview/skins/default/xui/en/floater_im.xml +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<multi_floater - legacy_header_height="18" - can_resize="true" - follows="left|bottom" - height="422" - layout="topleft" - min_height="130" - min_width="350" - name="im_floater" - help_topic="im_floater" - save_rect="true" - title="Instant Message" - width="419"> - <multi_floater.string - name="only_user_message"> - You are the only Resident in this session. - </multi_floater.string> - <multi_floater.string - name="offline_message"> - [FIRST] [LAST] is offline. - </multi_floater.string> - <multi_floater.string - name="invite_message"> - Click the [BUTTON NAME] button to accept/connect to this voice chat. - </multi_floater.string> - <multi_floater.string - name="muted_message"> - You have blocked this Resident. Sending a message will automatically unblock them. - </multi_floater.string> - <multi_floater.string - name="generic_request_error"> - Error making request, please try again later. - </multi_floater.string> - <multi_floater.string - name="insufficient_perms_error"> - You do not have sufficient permissions. - </multi_floater.string> - <multi_floater.string - name="session_does_not_exist_error"> - The session no longer exists - </multi_floater.string> - <multi_floater.string - name="no_ability_error"> - You do not have that ability. - </multi_floater.string> - <multi_floater.string - name="not_a_mod_error"> - You are not a session moderator. - </multi_floater.string> - <multi_floater.string - name="muted_error"> - A group moderator disabled your text chat. - </multi_floater.string> - <multi_floater.string - name="add_session_event"> - Unable to add Residents to chat session with [RECIPIENT]. - </multi_floater.string> - <multi_floater.string - name="message_session_event"> - Unable to send your message to the chat session with [RECIPIENT]. - </multi_floater.string> - <multi_floater.string - name="removed_from_group"> - You have been removed from the group. - </multi_floater.string> - <multi_floater.string - name="close_on_no_ability"> - You no longer have the ability to be in the chat session. - </multi_floater.string> - <tab_container - follows="left|top|right|bottom" - height="406" - layout="topleft" - left="1" - name="Preview Tabs" - tab_position="bottom" - top="16" - width="417" /> -</multi_floater> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index 6c1214f152..a371e98322 100644 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -30,12 +30,19 @@ top="20" left="0"> <layout_panel - name="panel_im_control_panel" - layout="topleft" - follows="left" - min_width="115" + name="im_control_panel_holder" + min_width="115" + width="150" + height="320" auto_resize="false" - user_resize="true" /> + user_resize="false"> + <panel + name="panel_im_control_panel" + layout="topleft" + height="320" + width="150" + follows="all"/> + </layout_panel> <layout_panel default_tab_group="3" left="0" diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml index 24fff6d4ae..81194f61cf 100644 --- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml @@ -8,7 +8,7 @@ layout="topleft" name="incoming call" help_topic="incoming_call" - title="UNKNOWN PERSON IS CALLING" + title="Incoming call" width="410"> <floater.string name="lifetime"> diff --git a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml index 366098013b..29f09dd0b2 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_item_properties.xml @@ -58,7 +58,7 @@ height="16" layout="topleft" left_delta="78" - max_length="63" + max_length_bytes="63" name="LabelItemName" top_delta="0" width="252" /> @@ -81,7 +81,7 @@ height="16" layout="topleft" left_delta="78" - max_length="127" + max_length_bytes="127" name="LabelItemDesc" top_delta="0" width="252" /> @@ -106,6 +106,7 @@ left_delta="78" name="LabelCreatorName" top_delta="0" + use_ellipses="true" width="170"> Nicole Linden </text> @@ -139,8 +140,9 @@ left_delta="78" name="LabelOwnerName" top_delta="0" + use_ellipses="true" width="170"> - Thrax Linden + Thrax Linden </text> <button follows="top|right" @@ -346,7 +348,7 @@ height="16" layout="topleft" left_pad="5" - max_length="25" + max_length_bytes="25" name="EditPrice" top_delta="0" width="242" /--> diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml index 1b21b97092..49e835cce4 100644 --- a/indra/newview/skins/default/xui/en/floater_media_browser.xml +++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml @@ -9,7 +9,7 @@ name="floater_about" help_topic="floater_about" save_rect="true" - single_instance="true" + auto_tile="true" title="MEDIA BROWSER" width="820"> <floater.string @@ -26,10 +26,12 @@ layout="topleft" left="10" name="stack1" + orientation="vertical" top="20" width="800"> <layout_panel auto_resize="false" + default_tab_group="1" height="20" layout="topleft" left="0" @@ -78,11 +80,13 @@ <combo_box allow_text_entry="true" follows="left|top|right" + tab_group="1" height="20" layout="topleft" left_pad="5" max_chars="1024" name="address" + combo_editor.select_on_focus="true" top_delta="0" width="540"> <combo_box.commit_callback @@ -192,9 +196,9 @@ top_delta="0" user_resize="false" width="540"> - <web_browser + <web_browser bottom="-30" - follows="left|right|top|bottom" + follows="all" layout="topleft" left="0" name="browser" diff --git a/indra/newview/skins/default/xui/en/floater_my_friends.xml b/indra/newview/skins/default/xui/en/floater_my_friends.xml deleted file mode 100644 index e7efcc7844..0000000000 --- a/indra/newview/skins/default/xui/en/floater_my_friends.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_close="false" - can_resize="true" - height="390" - layout="topleft" - min_height="240" - min_width="365" - name="floater_my_friends" - help_topic="floater_my_friends" - save_rect="true" - single_instance="true" - title="CONTACTS" - width="395"> - <tab_container - follows="all" - height="364" - layout="topleft" - left="4" - name="friends_and_groups" - tab_position="top" - tab_width="80" - top="20" - width="383"> - <panel - bottom="364" - filename="panel_friends.xml" - label="Friends" - layout="topleft" - left="0" - help_topic="my_friends_friends_tab" - name="friends_panel" - width="370" /> - <panel - bottom="364" - filename="panel_groups.xml" - label="Groups" - layout="topleft" - left="0" - help_topic="my_friends_groups_tab" - name="groups_panel" - width="370" /> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_notifications_console.xml b/indra/newview/skins/default/xui/en/floater_notifications_console.xml index ca81b9bcf0..e243ccd2f9 100644 --- a/indra/newview/skins/default/xui/en/floater_notifications_console.xml +++ b/indra/newview/skins/default/xui/en/floater_notifications_console.xml @@ -36,6 +36,7 @@ follows="left|right|top|bottom" layout="topleft" left="5" + orientation="vertical" name="notification_channels" right="-5" top="42" /> diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml index 1d73d516d0..068737494f 100644 --- a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml +++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml @@ -50,7 +50,7 @@ as a new Outfit: left_delta="0" show_text_as_tentative="false" top_pad="0" - max_length="63" + max_length_bytes="63" name="name ed" width="200"> [DESC] (new) diff --git a/indra/newview/skins/default/xui/en/floater_pay.xml b/indra/newview/skins/default/xui/en/floater_pay.xml index 509cffe490..41a7134b1d 100644 --- a/indra/newview/skins/default/xui/en/floater_pay.xml +++ b/indra/newview/skins/default/xui/en/floater_pay.xml @@ -7,7 +7,7 @@ name="Give Money" help_topic="give_money" save_rect="true" - width="225"> + width="250"> <string name="payee_group"> Pay Group @@ -16,28 +16,7 @@ name="payee_resident"> Pay Resident </string> - <text - type="string" - length="1" - follows="left|top" - height="18" - layout="topleft" - left="12" - name="payee_label" - top="22" - width="75"> - Pay: - </text> - <icon - height="16" - width="16" - image_name="Generic_Person" - mouse_opaque="true" - name="icon_person" - tool_tip="Person" - top_pad="0" - left="10" - /> + <text type="string" length="1" @@ -45,17 +24,19 @@ font="SansSerifSmall" height="16" layout="topleft" - left_pad="7" + left="10" name="payee_name" - width="210"> - [FIRST] [LAST] + top="25" + use_ellipses="true" + width="230"> + Test Name That Is Extremely Long To Check Clipping </text> <button height="23" label="L$1" label_selected="L$1" layout="topleft" - left="25" + left="35" name="fastpay 1" top_pad="8" width="80" /> @@ -72,7 +53,7 @@ label="L$10" label_selected="L$10" layout="topleft" - left="25" + left="35" name="fastpay 10" top_pad="8" width="80" /> @@ -90,7 +71,7 @@ follows="left|top" height="18" layout="topleft" - left="25" + left="35" name="amount text" top_pad="8" width="180"> @@ -102,8 +83,8 @@ height="19" top_pad="0" layout="topleft" - left="120" - max_length="9" + left="130" + max_length_bytes="9" name="amount" width="80" /> <button @@ -112,16 +93,16 @@ label="Pay" label_selected="Pay" layout="topleft" - left="10" + left="20" name="pay btn" - top_pad="5" + top_pad="15" width="100" /> <button height="23" label="Cancel" label_selected="Cancel" layout="topleft" - left_pad="5" + left_pad="10" name="cancel btn" width="100" /> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_pay_object.xml b/indra/newview/skins/default/xui/en/floater_pay_object.xml index d09a0a0535..d3a35c2051 100644 --- a/indra/newview/skins/default/xui/en/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/en/floater_pay_object.xml @@ -2,12 +2,12 @@ <floater legacy_header_height="18" can_minimize="false" - height="220" + height="225" layout="topleft" name="Give Money" help_topic="give_money" save_rect="true" - width="225"> + width="250"> <string name="payee_group"> Pay Group @@ -16,27 +16,16 @@ name="payee_resident"> Pay Resident </string> - <icon - height="16" - width="16" - image_name="Generic_Person" - mouse_opaque="true" - name="icon_person" - tool_tip="Person" - top_pad="24" - left="10" - /> <text - type="string" - length="1" follows="left|top" height="16" layout="topleft" - left_pad="7" - top_delta="3" + left="10" + top_pad="24" name="payee_name" - width="184"> - [FIRST] [LAST] + use_ellipses="true" + width="225"> + Ericacita Moostopolison </text> <text type="string" @@ -45,9 +34,9 @@ halign="left" height="14" layout="topleft" - left="34" + left="10" name="object_name_label" - top_pad="0" + top_pad="5" width="180"> Via object: </text> @@ -58,7 +47,7 @@ mouse_opaque="true" name="icon_object" tool_tip="Objects" - top_pad="0" + top_pad="5" left="10" /> <text @@ -128,7 +117,7 @@ top_pad="0" layout="topleft" left="120" - max_length="9" + max_length_bytes="9" name="amount" width="80" /> <button diff --git a/indra/newview/skins/default/xui/en/floater_post_process.xml b/indra/newview/skins/default/xui/en/floater_post_process.xml index 05559adf89..05943a10d3 100644 --- a/indra/newview/skins/default/xui/en/floater_post_process.xml +++ b/indra/newview/skins/default/xui/en/floater_post_process.xml @@ -416,7 +416,7 @@ label="Effect Name" layout="topleft" left_delta="0" - max_length="40" + max_length_bytes="40" name="PPEffectNameEditor" tab_group="1" top_pad="22" diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml index 6f78363b25..b4ecedd981 100644 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ b/indra/newview/skins/default/xui/en/floater_postcard.xml @@ -78,7 +78,7 @@ height="20" layout="topleft" left_delta="108" - max_length="100" + max_length_bytes="100" name="name_form" top_delta="-4" width="150" /> @@ -99,7 +99,7 @@ label="Type your subject here." layout="topleft" left_delta="108" - max_length="100" + max_length_bytes="100" name="subject_form" top_delta="-4" width="150" /> diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 50d0011338..36108442f3 100644 --- a/indra/newview/skins/default/xui/en/floater_preferences.xml +++ b/indra/newview/skins/default/xui/en/floater_preferences.xml @@ -65,13 +65,6 @@ name="display" /> <panel class="panel_preference" - filename="panel_preferences_privacy.xml" - label="Privacy" - layout="topleft" - help_topic="preferences_im_tab" - name="im" /> - <panel - class="panel_preference" filename="panel_preferences_sound.xml" label="Sound & Media" layout="topleft" @@ -86,6 +79,13 @@ name="chat" /> <panel class="panel_preference" + filename="panel_preferences_move.xml" + label="Move & View" + layout="topleft" + help_topic="preferences_move_tab" + name="audio" /> + <panel + class="panel_preference" filename="panel_preferences_alerts.xml" label="Notifications" layout="topleft" @@ -93,6 +93,20 @@ name="msgs" /> <panel class="panel_preference" + filename="panel_preferences_colors.xml" + label="Colors" + layout="topleft" + help_topic="preferences_im_tab" + name="colors" /> + <panel + class="panel_preference" + filename="panel_preferences_privacy.xml" + label="Privacy" + layout="topleft" + help_topic="preferences_im_tab" + name="im" /> + <panel + class="panel_preference" filename="panel_preferences_setup.xml" label="Setup" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_preview_animation.xml b/indra/newview/skins/default/xui/en/floater_preview_animation.xml index 6dc073728b..65efc46c71 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_animation.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_animation.xml @@ -32,7 +32,7 @@ height="19" layout="topleft" left_delta="95" - max_length="127" + max_length_bytes="127" name="desc" top="19" width="170" /> diff --git a/indra/newview/skins/default/xui/en/floater_preview_classified.xml b/indra/newview/skins/default/xui/en/floater_preview_classified.xml deleted file mode 100644 index 2017cf2bd1..0000000000 --- a/indra/newview/skins/default/xui/en/floater_preview_classified.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - auto_tile="true" - height="510" - layout="topleft" - name="classified_preview" - help_topic="classified_preview" - save_rect="true" - title="CLASSIFIED INFORMATION" - width="440"> - <floater.string - name="Title"> - Classified: [NAME] - </floater.string> - <panel - follows="bottom|left" - height="470" - layout="topleft" - left="0" - name="classified_details_panel" - top="20" - width="440" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_event.xml b/indra/newview/skins/default/xui/en/floater_preview_event.xml deleted file mode 100644 index a4066b34c5..0000000000 --- a/indra/newview/skins/default/xui/en/floater_preview_event.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - auto_tile="true" - height="510" - layout="topleft" - name="event_preview" - help_topic="event_preview" - save_rect="true" - title="EVENT INFORMATION" - width="440"> - <floater.string - name="Title"> - Event: [NAME] - </floater.string> - <panel - follows="bottom|left" - height="470" - layout="topleft" - left="0" - name="event_details_panel" - top="20" - width="440" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml index 1903401988..a17cf8eea8 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml @@ -80,7 +80,7 @@ height="20" layout="topleft" left_delta="89" - max_length="31" + max_length_bytes="31" name="trigger_editor" top_delta="-4" width="175" /> @@ -104,7 +104,7 @@ height="20" layout="topleft" left_delta="99" - max_length="31" + max_length_bytes="31" name="replace_editor" tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture" top_delta="-4" @@ -263,7 +263,7 @@ height="20" layout="topleft" left_delta="0" - max_length="127" + max_length_bytes="127" name="chat_editor" top="330" width="100" /> @@ -316,7 +316,7 @@ height="20" layout="topleft" left_pad="10" - max_length="15" + max_length_bytes="15" name="wait_time_editor" top_delta="1" width="50" /> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml deleted file mode 100644 index 66408a5057..0000000000 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture_info.xml +++ /dev/null @@ -1,57 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_minimize="false" - follows="left|top" - height="155" - layout="topleft" - name="Gesture" - help_topic="gesture" - save_rect="true" - title="GESTURE SHORTCUT" - width="260"> - <scroll_list - follows="top|left" - height="110" - layout="topleft" - left="10" - name="library_list" - top="10" - width="240"> - <scroll_list.rows - value="Animation" /> - <scroll_list.rows - value="Sound" /> - <scroll_list.rows - value="Chat" /> - <scroll_list.rows - value="Wait" /> - </scroll_list> - <!--button - follows="top|left" - height="20" - label="Preview" - layout="topleft" - left="20" - name="preview_btn" - top_pad="50" - width="80" /> - <button - follows="top|left" - height="20" - label="Save" - layout="topleft" - left_pad="5" - name="save_btn" - top_delta="0" - width="80" /> - <button - follows="top|left" - height="20" - label="Cancel (not working)" - layout="topleft" - left_pad="5" - name="save_btn" - top_delta="0" - width="80" /--> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml deleted file mode 100644 index 26252a7a16..0000000000 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,88 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_minimize="false" - follows="left|top" - height="90" - layout="topleft" - name="Gesture" - help_topic="gesture" - save_rect="true" - title="GESTURE SHORTCUT" - width="260"> - <text - type="string" - length="1" - follows="top|left" - font="SansSerifSmall" - height="10" - layout="topleft" - left="10" - name="trigger_label" - top_pad="10" - width="100"> - Chat: - </text> - <line_editor - follows="left|top" - height="20" - layout="topleft" - left_pad="5" - max_length="31" - name="trigger_editor" - top_delta="-4" - width="135" /> - <text - type="string" - length="1" - follows="top|left" - font="SansSerifSmall" - height="10" - layout="topleft" - left="10" - name="key_label" - top_pad="10" - width="100"> - Keyboard: - </text> - <combo_box - height="20" - label="None" - layout="topleft" - left_pad="13" - name="modifier_combo" - top_delta="-4" - width="50" /> - <combo_box - height="20" - label="None" - layout="topleft" - left_pad="5" - name="key_combo" - top_delta="0" - width="45" /> - <text - type="string" - length="1" - follows="top|left" - font="SansSerifSmall" - height="10" - layout="topleft" - left="10" - name="replace_text" - tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture!" - top_pad="10" - width="100"> - Replace: - </text> - <line_editor - follows="left|top" - height="20" - layout="topleft" - left_pad="5" - max_length="31" - name="replace_editor" - tool_tip="Replace the trigger word(s) with these words. For example, trigger 'hello' replace with 'howdy' will turn the chat 'I wanted to say hello' into 'I wanted to say howdy' as well as playing the gesture" - top_delta="-4" - width="135" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml deleted file mode 100644 index 34f707cd2a..0000000000 --- a/indra/newview/skins/default/xui/en/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,242 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_minimize="false" - follows="left|top" - height="155" - layout="topleft" - name="Gesture" - help_topic="gesture" - save_rect="true" - title="GESTURE SHORTCUT" - width="260"> - <scroll_list - follows="top|left" - height="110" - layout="topleft" - left="10" - name="step_list" - top_pad="10" - width="240" /> - <!--text - type="string" - length="1" - follows="top|left" - font="SansSerifSmall" - height="60" - layout="topleft" - left="10" - name="help_label" - top_pad="10" - width="200"> - All steps happen simultaneously, -unless you add wait steps. - </text--> - <!--text - follows="top|left" - height="60" - layout="topleft" - left="10" - name="options_text" - top_pad="10" - width="205" /--> - <!--combo_box - follows="top|left" - height="20" - layout="topleft" - left_delta="10" - name="animation_list" - top_pad="10" - width="100" /> - <combo_box - follows="top|left" - height="20" - layout="topleft" - left_delta="0" - name="sound_list" - top_delta="10" - width="100" /> - <line_editor - follows="top|left" - height="20" - layout="topleft" - left_delta="0" - max_length="127" - name="chat_editor" - top_pad="10" - width="100" /> - <radio_group - draw_border="false" - follows="top|left" - height="40" - layout="topleft" - left_pad="8" - name="animation_trigger_type" - top_pad="10" - width="80"> - <radio_item - height="16" - label="Start" - layout="topleft" - left="3" - name="start" - top="-11" - width="80" /> - <radio_item - height="16" - label="Stop" - layout="topleft" - left_delta="0" - name="stop" - top_pad="10" - width="80" /> - </radio_group> - <check_box - follows="top|left" - height="20" - label="until animations are done" - layout="topleft" - left="16" - name="wait_anim_check" - top_pad="10" - width="100" /> - <check_box - follows="top|left" - height="20" - label="time in seconds" - layout="topleft" - left_delta="0" - name="wait_time_check" - top_pad="10" - width="100" /> - <line_editor - follows="top|left" - height="20" - layout="topleft" - left_pad="5" - max_length="15" - name="wait_time_editor" - top_pad="10" - width="50" /--> - - - - <!--For pop out floater--> - <!--scroll_list - follows="top|left" - height="110" - layout="topleft" - left="10" - name="library_list" - top_pad="10" - width="260"> - <scroll_list.rows - value="Animation" /> - <scroll_list.rows - value="Sound" /> - <scroll_list.rows - value="Chat" /> - <scroll_list.rows - value="Wait" /> - </scroll_list> - <text - type="string" - length="1" - follows="top|left" - font="SansSerifSmall" - height="60" - layout="topleft" - left="10" - name="help_label" - top_pad="10" - width="200"> - All steps happen simultaneously, -unless you add wait steps. - </text> - <text - follows="top|left" - height="60" - layout="topleft" - left="10" - name="options_text" - top_pad="10" - width="205" /> - <combo_box - follows="top|left" - height="20" - layout="topleft" - left_delta="10" - name="animation_list" - top_pad="10" - width="100" /> - <combo_box - follows="top|left" - height="20" - layout="topleft" - left_delta="0" - name="sound_list" - top_delta="0" - width="100" /> - <line_editor - follows="top|left" - height="20" - layout="topleft" - left_delta="0" - max_length="127" - name="chat_editor" - top_delta="0" - width="100" /> - <radio_group - draw_border="false" - follows="top|left" - height="40" - layout="topleft" - left_pad="8" - name="animation_trigger_type" - top="445" - width="80"> - <radio_item - height="16" - label="Start" - layout="topleft" - left="3" - name="start" - top="-11" - width="80" /> - <radio_item - height="16" - label="Stop" - layout="topleft" - left_delta="0" - name="stop" - top_pad="10" - width="80" /> - </radio_group> - <check_box - follows="top|left" - height="20" - label="until animations are done" - layout="topleft" - left="16" - name="wait_anim_check" - top="430" - width="100" /> - <check_box - follows="top|left" - height="20" - label="time in seconds" - layout="topleft" - left_delta="0" - name="wait_time_check" - top_delta="20" - width="100" /> - <line_editor - follows="top|left" - height="20" - layout="topleft" - left_pad="5" - max_length="15" - name="wait_time_editor" - top_delta="0" - width="50" /--> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml index e5a5fab9b9..8c9e1d52b3 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml @@ -56,7 +56,7 @@ height="22" layout="topleft" left_pad="0" - max_length="127" + max_length_bytes="127" name="desc" width="296" /> <text_editor diff --git a/indra/newview/skins/default/xui/en/floater_preview_sound.xml b/indra/newview/skins/default/xui/en/floater_preview_sound.xml index f3be8c4131..62ef4c3097 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_sound.xml @@ -32,7 +32,7 @@ height="19" layout="topleft" left_pad="0" - max_length="127" + max_length_bytes="127" name="desc" width="170" /> <button diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml index 7fd7eab867..a79d2f63cb 100644 --- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml +++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml @@ -40,7 +40,7 @@ height="19" layout="topleft" left_pad="0" - max_length="127" + max_length_bytes="127" name="desc" width="190" /> <text diff --git a/indra/newview/skins/default/xui/en/floater_region_debug_console.xml b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml new file mode 100644 index 0000000000..cf95257b0a --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_region_debug_console.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + name="region_debug_console" + title="Region Debug" + layout="topleft" + min_height="300" + min_width="300" + height="400" + width="600" + default_tab_group="1"> + <text_editor + left="10" + type="string" + length="1" + follows="left|top|right|bottom" + font="Monospace" + height="366" + width="576" + ignore_tab="false" + layout="topleft" + max_length="65536" + name="region_debug_console_output" + show_line_numbers="false" + word_wrap="true" + track_end="true" + read_only="true"> + </text_editor> + <line_editor + border_style="line" + border_thickness="1" + tab_group="1" + follows="left|top|right" + font="SansSerif" + height="19" + layout="topleft" + bottom_delta="20" + max_length="127" + name="region_debug_console_input" + top_delta="0" + width="576" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml index 21c0bfef48..e6d749a3f0 100644 --- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml +++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml @@ -373,7 +373,6 @@ height="23" layout="topleft" left_delta="0" - max_length="32" name="abuser_name_edit" top_pad="0" width="195" /> @@ -417,7 +416,7 @@ height="23" layout="topleft" left="10" - max_length="256" + max_length_bytes="256" name="abuse_location_edit" top_pad="0" width="313" /> @@ -442,7 +441,7 @@ height="23" layout="topleft" left_delta="0" - max_length="64" + max_length_bytes="64" name="summary_edit" top_pad="0" width="313" /> diff --git a/indra/newview/skins/default/xui/en/floater_script_preview.xml b/indra/newview/skins/default/xui/en/floater_script_preview.xml index d0cd00d147..8c03b56040 100644 --- a/indra/newview/skins/default/xui/en/floater_script_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_script_preview.xml @@ -55,7 +55,7 @@ height="19" layout="topleft" left_delta="80" - max_length="127" + max_length_bytes="127" name="desc" top_delta="0" width="394" /> diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml index 354f1de85e..8770ede7e9 100644 --- a/indra/newview/skins/default/xui/en/floater_search.xml +++ b/indra/newview/skins/default/xui/en/floater_search.xml @@ -38,6 +38,7 @@ user_resize="false" width="630"> <web_browser + trusted_content="true" follows="left|right|top|bottom" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml index 4cae42bcfe..619669d28a 100644 --- a/indra/newview/skins/default/xui/en/floater_sell_land.xml +++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml @@ -164,7 +164,7 @@ left_delta="0" name="sell_to_agent" top_pad="4" - width="130" /> + width="170" /> <button height="20" label="Select" diff --git a/indra/newview/skins/default/xui/en/floater_sound_preview.xml b/indra/newview/skins/default/xui/en/floater_sound_preview.xml index ca54ee6604..af791466b6 100644 --- a/indra/newview/skins/default/xui/en/floater_sound_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_sound_preview.xml @@ -27,7 +27,7 @@ height="19" layout="topleft" left_delta="0" - max_length="63" + max_length_bytes="63" name="name_form" top_pad="0" width="280" /> @@ -51,7 +51,7 @@ height="19" layout="topleft" left_delta="0" - max_length="127" + max_length_bytes="127" name="description_form" top_pad="0" width="280" /> diff --git a/indra/newview/skins/default/xui/en/floater_statistics.xml b/indra/newview/skins/default/xui/en/floater_statistics.xml deleted file mode 100644 index 3a4e845141..0000000000 --- a/indra/newview/skins/default/xui/en/floater_statistics.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - can_resize="true" - follows="right|top" - height="392" - layout="topleft" - mouse_opaque="false" - name="stats floater" - help_topic="stats_floater" - title="STATISTICS" - width="250" /> diff --git a/indra/newview/skins/default/xui/en/floater_test_checkbox.xml b/indra/newview/skins/default/xui/en/floater_test_checkbox.xml index 1935edfcc1..95aaadfcf3 100644 --- a/indra/newview/skins/default/xui/en/floater_test_checkbox.xml +++ b/indra/newview/skins/default/xui/en/floater_test_checkbox.xml @@ -41,7 +41,7 @@ layout="topleft" left_delta="0" name="text_enabled_color_checkbox" - text_enabled_color="EmphasisColor" + label_text.text_color="EmphasisColor" top_pad="14" width="150" /> <check_box @@ -51,7 +51,7 @@ layout="topleft" left_delta="0" name="text_disabled_color_checkbox" - text_disabled_color="EmphasisColor_35" + label_text.text_readonly_color="EmphasisColor_35" top_pad="14" width="150" /> <check_box diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml index fb583114c0..13c850c86c 100644 --- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml +++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml @@ -79,7 +79,7 @@ follows="top|left" left="10" height="16"> - For widget list see https://wiki.lindenlab.com/wiki/Viewer:UI/Widgets + For widget list see http://wiki.secondlife.com/wiki/XUI_Reference </text> <!-- First column --> diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index cea2ba2c7f..e70e1eb61b 100644 --- a/indra/newview/skins/default/xui/en/floater_tools.xml +++ b/indra/newview/skins/default/xui/en/floater_tools.xml @@ -160,7 +160,7 @@ layout="topleft" left="10" height="70" - top="54" + top="59" name="focus_radio_group"> <radio_item top_pad="6" @@ -197,7 +197,7 @@ <radio_group left="10" height="70" - top="54" + top="59" layout="topleft" name="move_radio_group"> <radio_item @@ -253,7 +253,7 @@ height="28" control_name="EditLinkedParts" label="Edit linked" - layout="topleft" + layout="topleft" name="checkbox edit linked parts" top_pad="2"> <check_box.commit_callback @@ -770,7 +770,7 @@ name="General" top="16" width="295"> -<panel.string + <panel.string name="text deed continued"> Deed </panel.string> @@ -831,7 +831,7 @@ follows="left|top|right" height="19" left_pad="0" - max_length="63" + max_length_bytes="63" name="Object Name" select_on_focus="true" top_delta="0" @@ -849,7 +849,7 @@ follows="left|top|right" height="19" left_pad="0" - max_length="127" + max_length_bytes="127" name="Object Description" select_on_focus="true" top_delta="0" @@ -862,19 +862,23 @@ height="19" layout="topleft" name="Creator:" + top_pad="7" width="90"> Creator: </text> + <!-- *NOTE: Intentionally wide for long names --> <text type="string" length="1" follows="left|top" left_pad="0" - height="19" + height="30" layout="topleft" name="Creator Name" - width="175"> - Esbee Linden + top_delta="0" + width="190" + word_wrap="true"> + Mrs. Esbee Linden (esbee.linden) </text> <text type="string" @@ -884,19 +888,23 @@ height="19" layout="topleft" name="Owner:" + top_pad="3" width="90"> Owner: </text> + <!-- *NOTE: Intentionally wide for long names --> <text type="string" length="1" follows="left|top" - height="19" + height="30" layout="topleft" name="Owner Name" left_pad="0" - width="175"> - Erica Linden + top_delta="0" + width="190" + word_wrap="true"> + Mrs. Erica "Moose" Linden (erica.linden) </text> <text type="string" @@ -906,7 +914,7 @@ left="10" height="18" name="Group:" - top_pad="4" + top_pad="7" width="75"> Group: </text> @@ -923,7 +931,7 @@ height="23" image_overlay="Edit_Wrench" layout="topleft" - left_pad="3" + left_pad="13" name="button set group" tab_stop="false" tool_tip="Choose a group to share this object's permissions" @@ -936,7 +944,7 @@ name="checkbox share with group" tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions." top_pad="10" - left="106" + left="100" width="87" /> <button follows="top|left" @@ -945,7 +953,7 @@ label_selected="Deed" layout="topleft" name="button deed" - left_pad="3" + left_pad="19" tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer." width="80" /> <text @@ -957,7 +965,7 @@ top_pad="10" left="10" name="label click action" - width="98"> + width="118"> Click to: </text> <combo_box @@ -965,8 +973,8 @@ height="23" layout="topleft" name="clickaction" - width="168" - left_pad="0"> + width="148" + left_pad="10"> <combo_box.item label="Touch (default)" name="Touch/grab(default)" @@ -1001,7 +1009,7 @@ width="100" /> <!-- NEW SALE TYPE COMBO BOX --> <combo_box - left_pad="0" + left_pad="10" layout="topleft" follows="left|top" allow_text_entry="false" @@ -1033,7 +1041,7 @@ even though the user gets a free copy. decimal_digits="0" increment="1" top_pad="8" - left="108" + left="118" control_name="Edit Cost" name="Edit Cost" label="Price: L$" @@ -1060,8 +1068,8 @@ even though the user gets a free copy. bg_alpha_color="DkGray" name="perms_build" left="0" - top="241" - height="130" + top_pad="4" + height="105" width="290"> <text type="string" @@ -1132,14 +1140,16 @@ even though the user gets a free copy. top_delta="0" tool_tip="Next owner can give away or resell this object" width="100" /> +<!-- *NOTE: These "B/O/G/E/N/F fields may overlap "perm_modify" above, + but that's OK, this is used only for debugging. --> <text type="string" text_color="EmphasisColor" length="1" - top_pad="5" + top="9" follows="left|top" layout="topleft" - left="10" + left="230" name="B:" height="10" width="80"> @@ -1151,7 +1161,8 @@ even though the user gets a free copy. length="1" follows="left|top" layout="topleft" - left_pad="0" + left_delta="0" + top_pad="2" name="O:" height="10" width="80"> @@ -1163,7 +1174,8 @@ even though the user gets a free copy. length="1" follows="left|top" layout="topleft" - left_pad="0" + left_delta="0" + top_pad="2" name="G:" height="10" width="80"> @@ -1174,7 +1186,7 @@ even though the user gets a free copy. text_color="White" length="1" follows="left|top" - left="10" + left_delta="0" top_pad="2" layout="topleft" name="E:" @@ -1188,7 +1200,8 @@ even though the user gets a free copy. length="1" follows="left|top" layout="topleft" - left_pad="0" + left_delta="0" + top_pad="2" name="N:" height="10" width="80"> @@ -1200,7 +1213,8 @@ even though the user gets a free copy. length="1" follows="left|top" layout="topleft" - left_pad="0" + left_delta="0" + top_pad="2" name="F:" height="10" width="80"> @@ -1208,6 +1222,7 @@ even though the user gets a free copy. </text> </panel> </panel> + <!-- Object tab --> <panel border="false" follows="all" @@ -2539,7 +2554,7 @@ even though the user gets a free copy. height="16" layout="topleft" left="10" - max_length="63" + max_length_bytes="63" name="Home Url" select_on_focus="true" top="134" @@ -2975,4 +2990,5 @@ even though the user gets a free copy. top_pad="4" width="125" /> </panel> +<!-- end of tabs --> </floater> diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml index cbfaac958b..af1617eb39 100644 --- a/indra/newview/skins/default/xui/en/floater_tos.xml +++ b/indra/newview/skins/default/xui/en/floater_tos.xml @@ -58,6 +58,7 @@ Please read the following Terms of Service and Privacy Policy carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement. </text> <web_browser + trusted_content="true" follows="left|top" height="340" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml index 3b10a57c50..12c4561753 100644 --- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml @@ -241,7 +241,7 @@ height="20" layout="topleft" left_delta="100" - max_length="300" + max_length_bytes="300" name="executable_path_field" select_on_focus="true" tool_tip="The full path to an editor (executable) to edit floater XML files (quotes not necessary)" @@ -280,7 +280,7 @@ height="20" layout="topleft" left_delta="100" - max_length="300" + max_length_bytes="300" name="executable_args_field" select_on_focus="true" tool_tip="Command-line arguments to the editor; use '%FILE%' to refer to the target file; 'YourProgram.exe FileName.xml' will be run if this field is empty" @@ -321,7 +321,7 @@ height="20" layout="topleft" left_delta="65" - max_length="300" + max_length_bytes="300" name="vlt_diff_path_field" select_on_focus="true" tool_tip="The full path to an XML D0 or D1 localization difference file generated by the Viewer Localization Toolkit" diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml index bf5bd87ad6..1432099590 100644 --- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -86,6 +86,7 @@ visible="true" width="20" /> </layout_panel> + <layout_panel name="leave_call_panel" height="26" auto_resize="false"> <layout_stack clip="true" auto_resize="false" @@ -96,11 +97,15 @@ name="voice_effect_and_leave_call_stack" orientation="horizontal" width="262"> - <panel - class="panel_voice_effect" - name="panel_voice_effect" - visiblity_control="VoiceMorphingEnabled" - filename="panel_voice_effect.xml" /> + <layout_panel + height="26" + width="200"> + <panel + class="panel_voice_effect" + name="panel_voice_effect" + visiblity_control="VoiceMorphingEnabled" + filename="panel_voice_effect.xml" /> + </layout_panel> <layout_panel auto_resize="false" user_resize="false" @@ -118,6 +123,7 @@ width="100" /> </layout_panel> </layout_stack> + </layout_panel> <layout_panel follows="all" layout="topleft" diff --git a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml deleted file mode 100644 index 71812bd1a6..0000000000 --- a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="0" - can_close="false" - can_minimize="false" - height="100" - layout="topleft" - name="modal container" - width="240"> - <button - height="23" - label="Save" - label_selected="Save" - layout="topleft" - left="20" - name="Save" - top="70" - width="82" /> - <button - height="23" - label="Cancel" - label_selected="Cancel" - layout="topleft" - left_pad="36" - name="Cancel" - top_delta="0" - width="82" /> - <text - type="string" - length="1" - follows="left|top" - height="30" - layout="topleft" - word_wrap="true" - left="20" - name="Save item as:" - top="10" - width="200"> - Save item to my inventory as: - </text> - <line_editor - type="string" - length="1" - border_style="line" - border_thickness="1" - follows="left|top" - height="23" - layout="topleft" - left_delta="0" - max_length="63" - name="name ed" - top_pad="0" - width="200"> - New [DESC] - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml index 20629018e2..019e7cd032 100644 --- a/indra/newview/skins/default/xui/en/floater_world_map.xml +++ b/indra/newview/skins/default/xui/en/floater_world_map.xml @@ -541,7 +541,7 @@ halign="right" height="16" layout="topleft" - left="25" + left="15" name="events_label" top_pad="16" width="70"> @@ -574,7 +574,8 @@ left_delta="47" max_val="255" min_val="0" - name="teleport_coordinate_y" > + name="teleport_coordinate_y" + width="44" > <spinner.commit_callback function="WMap.Coordinates" /> </spinner> @@ -584,12 +585,13 @@ follows="right|bottom" height="23" increment="1" - initial_value="128" + initial_value="23" layout="topleft" left_delta="47" - max_val="255" + max_val="4096" min_val="0" - name="teleport_coordinate_z"> + name="teleport_coordinate_z" + width="55" > <spinner.commit_callback function="WMap.Coordinates" /> </spinner> diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml index 194ae151d2..853d5f8735 100644 --- a/indra/newview/skins/default/xui/en/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml @@ -9,13 +9,13 @@ bg_opaque_image="Inspector_Background" can_close="false" can_minimize="false" - height="148" + height="164" layout="topleft" name="inspect_avatar" single_instance="true" sound_flags="0" visible="true" - width="228"> + width="245"> <!-- Allowed fields include: [BORN_ON] ("12/3/2008") [SL_PROFILE] (Second Life profile), @@ -34,15 +34,38 @@ </string> <text follows="top|left" - font="SansSerifLarge" - height="16" + font="SansSerif" + height="20" left="8" - name="user_name" - top="10" + name="user_name_small" + top="7" text_color="White" use_ellipses="true" - value="Grumpity ProductEngine" - width="175" /> + word_wrap="true" + visible="false" + value="Grumpity ProductEngine with a long name" + width="185" /> + <text + follows="top|left" + font="SansSerifBigLarge" + height="21" + left="8" + name="user_name" + top="10" + text_color="White" + use_ellipses="true" + value="Grumpity ProductEngine" + width="190" /> + <text + follows="top|left" + height="16" + left="8" + name="user_slid" + font="SansSerifSmallBold" + text_color="EmphasisColor" + value="james.linden" + width="185" + use_ellipses="true" /> <text follows="top|left" height="16" @@ -50,6 +73,7 @@ name="user_subtitle" font="SansSerifSmall" text_color="White" + top_pad="0" value="11 Months, 3 days old" width="175" use_ellipses="true" /> @@ -60,9 +84,9 @@ name="user_details" right="-10" word_wrap="true" - top_pad="6" + top_pad="4" use_ellipses="true" - width="220">This is my second life description and I really think it is great. + width="220">This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot </text> <slider follows="top|left" @@ -76,7 +100,7 @@ tool_tip="Voice volume" top_pad="0" value="0.5" - width="195" /> + width="200" /> <button follows="top|left" height="16" @@ -108,7 +132,7 @@ height="20" label="Add Friend" left="8" - top="119" + top="135" name="add_friend_btn" width="90" /> <button @@ -152,7 +176,7 @@ width="35" /> <panel follows="top|left" - top="148" + top="164" left="0" height="60" width="228" diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index a1ca910cbb..520a604bde 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -65,25 +65,24 @@ mouse_opaque="false" name="world_stack" orientation="vertical"> - <panel auto_resize="true" - follows="all" - height="500" - layout="topleft" - tab_stop="false" - mouse_opaque="false" - name="hud container" - width="500"> - <panel auto_resize="false" - follows="left|top" - height="19" - left="0" - mouse_opaque="false" - name="topinfo_bar_container" - tab_stop="false" - top="0" - user_resize="false" - visible="false" - width="1024"/> + <layout_panel auto_resize="true" + follows="all" + height="500" + layout="topleft" + tab_stop="false" + mouse_opaque="false" + user_resize="false" + name="hud container" + width="500"> + <panel follows="left|top" + height="19" + left="0" + mouse_opaque="false" + name="topinfo_bar_container" + tab_stop="false" + top="0" + visible="false" + width="1024"/> <panel follows="right|top|bottom" height="500" mouse_opaque="false" @@ -101,10 +100,10 @@ name="stand_stop_flying_container" visible="false" width="500"/> - </panel> + </layout_panel> <layout_panel auto_resize="false" - follows="all" min_height="33" + height="33" mouse_opaque="false" name="bottom_tray_container" visible="false"/> @@ -112,7 +111,7 @@ </layout_panel> <!-- side tray --> <layout_panel auto_resize="false" - follows="all" + follows="top|bottom" height="500" min_width="333" mouse_opaque="false" @@ -187,15 +186,6 @@ <panel top="0" follows="all" height="768" - mouse_opaque="true" - name="progress_view" - filename="panel_progress.xml" - class="progress_view" - width="1024" - visible="false"/> - <panel top="0" - follows="all" - height="768" mouse_opaque="false" name="popup_holder" class="popup_holder" @@ -208,6 +198,22 @@ bottom="-1" height="11" /> </panel> + <view top="0" + left="0" + width="1024" + height="768" + name="hint_holder" + mouse_opaque="false" + follows="all"/> + <panel top="0" + follows="all" + height="768" + mouse_opaque="true" + name="progress_view" + filename="panel_progress.xml" + class="progress_view" + width="1024" + visible="false"/> <menu_holder top="0" follows="all" height="768" diff --git a/indra/newview/skins/default/xui/en/menu_add_wearable_gear.xml b/indra/newview/skins/default/xui/en/menu_add_wearable_gear.xml index 1925d3396f..5033ea9546 100644 --- a/indra/newview/skins/default/xui/en/menu_add_wearable_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_add_wearable_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu layout="topleft" name="Add Wearable Gear Menu"> <menu_item_check @@ -38,4 +38,4 @@ function="AddWearable.Gear.Visible" parameter="by_type" /> </menu_item_check> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_cof_gear.xml b/indra/newview/skins/default/xui/en/menu_cof_gear.xml index c2a11a64ec..a6e9a40e31 100644 --- a/indra/newview/skins/default/xui/en/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_cof_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu layout="topleft" name="Gear COF"> <menu @@ -10,4 +10,4 @@ label="New Body Parts" layout="topleft" name="COF.Geear.New_Body_Parts" /> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml index 649f0edff7..b08d21e8f4 100644 --- a/indra/newview/skins/default/xui/en/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_gesture_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu layout="topleft" mouse_opaque="false" name="menu_gesture_gear" @@ -62,4 +62,4 @@ function="Gesture.EnableAction" parameter="edit_gesture" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml index 334decdf58..58d58a6ca9 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu +<toggleable_menu create_jump_keys="true" layout="topleft" mouse_opaque="false" @@ -124,4 +124,4 @@ <menu_item_call.on_click function="InspectAvatar.Share"/> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml index 76f68c6d4b..f818ebe2d7 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_object_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu +<toggleable_menu create_jump_keys="true" layout="topleft" mouse_opaque="false" @@ -136,4 +136,4 @@ <menu_item_call.on_click function="InspectObject.MoreInfo"/> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml index 30c2cde552..50ad3f834e 100644 --- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<menu +<toggleable_menu create_jump_keys="true" layout="topleft" mouse_opaque="false" @@ -63,4 +63,4 @@ <menu_item_call.on_visible function="IsGodCustomerService"/> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml index c394700081..7fa4cd840a 100644 --- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu bottom="806" layout="topleft" left="0" @@ -16,22 +16,39 @@ </menu_item_call> <menu_item_separator layout="topleft" /> - <menu_item_call + <menu_item_check label="Sort by Name" layout="topleft" name="sort_by_name"> <on_click function="Inventory.GearDefault.Custom.Action" parameter="sort_by_name" /> - </menu_item_call> - <menu_item_call + <on_check + function="Inventory.GearDefault.Check" + parameter="sort_by_name" /> + </menu_item_check> + <menu_item_check label="Sort by Most Recent" layout="topleft" name="sort_by_recent"> <on_click function="Inventory.GearDefault.Custom.Action" parameter="sort_by_recent" /> - </menu_item_call> + <on_check + function="Inventory.GearDefault.Check" + parameter="sort_by_recent" /> + </menu_item_check> + <menu_item_check + label="Sort System Folders to Top" + layout="topleft" + name="sort_system_folders_to_top"> + <on_click + function="Inventory.GearDefault.Custom.Action" + parameter="sort_system_folders_to_top" /> + <on_check + function="Inventory.GearDefault.Check" + parameter="sort_system_folders_to_top" /> + </menu_item_check> <menu_item_separator layout="topleft" /> <menu_item_call @@ -125,4 +142,4 @@ function="Inventory.GearDefault.Custom.Action" parameter="empty_trash" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml index 732b8a788d..5fc25b8f0f 100644 --- a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu layout="topleft" visible="false" name="Gear Outfit"> @@ -212,4 +212,4 @@ function="Gear.OnVisible" parameter="delete" /> </menu_item_call> -</menu> +</toggleable_menu> 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 22796f7b68..29eeb93ac1 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 @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="menu_group_plus" +<toggleable_menu + name="menu_group_plus" left="0" bottom="0" visible="false" mouse_opaque="false"> <menu_item_check @@ -43,4 +44,4 @@ <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" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml index 2efb204ffb..c710fe3b9b 100644 --- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="menu_group_plus" +<toggleable_menu + name="menu_group_plus" left="0" bottom="0" visible="false" mouse_opaque="false"> <menu_item_check @@ -22,4 +23,4 @@ <menu_item_call.on_enable function="People.Group.Minus.Enable"/> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml index 69b3831738..f9db64b524 100644 --- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="menu_group_plus" +<toggleable_menu + name="menu_group_plus" left="0" bottom="0" visible="false" mouse_opaque="false"> <menu_item_check @@ -45,4 +46,4 @@ <menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects"> <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml index 5c9555db92..0634e3bd3b 100644 --- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml +++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu name="menu_group_plus" +<toggleable_menu + name="menu_group_plus" left="0" bottom="0" visible="false" mouse_opaque="false"> <menu_item_check @@ -35,4 +36,4 @@ <menu_item_call name="show_blocked_list" label="Show Blocked Residents & Objects"> <menu_item_call.on_click function="SideTray.ShowPanel" userdata="panel_block_list_sidetray" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml index 77cc3910fd..6f46165883 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu bottom="806" layout="topleft" left="0" @@ -145,4 +145,4 @@ function="Places.LandmarksGear.Folding.Action" parameter="sort_by_date" /> </menu_item_check> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml index 4b8bc8132f..121e7cc07a 100644 --- a/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/en/menu_places_gear_landmark.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu bottom="806" layout="topleft" left="0" @@ -174,4 +174,4 @@ function="Places.LandmarksGear.Enable" parameter="create_pick" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml index 134b331514..bc7d4fe33b 100644 --- a/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_teleport_history_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu name="Teleport History Gear Context Menu" left="0" bottom="0" @@ -33,4 +33,4 @@ <menu_item_call.on_click function="TeleportHistory.ClearTeleportHistory" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 19707c1bc9..27ab7c4fbd 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -94,6 +94,49 @@ function="Floater.Toggle" parameter="voice_effect" /> </menu_item_check> + <menu + create_jump_keys="true" + label="Movement" + name="Movement" + tear_off="true"> + <menu_item_call + label="Sit Down" + layout="topleft" + shortcut="alt|shift|S" + name="Sit Down Here"> + <menu_item_call.on_click + function="Self.SitDown" + parameter="" /> + <menu_item_call.on_enable + function="Self.EnableSitDown" /> + </menu_item_call> + <menu_item_check + label="Fly" + name="Fly" + shortcut="Home"> + <menu_item_check.on_check + function="Agent.getFlying" /> + <menu_item_check.on_click + function="Agent.toggleFlying" /> + <menu_item_check.on_enable + function="Agent.enableFlying" /> + </menu_item_check> + <menu_item_check + label="Always Run" + name="Always Run" + shortcut="control|R"> + <menu_item_check.on_check + function="World.CheckAlwaysRun" /> + <menu_item_check.on_click + function="World.AlwaysRun" /> + </menu_item_check> + <menu_item_call + label="Stop Animating Me" + name="Stop Animating My Avatar"> + <menu_item_call.on_click + function="Tools.StopAllAnimations" /> + </menu_item_call> + </menu> <menu create_jump_keys="true" label="My Status" @@ -359,6 +402,18 @@ <menu_item_check.on_check control="NavBarShowParcelProperties" /> </menu_item_check> + <menu_item_separator /> + <menu_item_check + label="Advanced Menu" + name="Show Advanced Menu" + shortcut="control|alt|shift|D"> + <on_check + function="CheckControl" + parameter="UseDebugMenus" /> + <on_click + function="ToggleControl" + parameter="UseDebugMenus" /> + </menu_item_check> </menu> <menu_item_separator/> @@ -670,6 +725,14 @@ <menu_item_call.on_enable function="Tools.EnableSaveToObjectInventory" /> </menu_item_call> + <menu_item_call + label="Return Object" + name="Return Object back to Owner"> + <menu_item_call.on_click + function="Object.Return" /> + <menu_item_call.on_enable + function="Object.EnableReturn" /> + </menu_item_call> </menu> <menu create_jump_keys="true" @@ -773,6 +836,16 @@ <menu_item_separator/> <menu_item_check + label="Show Selection Outlines" + name="Show Selection Outlines"> + <menu_item_check.on_check + function="CheckControl" + parameter="RenderHighlightSelections" /> + <menu_item_check.on_click + function="ToggleControl" + parameter="RenderHighlightSelections" /> + </menu_item_check> + <menu_item_check label="Show Hidden Selection" name="Show Hidden Selection"> <menu_item_check.on_check @@ -950,6 +1023,14 @@ function="Floater.Show" parameter="sl_about" /> </menu_item_call> + <menu_item_check + label="Enable Hints" + name="Enable Hints"> + <on_check + control="EnableUIHints"/> + <on_click + function="ToggleUIHints"/> + </menu_item_check> </menu> <menu create_jump_keys="true" @@ -958,12 +1039,6 @@ tear_off="true" visible="false"> <menu_item_call - label="Stop Animating Me" - name="Stop Animating My Avatar"> - <menu_item_call.on_click - function="Tools.StopAllAnimations" /> - </menu_item_call> - <menu_item_call label="Rebake Textures" name="Rebake Texture" shortcut="control|alt|R"> @@ -1500,28 +1575,17 @@ <menu_item_call.on_click function="View.DefaultUISize" /> </menu_item_call> - - <menu_item_separator/> - + <!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility. The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. --> <menu_item_check - label="Always Run" - name="Always Run" - shortcut="control|R"> - <menu_item_check.on_check - function="World.CheckAlwaysRun" /> - <menu_item_check.on_click - function="World.AlwaysRun" /> - </menu_item_check> - <menu_item_check - label="Fly" - name="Fly" - shortcut="Home"> - <menu_item_check.on_check - function="Agent.getFlying" /> - <menu_item_check.on_click - function="Agent.toggleFlying" /> - <menu_item_check.on_enable - function="Agent.enableFlying" /> + label="Show Advanced Menu - legacy shortcut" + name="Show Advanced Menu - legacy shortcut" + shortcut="control|alt|D"> + <on_check + function="CheckControl" + parameter="UseDebugMenus" /> + <on_click + function="ToggleControl" + parameter="UseDebugMenus" /> </menu_item_check> <menu_item_separator/> @@ -1667,23 +1731,6 @@ <menu_item_call.on_click function="View.ZoomOut" /> </menu_item_call> - <menu_item_separator - visible="false"/> - <!-- 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" - name="Show Advanced Menu" - shortcut="control|alt|D" - visible="false"> - <on_check - function="CheckControl" - parameter="UseDebugMenus" /> - <on_click - function="ToggleControl" - parameter="UseDebugMenus" /> - </menu_item_check> </menu> <!--Shortcuts--> <menu_item_separator/> @@ -1706,7 +1753,6 @@ function="ToggleControl" parameter="QAMode" /> </menu_item_check> - </menu> <menu create_jump_keys="true" @@ -2629,24 +2675,16 @@ function="Advanced.PrintTextureMemoryStats" /> </menu_item_call> <menu_item_check - label="Double-Click Auto-Pilot" - name="Double-Click Auto-Pilot"> - <menu_item_check.on_check - function="CheckControl" - parameter="DoubleClickAutoPilot" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="DoubleClickAutoPilot" /> - </menu_item_check> - <menu_item_check - label="Double-Click Teleport" - name="DoubleClick Teleport"> + label="Region Debug Console" + name="Region Debug Console" + shortcut="control|shift|`" + use_mac_ctrl="true"> <menu_item_check.on_check - function="CheckControl" - parameter="DoubleClickTeleport" /> + function="Floater.Visible" + parameter="region_debug_console" /> <menu_item_check.on_click - function="ToggleControl" - parameter="DoubleClickTeleport" /> + function="Floater.Toggle" + parameter="region_debug_console" /> </menu_item_check> <menu_item_separator /> @@ -2735,18 +2773,6 @@ function="Floater.Show" parameter="font_test" /> </menu_item_call> - <menu_item_call - label="Load from XML" - name="Load from XML"> - <menu_item_call.on_click - function="Advanced.LoadUIFromXML" /> - </menu_item_call> - <menu_item_call - label="Save to XML" - name="Save to XML"> - <menu_item_call.on_click - function="Advanced.SaveUIToXML" /> - </menu_item_call> <menu_item_check label="Show XUI Names" name="Show XUI Names"> @@ -2762,6 +2788,12 @@ <menu_item_call.on_click function="Advanced.SendTestIMs" /> </menu_item_call> + <menu_item_call + label="Flush Names Caches" + name="Flush Names Caches"> + <menu_item_call.on_click + function="Advanced.FlushNameCaches" /> + </menu_item_call> </menu> <menu create_jump_keys="true" @@ -3038,15 +3070,6 @@ <menu_item_separator/> - <menu_item_check - label="Show Admin Menu" - name="View Admin Options"> - <menu_item_check.on_check - function="Advanced.CheckViewAdminOptions" - parameter="ViewAdminOptions" /> - <menu_item_check.on_click - function="Advanced.ToggleViewAdminOptions" /> - </menu_item_check> <menu_item_call label="Request Admin Status" name="Request Admin Options" @@ -3061,6 +3084,17 @@ <menu_item_call.on_click function="Advanced.LeaveAdminStatus" /> </menu_item_call> + <menu_item_check + label="Show Admin Menu" + name="View Admin Options"> + <menu_item_check.on_enable + function="Advanced.EnableViewAdminOptions" /> + <menu_item_check.on_check + function="Advanced.CheckViewAdminOptions" + parameter="ViewAdminOptions" /> + <menu_item_check.on_click + function="Advanced.ToggleViewAdminOptions" /> + </menu_item_check> </menu> <menu create_jump_keys="true" 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 84ab16c709..0ac2c14253 100644 --- a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml +++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<menu +<toggleable_menu layout="topleft" visible="false" name="Gear Wearing"> @@ -20,4 +20,4 @@ function="Gear.OnEnable" parameter="take_off" /> </menu_item_call> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 609a9b09be..1247e4724e 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1,6 +1,5 @@ <?xml version="1.0" ?><notifications> - - <global name="skipnexttime"> + <global name="skipnexttime"> Don't show me this again </global> @@ -97,7 +96,7 @@ </template> <notification - functor="GenericAcknowledge" + functor="GenericAcknowledge" icon="alertmodal.tga" name="MissingAlert" label="Unknown Notification Message" @@ -257,7 +256,7 @@ Save all changes to clothing/body parts? name="GrantModifyRights" type="alertmodal"> Granting modify rights to another Resident allows them to change, delete or take ANY objects you may have in-world. Be VERY careful when handing out this permission. -Do you want to grant modify rights for [FIRST_NAME] [LAST_NAME]? +Do you want to grant modify rights for [NAME]? <usetemplate name="okcancelbuttons" notext="No" @@ -280,7 +279,7 @@ Do you want to grant modify rights for the selected Residents? icon="alertmodal.tga" name="RevokeModifyRights" type="alertmodal"> -Do you want to revoke modify rights for [FIRST_NAME] [LAST_NAME]? +Do you want to revoke modify rights for [NAME]? <usetemplate name="okcancelbuttons" notext="No" @@ -717,13 +716,13 @@ You can not wear that item because it has not yet loaded. Please try again in a name="MustHaveAccountToLogIn" type="alertmodal"> Oops! Something was left blank. -You need to enter both the First and Last name of your avatar. +You need to enter the Username name of your avatar. You need an account to enter [SECOND_LIFE]. Would you like to create one now? <url option="0" name="url" - openexternally = "1"> + target = "_external"> http://join.secondlife.com/ </url> @@ -737,7 +736,7 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now? icon="alertmodal.tga" name="InvalidCredentialFormat" type="alertmodal"> -You need to enter both the First and Last name of your avatar into the Username field, then login again. +You need to enter either the Username or both the First and Last name of your avatar into the Username field, then login again. </notification> @@ -1368,6 +1367,14 @@ Could not find 'data' chunk in WAV header: <notification icon="alertmodal.tga" + name="SoundFileInvalidChunkSize" + type="alertmodal"> +Wrong chunk size in WAV file: +[FILE] + </notification> + + <notification + icon="alertmodal.tga" name="SoundFileInvalidTooLong" type="alertmodal"> Audio file is too long (10 second maximum): @@ -2021,20 +2028,6 @@ You do not have permission to buy land for your active group. <notification icon="alertmodal.tga" label="Add Friend" - name="AddFriend" - type="alertmodal"> -Friends can give permissions to track each other on the map and receive online status updates. - -Offer friendship to [NAME]? - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="OK"/> - </notification> - - <notification - icon="alertmodal.tga" - label="Add Friend" name="AddFriendWithMessage" type="alertmodal"> Friends can give permissions to track each other on the map and receive online status updates. @@ -2060,7 +2053,8 @@ Would you be my friend? icon="alertmodal.tga" label="Save Outfit" name="SaveOutfitAs" - type="alertmodal"> + type="alertmodal" + unique="true"> Save what I'm wearing as a new Outfit: <form name="form"> <input name="message" type="text"> @@ -2076,7 +2070,6 @@ Would you be my friend? name="Cancel" text="Cancel"/> </form> - <unique/> </notification> <notification @@ -2128,7 +2121,7 @@ Would you be my friend? icon="alertmodal.tga" name="RemoveFromFriends" type="alertmodal"> -Do you want to remove [FIRST_NAME] [LAST_NAME] from your Friends List? +Do you want to remove [NAME] from your Friends List? <usetemplate name="okcancelbuttons" notext="Cancel" @@ -2381,7 +2374,7 @@ Deed this [AREA] m² of land to the group '[GROUP_NAME]'? name="DeedLandToGroupWithContribution" type="alertmodal"> By deeding this parcel, the group will be required to have and maintain sufficient land use credits. -The deed will include a simultaneous land contribution to the group from '[FIRST_NAME] [LAST_NAME]'. +The deed will include a simultaneous land contribution to the group from '[NAME]'. The purchase price of the land is not refunded to the owner. If a deeded parcel is sold, the sale price will be divided evenly among group members. Deed this [AREA] m² of land to the group '[GROUP_NAME]'? @@ -3201,6 +3194,88 @@ You are no longer frozen. <notification icon="alertmodal.tga" + name="SetDisplayNameSuccess" + type="alert"> +Hi [DISPLAY_NAME]! + +Just like in real life, it takes a while for everyone to learn about a new name. Please allow several days for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] in objects, scripts, search, etc. + </notification> + + <notification + icon="alertmodal.tga" + name="SetDisplayNameBlocked" + type="alert"> +Sorry, you cannot change your display name. If you feel this is in error, please contact support. + </notification> + + <notification + icon="alertmodal.tga" + name="SetDisplayNameFailedLength" + type="alertmodal"> +Sorry, that name is too long. Display names can have a maximum of [LENGTH] characters. + +Please try a shorter name. + </notification> + + <notification + icon="alertmodal.tga" + name="SetDisplayNameFailedGeneric" + type="alertmodal"> + Sorry, we could not set your display name. Please try again later. + </notification> + + <notification + icon="alertmodal.tga" + name="SetDisplayNameMismatch" + type="alertmodal"> + The display names you entered do not match. Please re-enter. + </notification> + + <!-- *NOTE: This should never happen --> + <notification + icon="alertmodal.tga" + name="AgentDisplayNameUpdateThresholdExceeded" + type="alertmodal"> +Sorry, you have to wait longer before you can change your display name. + +See http://wiki.secondlife.com/wiki/Setting_your_display_name + +Please try again later. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentDisplayNameSetBlocked" + type="alertmodal"> + Sorry, we could not set your requested name because it contains a banned word. + + Please try a different name. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentDisplayNameSetInvalidUnicode" + type="alertmodal"> + The display name you wish to set contains invalid characters. + </notification> + + <notification + icon="alertmodal.tga" + name="AgentDisplayNameSetOnlyPunctuation" + type="alertmodal"> + Your display name must contain letters other than punctuation. + </notification> + + + <notification + icon="notifytip.tga" + name="DisplayNameUpdate" + type="notifytip"> + [OLD_NAME] ([SLID]) is now known as [NEW_NAME]. + </notification> + + <notification + icon="alertmodal.tga" name="OfferTeleport" type="alertmodal"> Offer a teleport to your location with the following message? @@ -4011,37 +4086,37 @@ Go to your [http://secondlife.com/account/ Dashboard] to see your account histor <notification icon="alertmodal.tga" name="ConfirmQuit" - type="alertmodal"> + type="alertmodal" + unique="true"> Are you sure you want to quit? <usetemplate ignoretext="Confirm before I quit" name="okcancelignore" notext="Don't Quit" yestext="Quit"/> - <unique/> </notification> <notification icon="alertmodal.tga" name="DeleteItems" - type="alertmodal"> + type="alertmodal" + unique="true"> [QUESTION] <usetemplate ignoretext="Confirm before deleting items" name="okcancelignore" notext="Cancel" yestext="OK"/> - <unique/> </notification> <notification icon="alertmodal.tga" name="HelpReportAbuseEmailLL" - type="alert"> + type="alert" + unique="true"> Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards]. All reported abuses are investigated and resolved. - <unique/> </notification> <notification @@ -4516,14 +4591,14 @@ Topic: [SUBJECT], Message: [MESSAGE] icon="notifytip.tga" name="FriendOnline" type="notifytip"> -[FIRST] [LAST] is Online +[NAME] is Online </notification> <notification icon="notifytip.tga" name="FriendOffline" type="notifytip"> -[FIRST] [LAST] is Offline +[NAME] is Offline </notification> <notification @@ -4679,13 +4754,6 @@ You cannot remove protected categories. <notification icon="notifytip.tga" - name="OfferedCard" - type="notifytip"> -You have offered a calling card to [FIRST] [LAST] - </notification> - - <notification - icon="notifytip.tga" name="UnableToBuyWhileDownloading" type="notifytip"> Unable to buy while downloading object data. @@ -4839,7 +4907,15 @@ Please select at least one type of content to search (General, Moderate, or Adul <notification icon="notify.tga" - name="PaymentRecived" + name="PaymentReceived" + persist="true" + type="notify"> +[MESSAGE] + </notification> + + <notification + icon="notify.tga" + name="PaymentSent" persist="true" type="notify"> [MESSAGE] @@ -4858,14 +4934,10 @@ Event Notification: <form name="form"> <button index="0" - name="Teleport" - text="Teleport"/> + name="Details" + text="Details"/> <button index="1" - name="Description" - text="Description"/> - <button - index="2" name="Cancel" text="Cancel"/> </form> @@ -4941,7 +5013,7 @@ The objects you own on the selected parcel of land have been returned back to yo name="OtherObjectsReturned" persist="true" type="notify"> -The objects on the selected parcel of land that is owned by [FIRST] [LAST] have been returned to his or her inventory. +The objects on the selected parcel of land that is owned by [NAME] have been returned to his or her inventory. </notification> <notification @@ -4983,47 +5055,47 @@ Message from [NAME]: icon="notify.tga" name="NotSafe" persist="true" - type="notify"> + type="notify" + unique="true"> This land has damage enabled. You can be hurt here. If you die, you will be teleported to your home location. - <unique/> </notification> <notification icon="notify.tga" name="NoFly" persist="true" - type="notify"> + type="notify" + unique="true"> This area has flying disabled. You can't fly here. - <unique/> </notification> <notification icon="notify.tga" name="PushRestricted" persist="true" - type="notify"> + type="notify" + unique="true"> This area does not allow pushing. You can't push others here unless you own the land. - <unique/> </notification> <notification icon="notify.tga" name="NoVoice" persist="true" - type="notify"> + type="notify" + unique="true"> This area has voice chat disabled. You won't be able to hear anyone talking. - <unique/> </notification> <notification icon="notify.tga" name="NoBuild" persist="true" - type="notify"> + type="notify" + unique="true"> This area has building disabled. You can't build or rez objects here. - <unique/> </notification> <notification @@ -5267,7 +5339,7 @@ No valid parcel could be found. icon="notify.tga" name="ObjectGiveItem" type="offer"> -An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJECTTYPE]: +An object named <nolink>[OBJECTFROMNAME]</nolink> owned by [NAME_SLURL] has given you this [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button @@ -5418,7 +5490,7 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC name="OfferFriendshipNoMessage" persist="true" type="notify"> -[NAME] is offering friendship. +[NAME_SLURL] is offering friendship. (By default, you will be able to see each other's online status.) <form name="form"> @@ -5467,7 +5539,7 @@ Friendship offer declined. name="OfferCallingCard" persist="true" type="notify"> -[FIRST] [LAST] is offering their calling card. +[NAME] is offering their calling card. This will add a bookmark in your inventory so you can quickly IM this Resident. <form name="form"> <button @@ -5511,7 +5583,7 @@ Load web page [URL]? [MESSAGE] -From object: [OBJECTNAME], owner: [NAME]? +From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME]? <form name="form"> <button index="0" @@ -5553,7 +5625,7 @@ The item you are trying to wear uses a feature that your Viewer can't read. name="ScriptQuestion" persist="true" type="notify"> -'[OBJECTNAME]', an object owned by '[NAME]', would like to: +'<nolink>[OBJECTNAME]</nolink>', an object owned by '[NAME]', would like to: [QUESTIONS] Is this OK? @@ -5579,7 +5651,7 @@ Is this OK? priority="high" persist="true" type="notify"> -An object named '[OBJECTNAME]', owned by '[NAME]' would like to: +An object named '<nolink>[OBJECTNAME]</nolink>', owned by '[NAME]' would like to: [QUESTIONS] If you do not trust this object and its creator, you should deny the request. @@ -5606,7 +5678,7 @@ Grant this request? icon="notify.tga" name="ScriptDialog" type="notify"> -[FIRST] [LAST]'s '[TITLE]' +[NAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button @@ -5620,7 +5692,7 @@ Grant this request? icon="notify.tga" name="ScriptDialogGroup" type="notify"> -[GROUPNAME]'s '[TITLE]' +[GROUPNAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button @@ -5836,7 +5908,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block name="AutoUnmuteByIM" persist="true" type="notify"> -[FIRST] [LAST] was sent an instant message and has been automatically unblocked. +[NAME] was sent an instant message and has been automatically unblocked. </notification> <notification @@ -5844,7 +5916,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block name="AutoUnmuteByMoney" persist="true" type="notify"> -[FIRST] [LAST] was given money and has been automatically unblocked. +[NAME] was given money and has been automatically unblocked. </notification> <notification @@ -5852,7 +5924,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block name="AutoUnmuteByInventory" persist="true" type="notify"> -[FIRST] [LAST] was offered inventory and has been automatically unblocked. +[NAME] was offered inventory and has been automatically unblocked. </notification> <notification @@ -5944,9 +6016,9 @@ The voice call you are trying to join, [VOICE_CHANNEL_NAME], has reached maximum <notification icon="notifytip.tga" name="ProximalVoiceChannelFull" - type="notifytip"> + type="notifytip" + unique="true"> We're sorry. This area has reached maximum capacity for voice conversations. Please try to use voice in another area. - <unique/> </notification> <notification @@ -6003,9 +6075,9 @@ Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now duration="10" icon="notifytip.tga" name="VoiceLoginRetry" - type="notifytip"> + type="notifytip" + unique="true"> We are creating a voice channel for you. This may take up to one minute. - <unique/> </notification> <notification @@ -6013,10 +6085,10 @@ We are creating a voice channel for you. This may take up to one minute. name="VoiceEffectsExpired" sound="UISndAlert" persist="true" - type="notify"> + type="notify" + unique="true"> One or more of your subscribed Voice Morphs has expired. [[URL] Click here] to renew your subscription. - <unique/> </notification> <notification @@ -6024,10 +6096,10 @@ One or more of your subscribed Voice Morphs has expired. name="VoiceEffectsExpiredInUse" sound="UISndAlert" persist="true" - type="notify"> + type="notify" + unique="true"> The active Voice Morph has expired, your normal voice settings have been applied. [[URL] Click here] to renew your subscription. - <unique/> </notification> <notification @@ -6035,21 +6107,20 @@ The active Voice Morph has expired, your normal voice settings have been applied name="VoiceEffectsWillExpire" sound="UISndAlert" persist="true" - type="notify"> + type="notify" + unique="true"> One or more of your Voice Morphs will expire in less than [INTERVAL] days. [[URL] Click here] to renew your subscription. - <unique/> </notification> - LLNotificationsUtil::add("VoiceEffectsNew"); <notification icon="notify.tga" name="VoiceEffectsNew" sound="UISndAlert" persist="true" - type="notify"> + type="notify" + unique="true"> New Voice Morphs are available! - <unique/> </notification> <notification @@ -6268,7 +6339,6 @@ You sent out an update of your appearance after [TIME] seconds. [STATUS] </notification> - <notification icon="notifytip.tga" name="AvatarRezCloudNotification" @@ -6376,8 +6446,8 @@ Are you sure you want to leave this call? ignoretext="Confirm before I leave call" name="okcancelignore" notext="No" - yestext="Yes"/> - <unique/> + yestext="Yes" + unique="true"/> </notification> <notification @@ -6393,10 +6463,92 @@ Mute everyone? ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" yestext="Ok" - notext="Cancel"/> - <unique/> + notext="Cancel" + unique="true"/> + </notification> + + <notification + name="HintChat" + label="Chat" + type="hint" + unique="true"> + To join the conversation, type into the chat field below. + </notification> + + <notification + name="HintSit" + label="Stand" + type="hint" + unique="true"> + To stand up and exit the sitting position, click the Stand button. </notification> + <notification + name="HintDestinationGuide" + label="Explore the World" + type="hint" + unique="true"> + The Destination Guide contains thousands of new places to discover. Select a location and choose Teleport to start exploring. + </notification> + + <notification + name="HintSidePanel" + label="Side Panel" + type="hint" + unique="true"> + Get quick access to your inventory, outfits, profiles and more in the side panel. + </notification> + + <notification + name="HintMove" + label="Move" + type="hint" + unique="true"> + To walk or run, open the Move Panel and use the directional arrows to navigate. You can also use the directional keys on your keyboard. + </notification> + + <notification + name="HintDisplayName" + label="Display Name" + type="hint" + unique="true"> + Set your customizable display name here. This is in addition to your unique username, which can't be changed. You can change how you see other people's names in your preferences. + </notification> + + <notification + name="HintInventory" + label="Inventory" + type="hint" + unique="true"> + Check your inventory to find items. Newest items can be easily found in the Recent tab. + </notification> + + <notification + name="HintLindenDollar" + label="You've got Linden Dollars!" + type="hint" + unique="true"> + Here's your current balance of L$. Click Buy L$ to purchase more Linden Dollars. + </notification> + + <notification + name="PopupAttempt" + icon="Popup_Caution" + type="browser"> + A pop-up was prevented from opening. + <form name="form"> + <ignore name="ignore" + control="MediaEnablePopups" + invert_control="true" + text="Enable all pop-ups"/> + <button default="true" + index="0" + name="open" + text="Open pop-up window"/> + </form> + </notification> + + <global name="UnsupportedCPU"> - Your CPU speed does not meet the minimum requirements. </global> diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml index bef5f8dafd..3e3271b181 100644 --- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml +++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml @@ -53,6 +53,7 @@ top="10" left_pad="20" height="14" + parse_urls="false" width="245" length="1" follows="right|left" diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml index 3416b2369d..72f41c62f4 100644 --- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml +++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml @@ -71,7 +71,7 @@ top="10" left_pad="10" height="14" - width="255" + width="250" length="1" follows="right|left" use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/panel_audio_device.xml b/indra/newview/skins/default/xui/en/panel_audio_device.xml deleted file mode 100644 index 546f46205f..0000000000 --- a/indra/newview/skins/default/xui/en/panel_audio_device.xml +++ /dev/null @@ -1,152 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - height="240" - layout="topleft" - left="8" - name="device_settings" - top="240" - width="404"> - <panel.string - name="default_text"> - Default - </panel.string> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="6" - name="Audio Devices" - width="200"> - Audio Devices - </text> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="20" - name="Input device (microphone):" - top="26" - width="200"> - Input device (microphone): - </text> - <combo_box - height="18" - layout="topleft" - left_delta="0" - max_chars="128" - name="voice_input_device" - top_pad="2" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left_delta="0" - name="Output device (speakers):" - top_pad="9" - width="200"> - Output device (speakers): - </text> - <combo_box - height="18" - layout="topleft" - left_delta="0" - max_chars="128" - name="voice_output_device" - top_pad="2" - width="225" /> - <text - type="string" - length="1" - follows="left|top" - height="16" - layout="topleft" - left="6" - name="Input level:" - top="121" - width="200"> - Input Level - </text> - <text_editor - type="string" - length="1" - top="135" - bg_readonly_color="0 0 0 0" - enabled="false" - height="60" - border_visible="false" - layout="topleft" - left_delta="10" - max_length="65535" - name="voice_intro_text1" - tab_stop="false" - width="380" - word_wrap="true"> - Adjust the slider to control how loud you sound to other Residents. To test the input level, simply speak into your microphone. - </text_editor> - <slider_bar - follows="left|top" - height="17" - increment="0.05" - initial_value="1.0" - layout="topleft" - left_delta="5" - max_val="2" - name="mic_volume_slider" - tool_tip="Change the volume using this slider" - top="202" - width="90" /> - <text - type="string" - length="1" - follows="left|top" - height="20" - layout="topleft" - left_pad="5" - name="wait_text" - top_delta="1" - width="200"> - Please wait - </text> - <locate - height="20" - layout="topleft" - left_delta="0" - name="bar0" - top_delta="5" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="2" - name="bar1" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="2" - name="bar2" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="2" - name="bar3" - top_delta="0" - width="20" /> - <locate - height="20" - layout="topleft" - left_pad="2" - name="bar4" - top_delta="0" - width="20" /> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index cdd596222d..63068a069f 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -32,31 +32,32 @@ orientation="horizontal" top="0" width="1310"> - <icon + <layout_panel auto_resize="false" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" + user_resize="false" min_width="2" - top="0" width="2" /> <layout_panel auto_resize="false" - filename="panel_nearby_chat_bar.xml" - follows="left|right" - height="28" layout="topleft" - left="0" max_width="320" - min_height="23" min_width="214" + height="28" mouse_opaque="false" - name="chat_bar" - top="4" + name="chat_bar_layout_panel" user_resize="true" - width="308" /> + width="308" > + <panel + name="chat_bar" + filename="panel_nearby_chat_bar.xml" + left="0" + height="28" + width="308" + top="0" + mouse_opaque="false" + follows="left|right" + /> + </layout_panel> <!-- There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap) --> @@ -404,18 +405,10 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. width="7" /> </chiclet_panel> </layout_panel> - <icon - auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" - min_width="4" - name="DUMMY" - top="0" - width="4" /> + <layout_panel auto_resize="false" + user_resize="false" + width="4" + min_width="4"/> <layout_panel auto_resize="false" follows="right" @@ -507,17 +500,11 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well </button> </chiclet_notification> </layout_panel> - <icon + <layout_panel auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" + user_resize="false" min_width="4" name="DUMMY2" - top="0" width="8" /> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml index 6e9476f814..efb1da4c05 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml @@ -28,30 +28,28 @@ orientation="horizontal" top="0" width="1000"> - <icon + <layout_panel auto_resize="false" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" + user_resize="false" min_width="2" - left="0" - top="0" width="2" /> <layout_panel mouse_opaque="false" auto_resize="true" - follows="left|right" height="28" layout="topleft" - left="0" - min_height="23" width="310" - top="4" min_width="188" - name="chat_bar" - user_resize="false" - filename="panel_nearby_chat_bar.xml" /> + user_resize="false"> + <panel + left="0" + filename="panel_nearby_chat_bar.xml" + follows="left|right" + top="4" + width="310" + name="chat_bar" + mouse_opaque="false"/> + </layout_panel> <layout_panel mouse_opaque="false" auto_resize="false" @@ -79,17 +77,11 @@ use_ellipses="true" /> </gesture_combo_list> </layout_panel> - <icon + <layout_panel auto_resize="false" - color="0 0 0 0" - follows="left|right" - height="10" - image_name="spacer24.tga" - layout="topleft" - left="0" + user_resize="false" min_width="3" name="after_gesture_panel" - top="0" width="3"/> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index 5934956559..f60c1e62ac 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -119,7 +119,7 @@ layout="topleft" left="10" top_pad="2" - max_length="30" + max_length_bytes="30" name="classified_name" prevalidate_callback="ascii" text_color="black" @@ -147,7 +147,7 @@ layout="topleft" left="10" top_pad="2" - max_length="64" + max_length="256" name="classified_desc" text_color="black" word_wrap="true" /> diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml index a490f27b9f..8c0c543d71 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml index 929cdffb3d..8e8d8e6505 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Upper Fabric" + label="Upper Texture" layout="topleft" left="25" name="Upper Fabric" @@ -41,7 +41,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Lower Fabric" + label="Lower Texture" layout="topleft" left_pad="20" name="Lower Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml index f22cf983aa..dd749a9259 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index c4b831b71c..a284d3ccc0 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -104,7 +104,7 @@ layout="topleft" left="10" top_pad="2" - max_length="63" + max_length_bytes="63" name="pick_name" text_color="black" width="273" /> 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 903dcd4c24..90dbddaff7 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml @@ -3,7 +3,7 @@ background_visible="true" class="edit_profile_panel" follows="all" - height="535" + height="585" label="Profile Edit" layout="topleft" left="0" @@ -60,7 +60,7 @@ <scroll_container color="DkGray2" follows="all" - height="494" + height="537" min_height="300" layout="topleft" left="8" @@ -74,7 +74,7 @@ follows="left|top|right" layout="topleft" top="0" - height="494" + height="537" min_height="300" left="0" width="292"> @@ -83,16 +83,110 @@ follows="left|top|right" layout="topleft" top="0" - height="494" + height="537" min_height="300" left="0" width="292"> + <text + top="5" + follows="top|left" + height="13" + layout="topleft" + left="10" + name="display_name_label" + text_color="LtGray" + value="Display Name:" + width="80" /> + <text + top="5" + follows="top|left" + height="13" + layout="topleft" + left="10" + name="solo_username_label" + text_color="LtGray" + value="Username:" + visible="false" + width="80" /> + <button + name="set_name" + layout="topleft" + follows="top|left" + image_overlay="Edit_Wrench" + top="21" + left="10" + height="23" + width="23" + tool_tip="Set Display Name"/> + <text + follows="top|left" + font="SansSerifBigBold" + height="20" + layout="topleft" + left="10" + name="solo_user_name" + text_color="white" + top_delta="3" + value="Hamilton Hitchings" + use_ellipses="true" + visible="false" + width="275" /> + <text + follows="top|left" + font="SansSerifBigBold" + height="20" + layout="topleft" + left="43" + name="user_name" + text_color="white" + top_delta="0" + value="Hamilton Hitchings" + use_ellipses="true" + visible="true" + width="250" /> + <text + follows="top|left" + font="SansSerifBold" + height="20" + layout="topleft" + left_delta="0" + name="user_name_small" + text_color="white" + top_delta="-4" + value="Hamilton Hitchings" + use_ellipses="true" + visible="false" + wrap="true" + width="245" /> + <text + follows="top|left" + height="13" + layout="topleft" + left="10" + name="user_label" + text_color="LtGray" + top_pad="8" + value="Username:" + width="70" /> + <text + follows="top|left" + height="20" + layout="topleft" + left_pad="0" + name="user_slid" + text_color="EmphasisColor" + font="SansSerifBold" + top_delta="-2" + use_ellipses="true" + value="hamilton.linden" + wrap="true" + width="205" /> <panel name="lifes_images_panel" follows="left|top|right" height="244" layout="topleft" - top="0" + top="65" left="0" width="292"> <panel @@ -146,8 +240,8 @@ height="102" layout="topleft" left="123" - top="25" - max_length="511" + top="90" + max_length="512" name="sl_description_edit" width="157" word_wrap="true"> @@ -202,8 +296,8 @@ height="102" layout="topleft" left="123" - max_length="254" - top="157" + max_length="512" + top="223" name="fl_description_edit" width="157" word_wrap="true"> @@ -242,7 +336,7 @@ left="8" name="show_in_search_checkbox" height="15" - text_enabled_color="white" + label_text.text_color="white" top_pad="12" width="100" /> <text @@ -301,22 +395,22 @@ left="10" name="partner_data_panel" width="200"> - <name_box - follows="left|top|right" - height="30" - initial_value="(retrieving)" - layout="topleft" - left="0" - link="true" - name="partner_text" - top="0" - width="200" - word_wrap="true" /> + <text + follows="left|top|right" + height="12" + initial_value="(retrieving)" + layout="topleft" + left="0" + name="partner_text" + top="0" + use_ellipses="true" + width="280"/> </panel> <text follows="left|top" height="15" layout="topleft" + link="true" left="10" name="partner_edit_link" value="[[URL] Edit]" @@ -351,15 +445,15 @@ user_resize="false" auto_resize="true" width="153"> - <button + <button follows="bottom|left|right" - height="23" - label="Save Changes" - layout="topleft" + height="23" + label="Save Changes" + layout="topleft" left="1" - name="save_btn" + name="save_btn" top="0" - width="152" /> + width="152" /> </layout_panel> <layout_panel @@ -372,15 +466,15 @@ user_resize="false" auto_resize="true" width="154"> - <button + <button follows="bottom|left|right" - height="23" - label="Cancel" - layout="topleft" + height="23" + label="Cancel" + layout="topleft" left="1" - name="cancel_btn" + name="cancel_btn" top="0" - width="153" /> + width="153" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml index 85823073b5..5424b805e1 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml index b26fde68f1..859e7454a4 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml index bb8e0dca07..76d66cc5dc 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml index d813d94d93..5f978174b3 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml index 19225e9757..16f28377fb 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml index 720a55dcc2..059485cfb4 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml @@ -26,7 +26,7 @@ default_image_name="Default" follows="left|top" height="80" - label="Fabric" + label="Texture" layout="topleft" left="10" name="Fabric" diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml index 95c1c822b8..b3e9586ee9 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -241,7 +241,7 @@ height="23" layout="topleft" left="10" - max_length="63" + max_length_bytes="63" name="description" prevalidate_callback="ascii" select_on_focus="true" @@ -463,9 +463,10 @@ height="23" label="Undo Changes" layout="topleft" - left_pad="7" + left="1" name="revert_button" - width="152" /> + top="0" + width="148" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_friends.xml b/indra/newview/skins/default/xui/en/panel_friends.xml deleted file mode 100644 index c315adb33e..0000000000 --- a/indra/newview/skins/default/xui/en/panel_friends.xml +++ /dev/null @@ -1,124 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="true" - follows="all" - height="347" - layout="topleft" - name="friends" - width="100"> - <panel.string - name="Multiple"> - Multiple friends - </panel.string> - <scroll_list - bottom="337" - column_padding="0" - draw_heading="true" - follows="left|top|bottom|right" - layout="topleft" - left="10" - multi_select="true" - name="friend_list" - right="-100" - search_column="1" - tool_tip="Hold shift or control while clicking to select multiple friends" - top="10"> - <scroll_list.columns - image="ff_online_status_button.tga" - name="icon_online_status" - tool_tip="Online status" - width="20" /> - <scroll_list.columns - dynamic_width="true" - label="Name" - name="friend_name" - tool_tip="Name" /> - <scroll_list.columns - image="ff_visible_online_button.tga" - name="icon_visible_online" - tool_tip="Friend can see when you're online" - width="20" /> - <scroll_list.columns - image="ff_visible_map_button.tga" - name="icon_visible_map" - tool_tip="Friend can locate you on the map" - width="20" /> - <scroll_list.columns - image="ff_edit_mine_button.tga" - name="icon_edit_mine" - tool_tip="Friend can edit, delete or take objects" - width="20" /> - <scroll_list.columns - image="ff_edit_theirs_button.tga" - name="icon_edit_theirs" - tool_tip="You can edit this friend's objects" - width="20" /> - <scroll_list.columns - name="friend_last_update_generation" - width="0" /> - </scroll_list> - <locate - bottom="7" - layout="topleft" - left="-90" /> - <button - follows="top|right" - height="22" - label="IM/Call" - layout="topleft" - left_pad="10" - name="im_btn" - tool_tip="Open Instant Message session" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Profile" - layout="topleft" - left_delta="0" - name="profile_btn" - tool_tip="Show picture, groups, and other information" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Teleport" - layout="topleft" - left_delta="0" - name="offer_teleport_btn" - tool_tip="Offer this friend a teleport to your current location" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Pay" - layout="topleft" - left_delta="0" - name="pay_btn" - tool_tip="Give Linden dollars (L$) to this friend" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Remove" - layout="topleft" - left_delta="0" - name="remove_btn" - tool_tip="Remove this person from your friends list" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Add" - layout="topleft" - left_delta="0" - name="add_btn" - tool_tip="Offer friendship to a Resident" - top_pad="13" - width="80" /> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml index 2af1a84400..70b96ca5eb 100644 --- a/indra/newview/skins/default/xui/en/panel_group_general.xml +++ b/indra/newview/skins/default/xui/en/panel_group_general.xml @@ -33,7 +33,7 @@ Hover your mouse over the options for more help. height="110" label="" layout="topleft" - left="10" + left="5" name="insignia" no_commit_on_selection="true" tool_tip="Click to choose a picture" @@ -49,22 +49,20 @@ Hover your mouse over the options for more help. type="string" height="16" length="1" - left_pad="10" + left_pad="8" name="prepend_founded_by" top_delta="0"> Founder: </text> - <name_box - follows="left|top" + <text + follows="left|top" height="16" - initial_value="(retrieving)" layout="topleft" - left_delta="0" - link="true" + left_delta="-2" name="founder_name" top_pad="2" use_ellipses="true" - width="190" /> + width="168" /> <text font="SansSerifMedium" text_color="EmphasisColor" @@ -92,13 +90,13 @@ Hover your mouse over the options for more help. <text_editor type="string" follows="left|top|right" - left="5" + left="3" height="80" layout="topleft" max_length="511" name="charter" top="105" - right="-1" + right="-4" bg_readonly_color="DkGray2" text_readonly_color="White" word_wrap="true"> @@ -113,6 +111,7 @@ Hover your mouse over the options for more help. layout="topleft" left="0" name="visible_members" + short_names="false" top_pad="2"> <name_list.columns label="Member" 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 3ded5c6678..0347d2feec 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 @@ -71,7 +71,7 @@ background_visible="true" label="Type your new group name here" layout="topleft" left_delta="10" - max_length="35" + max_length_bytes="35" name="group_name_editor" top_delta="5" width="270" diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml index 64539f2134..1270a21710 100644 --- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml @@ -60,6 +60,8 @@ left="0" right="-1" top="0" + sort_column="0" + sort_ascending="true" name="group_parcel_list" width="313"> <scroll_list.columns @@ -182,7 +184,7 @@ height="19" layout="topleft" left_pad="5" - max_length="10" + max_length_bytes="10" name="your_contribution_line_editor" top_delta="0" width="80" /> diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml index 41f2b28004..600b0e3b71 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notices.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml @@ -138,7 +138,7 @@ Maximum 200 per group daily height="16" layout="topleft" left_pad="3" - max_length="63" + max_length_bytes="63" name="create_subject" prevalidate_callback="ascii" width="220" /> @@ -180,7 +180,7 @@ Maximum 200 per group daily enabled="false" height="19" layout="topleft" - max_length="90" + max_length_bytes="90" mouse_opaque="false" name="create_inventory_name" top_pad="2" @@ -307,7 +307,7 @@ Maximum 200 per group daily height="20" layout="topleft" left_pad="3" - max_length="63" + max_length_bytes="63" name="view_subject" top_delta="-1" visible="false" @@ -341,7 +341,7 @@ Maximum 200 per group daily height="20" layout="topleft" left="5" - max_length="63" + max_length_bytes="63" mouse_opaque="false" name="view_inventory_name" top_pad="8" diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml index 6f271a757c..cded4cf31a 100644 --- a/indra/newview/skins/default/xui/en/panel_group_notify.xml +++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml @@ -85,6 +85,7 @@ layout="topleft" left="45" name="attachment" + parse_urls="false" text_color="GroupNotifyTextColor" value="Attachment" use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml index 4af4774304..a7178dc288 100644 --- a/indra/newview/skins/default/xui/en/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml @@ -85,6 +85,7 @@ clicking on their names. right="-1" multi_select="true" name="member_list" + short_names="false" top_pad="5"> <name_list.columns label="Member" @@ -389,7 +390,7 @@ things in this group. There's a broad variety of Abilities. left="0" follows="left|top|right" right="-1" - max_length="20" + max_length_bytes="20" name="role_name" top_pad="0" width="300"> @@ -412,7 +413,7 @@ things in this group. There's a broad variety of Abilities. left="0" follows="left|top|right" right="-1" - max_length="20" + max_length_bytes="20" name="role_title" top_pad="0" width="300"> diff --git a/indra/newview/skins/default/xui/en/panel_groups.xml b/indra/newview/skins/default/xui/en/panel_groups.xml deleted file mode 100644 index bba399481b..0000000000 --- a/indra/newview/skins/default/xui/en/panel_groups.xml +++ /dev/null @@ -1,111 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="true" - follows="all" - height="347" - layout="topleft" - left="280" - name="groups" - top="24" - width="350"> - <scroll_list - bottom="302" - follows="left|top|right|bottom" - layout="topleft" - left="10" - name="group list" - top="10" - width="240"> - <scroll_list.columns - label="" - name="name" - width="248" /> - </scroll_list> - <text - type="string" - length="1" - follows="left|bottom" - height="16" - layout="topleft" - left_delta="2" - mouse_opaque="false" - name="groupdesc" - top_pad="7" - width="248"> - Your currently active group is displayed in bold. - </text> - <text - type="string" - length="1" - follows="left|bottom" - height="16" - layout="topleft" - left_delta="0" - mouse_opaque="false" - name="groupcount" - top_pad="1" - width="248"> - You belong to [COUNT] groups (of [MAX] maximum). - </text> - <locate - height="0" - layout="topleft" - left="-90" - top="7" - width="1" /> - <button - follows="top|right" - height="22" - label="IM/Call" - layout="topleft" - left_delta="0" - name="IM" - tool_tip="Open Instant Message session" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Info" - layout="topleft" - left_delta="0" - name="Info" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Activate" - layout="topleft" - left_delta="0" - name="Activate" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Leave" - layout="topleft" - left_delta="0" - name="Leave" - top_pad="3" - width="80" /> - <button - follows="top|right" - height="22" - label="Create..." - layout="topleft" - left_delta="0" - name="Create" - top_pad="13" - width="80" /> - <button - follows="top|right" - height="22" - label="Search..." - layout="topleft" - left_delta="0" - name="Search..." - top_pad="3" - width="80" /> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_hint.xml b/indra/newview/skins/default/xui/en/panel_hint.xml new file mode 100644 index 0000000000..e2e9d0aef0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_hint.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + width="205" + height="100"> + <text name="hint_title" + font="SansSerifMedium" + left="8" + right="180" + top="8" + bottom="20" + follows="left|right|top" + text_color="Black" + wrap="false"/> + <text name="hint_text" + left="8" + right="197" + top="26" + bottom="92" + follows="all" + text_color="Black" + wrap="true"/> + <button right="197" + top="8" + width="16" + height="16" + name="close" + follows="right|top" + image_color="DkGray" + image_unselected="Icon_Close_Foreground" + image_selected="Icon_Close_Press"/> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 33a5e01e4c..9f73b7c540 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -3,11 +3,11 @@ border="false" height="300" name="panel_im_control_panel" - width="119"> + width="150"> <avatar_icon follows="left|top" height="105" - left_delta="5" + left_delta="20" name="avatar_icon" top="-5" width="114"/> @@ -22,27 +22,17 @@ name="button_stack" orientation="vertical" top_pad="5" - width="114"> - <layout_panel - mouse_opaque="false" - auto_resize="true" - follows="top|left" - height="0" - layout="topleft" - left="2" - min_height="0" - width="109" - top="0" - name="spacer" - user_resize="false" /> + width="145"> <layout_panel auto_resize="false" follows="top|left|right" height="20" layout="topleft" + left="2" min_height="20" - width="109" + width="140" name="view_profile_btn_panel" + top="0" user_resize="false"> <button follows="left|top|right" @@ -50,7 +40,7 @@ label="Profile" name="view_profile_btn" top="0" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -58,7 +48,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="add_friend_btn_panel" user_resize="false"> <button @@ -67,7 +57,7 @@ label="Add Friend" name="add_friend_btn" top="5" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -75,7 +65,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="teleport_btn_panel" user_resize="false"> <button @@ -85,7 +75,7 @@ label="Teleport" name="teleport_btn" tool_tip = "Offer to teleport this person" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -93,7 +83,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="share_btn_panel" user_resize="false"> <button @@ -102,7 +92,7 @@ height="23" label="Share" name="share_btn" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -110,7 +100,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="pay_btn_panel" user_resize="false"> <button @@ -119,7 +109,7 @@ height="23" label="Pay" name="pay_btn" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -127,7 +117,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="call_btn_panel" user_resize="false"> <button @@ -135,7 +125,7 @@ height="23" label="Call" name="call_btn" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -143,7 +133,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="end_call_btn_panel" user_resize="false" visible="false"> @@ -152,7 +142,7 @@ height="23" label="End Call" name="end_call_btn" - width="109" /> + width="140" /> </layout_panel> <layout_panel auto_resize="false" @@ -160,7 +150,7 @@ height="25" layout="topleft" min_height="25" - width="109" + width="140" name="voice_ctrls_btn_panel" user_resize="false" visible="false"> @@ -169,7 +159,17 @@ height="23" label="Voice Controls" name="voice_ctrls_btn" - width="109" /> + width="140" /> </layout_panel> + <layout_panel + mouse_opaque="false" + auto_resize="true" + follows="top|left" + height="0" + layout="topleft" + min_height="0" + width="140" + name="spacer" + user_resize="false" /> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml index 34fd3352a3..021cf00d03 100644 --- a/indra/newview/skins/default/xui/en/panel_instant_message.xml +++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml @@ -67,7 +67,7 @@ top="8" use_ellipses="true" value="Erica Vader" - width="212" /> + width="205" /> <!-- TIME STAMP --> <text font="SansSerifSmall" 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 f8ae238148..6ee2abc70f 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -184,7 +184,8 @@ left="70" name="owner" top_delta="0" - width="200" /> + use_ellipses="true" + width="215" /> <text follows="left|top" height="15" @@ -200,7 +201,8 @@ left="70" name="creator" top_delta="0" - width="200" /> + use_ellipses="true" + width="215" /> <text follows="left|top" height="15" @@ -250,7 +252,7 @@ height="22" layout="topleft" left="0" - max_length="63" + max_length_bytes="63" name="title_editor" prevalidate_callback="ascii" text_readonly_color="white" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 7e415f45a4..2a5933e3e9 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -3,7 +3,7 @@ name="Landmarks" top="0" height="400" - layout="topleft" + layout="topleft" left="0" width="313" help_topic="panel_landmarks" @@ -88,7 +88,7 @@ </accordion_tab> </accordion> <panel - background_visible="true" + background_visible="true" bevel_style="none" bottom="0" follows="left|right|bottom" @@ -115,7 +115,7 @@ layout="topleft" name="options_gear_btn_panel" width="32"> - <button + <menu_button follows="bottom|left" tool_tip="Show additional options" height="25" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index 6b136495d2..b181ca3bba 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -24,6 +24,8 @@ top="600" </panel.string> <!-- *NOTE: Custom resize logic for login_html in llpanellogin.cpp --> <web_browser + tab_stop="false" +trusted_content="true" bg_opaque_color="Black" border_visible="false" bottom="600" @@ -65,12 +67,13 @@ Username: <line_editor follows="left|bottom" height="22" -label="Username" +label="bobsmith12 or Steller Sunshine" left_delta="0" -max_length="31" +max_length_bytes="63" name="username_edit" +prevalidate_callback="ascii" select_on_focus="true" -tool_tip="[SECOND_LIFE] Username" +tool_tip="The username you chose when you registered, like bobsmith12 or Steller Sunshine" top_pad="0" width="150" /> <text @@ -86,7 +89,7 @@ top="20" <line_editor follows="left|bottom" height="22" - max_length="16" + max_length_bytes="16" name="password_edit" select_on_focus="true" top_pad="0" @@ -159,8 +162,8 @@ width="135" tab_stop="false" follows="right|bottom" name="links" -width="200" -min_width="200" +width="205" +min_width="205" user_resize="false" height="80"> <text @@ -172,7 +175,7 @@ height="16" top="12" right="-10" name="create_new_account_text" - width="180"> + width="200"> Sign up </text> <text @@ -184,8 +187,8 @@ height="16" name="forgot_password_text" top_pad="12" right="-10" - width="180"> - Forgot your name or password? + width="200"> + Forgot your username or password? </text> <text follows="right|bottom" @@ -196,7 +199,7 @@ height="16" name="login_help" top_pad="2" right="-10" - width="180"> + width="200"> Need help logging in? </text> <!-- <text follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 16529f4064..2b6e082542 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -119,7 +119,7 @@ layout="topleft" name="options_gear_btn_panel" width="32"> - <button + <menu_button follows="bottom|left" tool_tip="Show additional options" height="25" 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 37a1ed3048..1b41f602cd 100644 --- a/indra/newview/skins/default/xui/en/panel_my_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml @@ -284,7 +284,7 @@ name="partner_data_panel" top_pad="0" width="300"> - <name_box + <text follows="left|top" height="10" initial_value="(retrieving)" @@ -293,8 +293,8 @@ link="true" name="partner_text" top="0" - width="300" - word_wrap="true" /> + use_ellipses="true" + width="300" /> </panel> <text follows="left|top" diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml deleted file mode 100644 index 50a78e1c71..0000000000 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> - -<panel - name="nearby_chat" visible="true" width="250" height="480" background_opaque="false" - background_visible="true" bevel_style="in" follows="left|top" bg_alpha_color="0.3 0.3 0.3 1.0"> - <panel bottom="380" width="250" height="30" background_visible="true" background_opaque="false" bg_alpha_color="0.0 0.0 0.0 1.0" name="chat_caption"> - <text - width="140" left="25" height="20" follows="left|right|top" - font="SansSerifBigBold" text_color="white" word_wrap="true" - mouse_opaque="true" name="sender_name" >NEARBY CHAT </text> - <icon top="25" left="180" - width="20" height="20" follows="top|right" - color="1 1 1 1" enabled="true" image_name="icn_voice-groupfocus.tga" - mouse_opaque="true" name="nearby_speakers_btn"/> - <icon top="25" left="205" - width="20" height="20" follows="top|right" - color="1 1 1 1" enabled="true" image_name="inv_item_landmark_visited.tga" - mouse_opaque="true" name="tearoff_btn"/> - <icon top="22" left="230" - width="15" height="15" follows="top|right" - color="1 1 1 1" enabled="true" image_name="closebox.tga" - name="close_btn"/> - </panel> - <chat_history_view bottom="0" width="250" height="320" follows="left|right|top|bottom" name="chat_scroll" /> -</panel> - diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml index 55df70eb71..5871eb0654 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml @@ -17,7 +17,7 @@ layout="topleft" left_delta="3" left="0" - max_length="1024" + max_length_bytes="1023" name="chat_box" text_pad_left="5" text_pad_right="25" diff --git a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml index 3143b0a40c..c3dc588ba2 100644 --- a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml +++ b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml @@ -14,6 +14,9 @@ orientation="horizontal" top="20" width="100"> + <layout_panel name="notifications_list_panel" + width="100" + user_resize="true"> <scroll_list draw_heading="true" follows="left|right|top|bottom" @@ -24,7 +27,6 @@ sort_ascending="false" sort_column="2" top="0" - user_resize="true" width="100"> <scroll_list.columns label="Name" @@ -39,6 +41,10 @@ name="date" width="150" /> </scroll_list> + </layout_panel> + <layout_panel name="rejects_list_panel" + width="100" + user_resize="true"> <scroll_list draw_heading="true" follows="left|right|top|bottom" @@ -49,7 +55,6 @@ sort_ascending="false" sort_column="2" top="0" - user_resize="true" width="100"> <scroll_list.columns label="Name" @@ -64,6 +69,7 @@ name="date" width="150" /> </scroll_list> + </layout_panel> </layout_stack> <button follows="left|right|top" diff --git a/indra/newview/skins/default/xui/en/panel_notify_textbox.xml b/indra/newview/skins/default/xui/en/panel_notify_textbox.xml new file mode 100644 index 0000000000..4634eeed46 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_notify_textbox.xml @@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + background_visible="true" + height="230" + label="instant_message" + layout="topleft" + left="0" + name="panel_notify_textbox" + top="0" + width="305"> + <string + name="message_max_lines_count" + value="7" /> + <panel + bevel_style="none" + follows="left|right|top" + height="150" + label="info_panel" + layout="topleft" + left="0" + name="info_panel" + top="0" + width="305"> + <text_editor + parse_urls="true" + enabled="true" + follows="all" + height="60" + layout="topleft" + left="25" + max_length="250" + name="message" + parse_highlights="true" + read_only="false" + top="40" + type="string" + use_ellipses="true" + value="message" + width="260" + word_wrap="true" > + </text_editor> + parse_urls="false" + <button + top="110" + follows="top|left" + height="20" + label="Submit" + layout="topleft" + left="25" + name="btn_submit" + width="70" /> + </panel> + <panel + background_visible="false" + follows="left|right|bottom" + height="0" + width="290" + label="control_panel" + layout="topleft" + left="10" + name="control_panel" + top_pad="5"> + <!-- + Notes: + This panel holds the Ignore button and possibly other buttons of notification. + --> + </panel> +</panel> diff --git a/indra/newview/skins/default/xui/en/panel_online_status.xml b/indra/newview/skins/default/xui/en/panel_online_status.xml deleted file mode 100644 index 14cb5fffee..0000000000 --- a/indra/newview/skins/default/xui/en/panel_online_status.xml +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - background_visible="false" - height="152" - label="friend_online_status" - layout="topleft" - left="0" - name="friend_online_status" - top="0" - width="305"> - <avatar_icon - follows="top|left" - height="18" - image_name="Generic_Person" - layout="topleft" - left="3" - mouse_opaque="false" - name="avatar_icon" - top="10" - width="18" /> - <text - font="SansSerifSmall" - follows="all" - height="137" - layout="topleft" - left_pad="5" - name="message" - text_color="white" - top="15" - use_ellipses="true" - value="" - width="285" - word_wrap="true" - max_length="350" /> -</panel>
\ No newline at end of file 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 883cbb30c6..f4dee9cd55 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -57,6 +57,7 @@ <string name="replace_body_part" value="Click to replace your existing shape"/> + <button follows="top|left" @@ -132,6 +133,7 @@ height="18" layout="topleft" name="curr_outfit_name" + parse_urls="false" text_color="LtGray" top_pad="2" value="[Current Outfit]" @@ -183,6 +185,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap follows="all" height="185" width="313" + orientation="vertical" layout="topleft" name="filter_panels" top="0" @@ -197,19 +200,19 @@ It is calculated as border_size + 2*UIResizeBarOverlap user_resize="false" visible="true"> - <!-- List containing items from the COF and Base outfit --> - <panel - background_visible="false" - class="cof_wearables" - filename="panel_cof_wearables.xml" + <!-- List containing items from the COF and Base outfit --> + <panel + background_visible="false" + class="cof_wearables" + filename="panel_cof_wearables.xml" follows="all" height="129" - layout="topleft" - left="1" - name="cof_wearables_list" - top="0" - width="311" /> - + layout="topleft" + left="1" + name="cof_wearables_list" + top="0" + width="311" /> + <button follows="left|bottom" height="22" @@ -228,7 +231,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap <combo_box follows="left|right|bottom" height="22" - layout="topleft" + layout="topleft" left_pad="5" name="list_view_filter_combobox" top_delta="0" @@ -244,20 +247,20 @@ It is calculated as border_size + 2*UIResizeBarOverlap visible="false" width="152"/> - <button + <button follows="bottom|right" height="22" - image_overlay="Search_Icon" + image_overlay="Search_Icon" image_pressed="PushButton_Press" image_pressed_selected="PushButton_Selected_Press" image_selected="PushButton_Selected_Press" - is_toggle="true" - layout="topleft" - name="filter_button" + is_toggle="true" + layout="topleft" + name="filter_button" right="-5" - top_delta="0" + top_delta="0" visible="false" - width="20" /> + width="20" /> </layout_panel> <layout_panel @@ -286,13 +289,13 @@ It is calculated as border_size + 2*UIResizeBarOverlap </layout_panel> </layout_stack> - </layout_panel> + </layout_panel> - <layout_panel + <layout_panel background_visible="false" bg_alpha_color="DkGray2" - auto_resize="true" + auto_resize="true" default_tab_group="3" height="450" min_height="80" @@ -312,44 +315,44 @@ It is calculated as border_size + 2*UIResizeBarOverlap top_pad="-9" width="313" /> - <inventory_panel - allow_multi_select="true" - background_visible="false" - border="false" - follows="left|top|right|bottom" + <inventory_panel + allow_multi_select="true" + background_visible="false" + border="false" + follows="left|top|right|bottom" height="418" - layout="topleft" - left="0" - mouse_opaque="false" + layout="topleft" + left="0" + mouse_opaque="false" name="folder_view" top_pad="0" width="313" - visible="false"/> - <panel - name="filtered_wearables_panel" - background_opaque="true" - background_visible="false" - layout="topleft" - follows="left|top|right|bottom" - border="false" + visible="false"/> + <panel + name="filtered_wearables_panel" + background_opaque="true" + background_visible="false" + layout="topleft" + follows="left|top|right|bottom" + border="false" height="418" - left="0" - mouse_opaque="false" + left="0" + mouse_opaque="false" width="310" - top_delta="0" - visible="true"> - <wearable_items_list - color="0.107 0.107 0.107 1" + top_delta="0" + visible="true"> + <wearable_items_list + color="0.107 0.107 0.107 1" name="list_view" - allow_select="true" - layout="topleft" - follows="all" - multi_select="true" + allow_select="true" + layout="topleft" + follows="all" + multi_select="true" width="313" height="418" - left="0" - top="0"/> - </panel> + left="0" + top="0"/> + </panel> <button follows="bottom|left" height="22" @@ -360,7 +363,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap top_pad="5" width="130" /> - </layout_panel> + </layout_panel> </layout_stack> @@ -375,7 +378,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap name="no_add_wearables_button_bar" top_pad="0" width="313"> - <button + <menu_button follows="bottom|left" height="25" image_hover_unselected="Toolbar_Left_Over" @@ -423,7 +426,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap top_delta="0" visible="false" width="313"> - <button + <menu_button follows="bottom|left" height="25" image_hover_unselected="Toolbar_Left_Over" @@ -461,15 +464,15 @@ It is calculated as border_size + 2*UIResizeBarOverlap name="list_view_btn" top="1" width="31" /> - <icon - follows="bottom|left|right" - height="25" + <icon + follows="bottom|left|right" + height="25" image_name="Toolbar_Middle_Off" - layout="topleft" - left_pad="1" + layout="topleft" + left_pad="1" name="dummy_right_icon" width="186" > - </icon> + </icon> <button follows="bottom|right" height="25" @@ -484,7 +487,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap tool_tip="Visit the SL Marketplace. You can also select something you are wearing, then click here to see more things like it" width="31" /> </panel> - + <!-- SAVE AND REVERT BUTTONS --> <panel follows="left|right|bottom" @@ -514,30 +517,30 @@ It is calculated as border_size + 2*UIResizeBarOverlap user_resize="false" auto_resize="true" width="156"> - <button + <button follows="bottom|left|right" - height="23" - label="Save" + height="23" + label="Save" left="1" - layout="topleft" - name="save_btn" - top="0" - width="155" /> - <button + layout="topleft" + name="save_btn" + top="0" + width="155" /> + <button follows="bottom|right" - height="23" - name="save_flyout_btn" - label="" - layout="topleft" - left_pad="-20" - tab_stop="false" - top="0" - image_selected="SegmentedBtn_Right_Selected_Press" - image_unselected="SegmentedBtn_Right_Off" - image_pressed="SegmentedBtn_Right_Press" - image_pressed_selected="SegmentedBtn_Right_Selected_Press" - image_overlay="Arrow_Small_Up" - width="20"/> + height="23" + name="save_flyout_btn" + label="" + layout="topleft" + left_pad="-20" + tab_stop="false" + top="0" + image_selected="SegmentedBtn_Right_Selected_Press" + image_unselected="SegmentedBtn_Right_Off" + image_pressed="SegmentedBtn_Right_Press" + image_pressed_selected="SegmentedBtn_Right_Selected_Press" + image_overlay="Arrow_Small_Up" + width="20"/> </layout_panel> <layout_panel follows="bottom|left|right" @@ -549,16 +552,16 @@ It is calculated as border_size + 2*UIResizeBarOverlap user_resize="false" auto_resize="true" width="147"> - <button - follows="bottom|left|right" - height="23" + <button + follows="bottom|left|right" + height="23" left="0" - label="Undo Changes" - layout="topleft" - name="revert_btn" - top="0" - tool_tip="Revert to last saved version" - width="147" /> + label="Undo Changes" + layout="topleft" + name="revert_btn" + top="0" + tool_tip="Revert to last saved version" + width="147" /> </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml index d18f0d57ca..9f98019c94 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml @@ -35,7 +35,7 @@ visible="true" name="bottom_panel" width="312"> - <button + <menu_button follows="bottom|left" tool_tip="Show additional options" height="25" diff --git a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml index 2fbbf6610c..d85b778db2 100644 --- a/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml +++ b/indra/newview/skins/default/xui/en/panel_outfits_wearing.xml @@ -29,7 +29,7 @@ name="bottom_panel" top_pad="0" width="312"> - <button + <menu_button follows="bottom|left" height="25" image_hover_unselected="Toolbar_Left_Over" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index ab8930c967..68c423d7dd 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -81,7 +81,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M width="317"> <panel background_opaque="true" - background_visible="true" + background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" follows="all" @@ -114,7 +114,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M name="bottom_panel" top_pad="0" width="313"> - <button + <menu_button follows="bottom|left" height="25" image_hover_unselected="Toolbar_Left_Over" @@ -155,7 +155,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M </panel> <panel background_opaque="true" - background_visible="true" + background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" follows="all" @@ -242,7 +242,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M layout="topleft" name="options_gear_btn_panel" width="32"> - <button + <menu_button follows="bottom|left" tool_tip="Show additional options" height="25" @@ -307,7 +307,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M image_unselected="Toolbar_Right_Off" left="0" layout="topleft" - name="trash_btn" + name="del_btn" tool_tip="Remove selected person from your Friends list" top="0" width="31"/> @@ -372,7 +372,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M </panel> <panel background_opaque="true" - background_visible="true" + background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" follows="all" @@ -407,7 +407,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M name="bottom_panel" top_pad="0" width="313"> - <button + <menu_button follows="bottom|left" tool_tip="Options" height="25" @@ -457,7 +457,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M </panel> <panel background_opaque="true" - background_visible="true" + background_visible="true" bg_alpha_color="DkGray" bg_opaque_color="DkGray" follows="all" @@ -490,7 +490,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M name="bottom_panel" top_pad="0" width="313"> - <button + <menu_button follows="bottom|left" tool_tip="Options" height="25" @@ -499,7 +499,6 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M image_selected="Toolbar_Left_Selected" image_unselected="Toolbar_Left_Off" layout="topleft" - left="3" name="recent_viewsort_btn" top="1" width="31" /> diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml index de147908d8..43d580844f 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml @@ -52,6 +52,7 @@ layout="topleft" left="110" name="picture_name" + parse_urls="false" text_color="white" top="9" use_ellipses="true" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 01d1e48ba1..8036411d2b 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -315,7 +315,8 @@ name="owner_value" top_delta="0" value="Alex Superduperlongenamenton" - width="205" /> + use_ellipses="true" + width="200" /> <icon follows="top|left" height="16" @@ -649,7 +650,8 @@ left_pad="0" name="region_owner" top_delta="0" - value="moose Van Moose" + value="moose Van Moose extra long name moose" + use_ellipses="true" width="187" /> <text follows="left|top" @@ -710,7 +712,7 @@ name="estate_name_label" top_pad="5" value="Estate:" - width="90" /> + width="80" /> <text follows="left|top|right" height="15" @@ -727,7 +729,7 @@ name="estate_rating_label" top_pad="5" value="Rating:" - width="90" /> + width="80" /> <text follows="left|top|right" height="15" @@ -744,15 +746,17 @@ name="estate_owner_label" top_pad="5" value="Owner:" - width="90" /> + width="80" /> <text follows="left|top|right" height="15" layout="topleft" left_pad="0" name="estate_owner" + value="Testing owner name length with long name" top_delta="0" - width="187" /> + use_ellipses="true" + width="190" /> <text follows="left|top" height="15" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml index 31d8ea27d9..d6e4c56113 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml @@ -13,201 +13,17 @@ name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <panel.string - name="middle_mouse"> - Middle Mouse - </panel.string> - <icon - follows="left|top" - height="18" - image_name="Cam_FreeCam_Off" - layout="topleft" - name="camera_icon" - mouse_opaque="false" - visible="true" - width="18" - left="30" - top="10"/> - <slider - can_edit_text="true" - control_name="CameraAngle" - decimal_digits="2" - follows="left|top" - height="16" - increment="0.025" - initial_value="1.57" - layout="topleft" - label_width="100" - label="View angle" - left_pad="30" - max_val="2.97" - min_val="0.17" - name="camera_fov" - show_text="false" - width="240" /> - <slider - can_edit_text="true" - control_name="CameraOffsetScale" - decimal_digits="2" - follows="left|top" - height="16" - increment="0.025" - initial_value="1" - layout="topleft" - label="Distance" - left_delta="0" - label_width="100" - max_val="3" - min_val="0.5" - name="camera_offset_scale" - show_text="false" - width="240" - top_pad="5"/> - <text - follows="left|top" - type="string" - length="1" - height="10" - left="80" - name="heading2" - width="270" - top_pad="5"> -Automatic position for: - </text> - <check_box - control_name="EditCameraMovement" - height="20" - follows="left|top" - label="Build/Edit" - layout="topleft" - left_delta="30" - name="edit_camera_movement" - tool_tip="Use automatic camera positioning when entering and exiting edit mode" - width="280" - top_pad="5" /> - <check_box - control_name="AppearanceCameraMovement" - follows="left|top" - height="16" - label="Appearance" - layout="topleft" - name="appearance_camera_movement" - tool_tip="Use automatic camera positioning while in edit mode" - width="242" /> - <check_box - control_name="SidebarCameraMovement" - follows="left|top" - height="16" - initial_value="true" - label="Sidebar" - layout="topleft" - name="appearance_sidebar_positioning" - tool_tip="Use automatic camera positioning for sidebar" - width="242" /> - <icon - follows="left|top" - height="18" - image_name="Move_Walk_Off" - layout="topleft" - name="avatar_icon" - mouse_opaque="false" - visible="true" - width="18" - top_pad="2" - left="30" - /> - <check_box - control_name="FirstPersonAvatarVisible" - follows="left|top" - height="20" - label="Show me in Mouselook" - layout="topleft" - left_pad="30" - name="first_person_avatar_visible" - width="256" /> - <check_box - control_name="ArrowKeysAlwaysMove" - follows="left|top" - height="20" - label="Arrow keys always move me" - layout="topleft" - left_delta="0" - name="arrow_keys_move_avatar_check" - width="237" - top_pad="0"/> - <check_box - control_name="AllowTapTapHoldRun" - follows="left|top" - height="20" - label="Tap-tap-hold to run" - layout="topleft" - left_delta="0" - name="tap_tap_hold_to_run" - width="237" - top_pad="0"/> - <check_box - control_name="LipSyncEnabled" - follows="left|top" - height="20" - label="Move avatar lips when speaking" - layout="topleft" - left_delta="0" - name="enable_lip_sync" - width="237" - top_pad="0" /> - <check_box - control_name="UseChatBubbles" - follows="left|top" - height="16" - label="Bubble chat" - layout="topleft" - left="78" - top_pad="6" - name="bubble_text_chat" - width="150" /> - <slider - control_name="ChatBubbleOpacity" - follows="left|top" - height="16" - increment="0.05" - initial_value="1" - label="Opacity" - layout="topleft" - left="80" - label_width="156" - name="bubble_chat_opacity" - top_pad = "10" - width="347" /> - <color_swatch - can_apply_immediately="true" - color="0 0 0 1" - control_name="BackgroundChatColor" - follows="left|top" - height="50" - layout="topleft" - left_pad="30" - top="190" - name="background" - tool_tip="Choose color for bubble chat" - width="38"> - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="BackgroundChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="BackgroundChatColor" /> - </color_swatch> <text type="string" length="1" follows="left|top" height="12" layout="topleft" - left="80" + left="33" name="UI Size:" top_pad="25" - width="160"> - UI size + width="100"> + UI size: </text> <slider control_name="UIScaleFactor" @@ -222,7 +38,7 @@ Automatic position for: min_val="0.75" name="ui_scale_slider" top_pad="-14" - width="180" /> + width="250" /> <check_box control_name="ShowScriptErrors" follows="left|top" @@ -261,64 +77,45 @@ Automatic position for: top_delta="0" width="315" /> </radio_group> - <check_box + + <check_box + control_name="AllowMultipleViewers" follows="top|left" - enabled_control="EnableVoiceChat" - control_name="PushToTalkToggle" height="15" - label="Toggle speak on/off when I press:" + label="Allow Multiple Viewer" layout="topleft" left="30" - name="push_to_talk_toggle_check" - width="237" - tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down."/> - <line_editor + name="allow_multiple_viewer_check" + top_pad="20" + width="237"/> + <check_box + control_name="ForceShowGrid" follows="top|left" - control_name="PushToTalkButton" - enabled="false" - enabled_control="EnableVoiceChat" - height="23" - left="80" - max_length="200" - name="modifier_combo" - label="Push-to-Speak trigger" + height="15" + label="Show Grid Selection at login" + layout="topleft" + left="30" + name="show_grid_selection_check" top_pad="5" - width="200" /> - <button - layout="topleft" + width="237"/> + <check_box + control_name="UseDebugMenus" follows="top|left" - enabled_control="EnableVoiceChat" - height="23" - label="Set Key" - left_pad="5" - name="set_voice_hotkey_button" - width="100"> - <button.commit_callback - function="Pref.VoiceSetKey" /> - </button> - <button - enabled_control="EnableVoiceChat" + height="15" + label="Show Advanced Menu" + layout="topleft" + left="30" + name="show_advanced_menu_check" + top_pad="5" + width="237"/> + <check_box + control_name="QAMode" follows="top|left" - halign="center" - height="23" - image_overlay="Refresh_Off" - tool_tip="Reset to Middle Mouse Button" - mouse_opaque="true" - name="set_voice_middlemouse_button" - left_pad="5" - width="25"> - <button.commit_callback - function="Pref.VoiceSetMiddleMouse" /> - </button> - <button - height="23" - label="Other Devices" - left="30" - name="joystick_setup_button" - top="27" - width="155"> - <button.commit_callback - function="Floater.Show" - parameter="pref_joystick" /> - </button> + height="15" + label="Show Developer Menu" + layout="topleft" + left="30" + name="show_develop_menu_check" + top_pad="5" + width="237"/> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml index 516457dd93..559df5bec9 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml @@ -57,6 +57,8 @@ left="10" multi_select="true" name="enabled_popups" + sort_column="0" + sort_ascending="true" width="495" /> <button enabled_control="FirstSelectedDisabledPopups" @@ -103,6 +105,8 @@ height="140" layout="topleft" left="10" + sort_column="0" + sort_ascending="true" multi_select="true" name="disabled_popups" width="495" /> 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 31e160ec33..a1082d9c32 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -23,7 +23,7 @@ height="30" layout="topleft" left="40" - control_name="ChatFontSize" + control_name="ChatFontSize" name="chat_font_size" top_pad="0" width="440"> @@ -55,259 +55,7 @@ top_delta="0" width="125" /> </radio_group> - - <text - follows="left|top" - layout="topleft" - left="30" - height="12" - name="font_colors" - top_pad="10" - width="120" - > - Font colors: - </text> - - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="47" - layout="topleft" - left="40" - name="user" - top_pad="10" - width="44" > - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="UserChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="UserChatColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box1" - top_delta="5" - width="95"> - Me - </text> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="47" - layout="topleft" - left="190" - name="agent" - top_pad="-15" - width="44" > - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="AgentChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="AgentChatColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box2" - top_delta="5" - width="95"> - Others - </text> - <color_swatch - can_apply_immediately="true" - color="LtGray" - follows="left|top" - height="47" - label_width="60" - layout="topleft" - left="360" - name="im" - top_pad="-15" - width="44"> - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="IMChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="IMChatColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box3" - top_delta="5" - width="95"> - IM - </text> - <color_swatch - can_apply_immediately="true" - color="LtGray" - follows="left|top" - height="47" - label_width="44" - layout="topleft" - left="40" - name="system" - top_pad="22" - width="44" > - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="SystemChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="SystemChatColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box4" - top_delta="5" - width="95"> - System - </text> - <color_swatch - can_apply_immediately="true" - color="Red" - follows="left|top" - height="47" - layout="topleft" - left="190" - name="script_error" - top_pad="-15" - width="44"> - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="ScriptErrorColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="ScriptErrorColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box5" - top_delta="5" - width="95"> - Errors - </text> - <color_swatch - can_apply_immediately="true" - color="EmphasisColor_35" - follows="left|top" - height="47" - layout="topleft" - left="360" - name="objects" - top_pad="-15" - width="44" > - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="ObjectChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="ObjectChatColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box6" - top_delta="5" - width="95"> - Objects - </text> - <color_swatch - can_apply_immediately="true" - color="LtYellow" - follows="left|top" - height="47" - layout="topleft" - left="40" - name="owner" - top_pad="22" - width="44" > - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="llOwnerSayChatColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="llOwnerSayChatColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box7" - top_delta="5" - width="95"> - Owner - </text> - <color_swatch - can_apply_immediately="true" - color="EmphasisColor" - follows="left|top" - height="47" - layout="topleft" - left="190" - name="links" - top_pad="-15" - width="44" > - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="HTMLLinkColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="HTMLLinkColor" /> - </color_swatch> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_pad="5" - mouse_opaque="false" - name="text_box9" - top_delta="5" - width="95"> - URLs - </text> + <check_box control_name="PlayTypingAnim" height="16" @@ -316,7 +64,7 @@ layout="topleft" left="30" name="play_typing_animation" - top_pad="32" + top_pad="10" width="400" /> <check_box enabled="false" @@ -336,6 +84,16 @@ name="plain_text_chat_history" top_pad="5" width="400" /> + <check_box + control_name="UseChatBubbles" + follows="left|top" + height="16" + label="Bubble Chat" + layout="topleft" + left_delta="0" + top_pad="5" + name="bubble_text_chat" + width="150" /> <text name="show_ims_in_label" follows="left|top" @@ -343,7 +101,7 @@ left="30" height="20" width="170" - top_pad="14"> + top_pad="15"> Show IMs in: </text> <text @@ -353,23 +111,22 @@ top_delta="0" left="170" height="20" - width="130" - text_color="White_25" - > + width="130" + text_color="White_25"> (requires restart) </text> <radio_group + follows="left|top" height="30" - layout="topleft" left="40" control_name="ChatWindow" name="chat_window" top_pad="0" tool_tip="Show your Instant Messages in separate floaters, or in one floater with many tabs (Requires restart)" - width="331"> + width="150"> <radio_item height="16" - label="Separate windows" + label="Separate Windows" layout="topleft" left="0" name="radio" @@ -386,6 +143,68 @@ top_pad="5" width="150" /> </radio_group> + <text + name="disable_toast_label" + follows="left|top" + layout="topleft" + top_pad="20" + left="30" + height="10" + width="180"> + Enable incoming chat popups: + </text> + <check_box + control_name="EnableGroupChatPopups" + name="EnableGroupChatPopups" + label="Group Chats" + layout="topleft" + top_pad="5" + left_delta="10" + height="20" + tool_tip="Check to see popups when a Group Chat message arrives" + width="400" /> + <check_box + control_name="EnableIMChatPopups" + name="EnableIMChatPopups" + label="IM Chats" + layout="topleft" + top_pad="5" + height="16" + tool_tip="Check to see popups when an instant message arrives" + width="400" /> + <spinner + control_name="NearbyToastLifeTime" + decimal_digits="0" + follows="left|top" + height="23" + increment="1" + initial_value="23" + label="Nearby chat toasts life time:" + label_width="190" + layout="topleft" + left="45" + max_val="60" + min_val="1" + name="nearby_toasts_lifetime" + top_pad="10" + width="230" /> + <spinner + control_name="NearbyToastFadingTime" + decimal_digits="0" + follows="left|top" + height="23" + increment="1" + initial_value="3" + label="Nearby chat toasts fading time:" + label_width="190" + layout="topleft" + left_delta="0" + max_val="60" + min_val="0" + name="nearby_toasts_fadingtime" + top_pad="3" + width="230" /> + <check_box control_name="TranslateChat" enabled="true" @@ -394,7 +213,7 @@ layout="topleft" left="30" name="translate_chat_checkbox" - bottom_delta="40" + bottom_delta="30" width="400" /> <text bottom_delta="30" @@ -488,4 +307,4 @@ name="Korean" value="ko" /> </combo_box> -</panel> +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_preferences_colors.xml b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml new file mode 100644 index 0000000000..6dc419a96c --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml @@ -0,0 +1,362 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="true" + follows="left|top|right|bottom" + height="408" + label="Colors" + layout="topleft" + left="102" + name="colors_panel" + top="1" + width="517"> + <text + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left="30" + name="effects_color_textbox" + top_pad="10" + width="200"> + My effects (selection beam): + </text> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="40" + name="effect_color_swatch" + tool_tip="Click to open Color Picker" + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="EffectColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="EffectColor" /> + <color_swatch.caption_text + height="0" /> + </color_swatch> + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="font_colors" + top_pad="20" + width="120" + > + Chat font colors: + </text> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="40" + name="user" + top_pad="10" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="UserChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="UserChatColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box1" + top_delta="5" + width="95"> + Me + </text> + <color_swatch + can_apply_immediately="true" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="190" + name="agent" + top_pad="-15" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="AgentChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="AgentChatColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box2" + top_delta="5" + width="95"> + Others + </text> + <color_swatch + can_apply_immediately="true" + color="EmphasisColor_35" + follows="left|top" + height="24" + label_height="0" + label_width="60" + layout="topleft" + left="360" + name="objects" + top_pad="-15" + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ObjectChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ObjectChatColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box3" + top_delta="5" + width="95"> + Objects + </text> + <color_swatch + can_apply_immediately="true" + color="LtGray" + follows="left|top" + height="24" + label_height="0" + label_width="44" + layout="topleft" + left="40" + name="system" + top_pad="22" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="SystemChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="SystemChatColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box4" + top_delta="5" + width="95"> + System + </text> + <color_swatch + can_apply_immediately="true" + color="Red" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="190" + name="script_error" + top_pad="-15" + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="ScriptErrorColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="ScriptErrorColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box5" + top_delta="5" + width="95"> + Errors + </text> + <color_swatch + can_apply_immediately="true" + color="LtYellow" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="40" + name="owner" + top_pad="22" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="llOwnerSayChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="llOwnerSayChatColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box7" + top_delta="5" + width="95"> + Owner + </text> + <color_swatch + can_apply_immediately="true" + color="EmphasisColor" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left="190" + name="links" + top_pad="-15" + width="44" > + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="HTMLLinkColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="HTMLLinkColor" /> + </color_swatch> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="5" + mouse_opaque="false" + name="text_box9" + top_delta="5" + width="95"> + URLs + </text> + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="bubble_chat" + top_pad="20" + width="120" + > + Bubble chat: + </text> + <color_swatch + can_apply_immediately="true" + color="0 0 0 1" + control_name="BackgroundChatColor" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left_delta="10" + top_pad="5" + name="background" + tool_tip="Choose color for bubble chat" + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="BackgroundChatColor" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="BackgroundChatColor" /> + </color_swatch> + <slider + control_name="ChatBubbleOpacity" + follows="left|top" + height="16" + increment="0.05" + initial_value="1" + label="Opacity:" + layout="topleft" + left_pad="10" + label_width="70" + name="bubble_chat_opacity" + top_delta = "6" + width="378" /> + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="bubble_chat" + top_pad="15" + width="120" + > + Floater Opacity: + </text> + <slider + can_edit_text="false" + control_name="ActiveFloaterTransparency" + decimal_digits="2" + follows="left|top" + height="16" + increment="0.01" + initial_value="0.8" + layout="topleft" + label_width="115" + label="Active :" + left="50" + max_val="1.00" + min_val="0.00" + name="active" + show_text="true" + top_pad="5" + width="415" /> + <slider + can_edit_text="false" + control_name="InactiveFloaterTransparency" + decimal_digits="2" + follows="left|top" + height="16" + increment="0.01" + initial_value="0.5" + layout="topleft" + label_width="115" + label="Inctive :" + left="50" + max_val="1.00" + min_val="0.00" + name="active" + show_text="true" + top_pad="5" + width="415" /> +</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 17eebffa02..36f8f99178 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml @@ -106,7 +106,7 @@ height="15" layout="topleft" left="30" - top_pad="15" + top_pad="8" name="maturity_desired_prompt" width="200"> I want to access content rated: @@ -177,7 +177,7 @@ layout="topleft" left="30" name="start_location_textbox" - top_pad="15" + top_pad="8" width="394"> Start location: </text> @@ -216,7 +216,7 @@ layout="topleft" left="30" name="name_tags_textbox" - top_pad="15" + top_pad="10" width="400"> Name tags: </text> @@ -224,26 +224,34 @@ control_name="AvatarNameTagMode" height="20" layout="topleft" - left="50" + left="35" + top_pad="0" name="Name_Tag_Preference"> <radio_item label="Off" - layout="topleft" name="radio" + top_delta="20" + layout="topleft" + height="16" + left="0" value="0" width="75" /> <radio_item label="On" + left_pad="0" layout="topleft" - left_pad="12" + top_delta="0" + height="16" name="radio2" value="1" width="75" /> <radio_item label="Show briefly" - layout="topleft" - left_pad="12" + left_pad="0" name="radio3" + height="16" + layout="topleft" + top_delta="0" value="2" width="160" /> </radio_group> @@ -251,68 +259,125 @@ enabled_control="AvatarNameTagMode" control_name="RenderNameShowSelf" height="16" - label="Show my name" + label="My name" layout="topleft" - left="50" + left="35" name="show_my_name_checkbox1" - width="300" /> + top_pad="2" + width="100" /> <check_box + control_name="NameTagShowUsernames" + enabled_control="AvatarNameTagMode" + height="16" + label="Usernames" + layout="topleft" + left_pad="50" + name="show_slids" + tool_tip="Show username, like bobsmith123" + top_delta="0" /> + <check_box + control_name="NameTagShowGroupTitles" enabled_control="AvatarNameTagMode" - control_name="RenderShowGroupTitleAll" height="16" - label="Show group titles" + label="Group titles" layout="topleft" - left_delta="175" + left="35" + width="100" name="show_all_title_checkbox1" - width="200" /> + tool_tip="Show group titles, like Officer or Member" + top_pad="3" /> + <check_box + control_name="NameTagShowFriends" + enabled_control="AvatarNameTagMode" + height="16" + label="Highlight friends" + layout="topleft" + left_pad="50" + name="show_friends" + tool_tip="Highlight the name tags of your friends"/> + <check_box + control_name="UseDisplayNames" + follows="top|left" + height="16" + label="View Display Names" + layout="topleft" + left="35" + name="display_names_check" + width="237" + tool_tip="Check to use display names in chat, IM, name tags, etc." + top_pad="3"/> + + <check_box + control_name="EnableUIHints" + follows="top|left" + height="16" + label="Enable Viewer UI Hints" + layout="topleft" + left="27" + name="viewer_hints_check" + top_pad="5" + width="237"/> + + <text + type="string" + length="1" + follows="left|top" + height="15" + layout="topleft" + left="30" + name="inworld_typing_rg_label" + top_pad="6" + width="400"> + Pressing letter keys: + </text> + <radio_group + control_name="LetterKeysFocusChatBar" + height="20" + layout="topleft" + left="35" + top_pad="0" + name="inworld_typing_preference"> + <radio_item + label="Starts local chat" + name="radio_start_chat" + top_delta="20" + layout="topleft" + height="16" + left="0" + value="1" + width="150" /> + <radio_item + label="Affects movement (i.e. WASD)" + left_pad="0" + layout="topleft" + top_delta="0" + height="16" + name="radio_move" + value="0" + width="75" /> + </radio_group> + <text type="string" length="1" follows="left|top" - height="15" + height="13" layout="topleft" left="30" - name="effects_color_textbox" - top_pad="15" - width="200"> - My effects: - </text> - <text - type="string" - length="1" - follows="left|top" - height="13" - layout="topleft" - left_pad="5" - name="title_afk_text" - width="190"> - Away timeout: + name="title_afk_text" + top_pad="4" + width="190"> + Away timeout: </text> - <color_swatch - can_apply_immediately="true" - follows="left|top" - height="50" - layout="topleft" - left="50" - name="effect_color_swatch" - tool_tip="Click to open Color Picker" - width="38"> - <color_swatch.init_callback - function="Pref.getUIColor" - parameter="EffectColor" /> - <color_swatch.commit_callback - function="Pref.applyUIColor" - parameter="EffectColor" /> - </color_swatch> <combo_box - height="23" - layout="topleft" - control_name="AFKTimeout" - left_pad="160" - label="Away timeout:" - top_delta="0" - name="afk" - width="130"> + height="23" + layout="topleft" + control_name="AFKTimeout" + left="30" + label="Away timeout:" + top_pad="2" + name="afk" + width="130"> <combo_box.item label="2 minutes" name="item0" @@ -343,7 +408,7 @@ left="30" mouse_opaque="false" name="text_box3" - top_pad="15" + top_pad="5" width="240"> Busy mode response: </text> @@ -353,12 +418,12 @@ bg_writeable_color="LtGray" use_ellipses="false" commit_on_focus_lost = "true" - follows="left|top|right" - height="60" + follows="left|top" + height="29" layout="topleft" left="50" name="busy_response" - width="450" + width="470" word_wrap="true"> log_in_to_change </text_editor> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml index 113d5fb6dc..3ceee60927 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -155,7 +155,7 @@ visiblity_control="ShowAdvancedGraphicsSettings" border="false" follows="top|left" - height="283" + height="300" label="CustomGraphics" layout="topleft" left="5" @@ -163,536 +163,546 @@ top="76" width="485"> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="5" - name="ShadersText" - top="3" - width="128"> + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="5" + name="ShadersText" + top="3" + width="128"> Shaders: </text> <check_box - control_name="RenderObjectBump" - height="16" - initial_value="true" - label="Bump mapping and shiny" - layout="topleft" - left_delta="0" - name="BumpShiny" - top_pad="7" - width="256" /> + control_name="RenderTransparentWater" + height="16" + initial_value="true" + label="Transparent Water" + layout="topleft" + left_delta="0" + name="BumpShiny" + top_pad="7" + width="256" /> <check_box - control_name="VertexShaderEnable" - height="16" - initial_value="true" - label="Basic shaders" - layout="topleft" - left_delta="0" - name="BasicShaders" - tool_tip="Disabling this option may prevent some graphics card drivers from crashing" - top_pad="1" - width="315"> + control_name="RenderObjectBump" + height="16" + initial_value="true" + label="Bump mapping and shiny" + layout="topleft" + left_delta="0" + name="BumpShiny" + top_pad="1" + width="256" /> + <check_box + control_name="VertexShaderEnable" + height="16" + initial_value="true" + label="Basic shaders" + layout="topleft" + left_delta="0" + name="BasicShaders" + tool_tip="Disabling this option may prevent some graphics card drivers from crashing" + top_pad="1" + width="315"> <check_box.commit_callback - function="Pref.VertexShaderEnable" /> + function="Pref.VertexShaderEnable" /> </check_box> <check_box - control_name="WindLightUseAtmosShaders" - height="16" - initial_value="true" - label="Atmospheric shaders" - layout="topleft" - left_delta="0" - name="WindLightUseAtmosShaders" - top_pad="1" - width="256"> + control_name="WindLightUseAtmosShaders" + height="16" + initial_value="true" + label="Atmospheric shaders" + layout="topleft" + left_delta="0" + name="WindLightUseAtmosShaders" + top_pad="1" + width="256"> <check_box.commit_callback - function="Pref.VertexShaderEnable" /> + function="Pref.VertexShaderEnable" /> </check_box> <!-- DISABLED UNTIL WE REALLY WANT TO SUPPORT THIS - <check_box - control_name="RenderDeferred" - height="16" - initial_value="true" - label="Lighting and Shadows" - layout="topleft" - left_delta="0" - name="UseLightShaders" - top_pad="1" - width="256"> - <check_box.commit_callback - function="Pref.VertexShaderEnable" /> - </check_box> - <check_box - control_name="RenderDeferredSSAO" - height="16" - initial_value="true" - label="Ambient Occlusion" - layout="topleft" - left_delta="0" - name="UseSSAO" - top_pad="1" - width="256"> - <check_box.commit_callback - function="Pref.VertexShaderEnable" /> - </check_box> + <check_box + control_name="RenderDeferred" + height="16" + initial_value="true" + label="Lighting and Shadows" + layout="topleft" + left_delta="0" + name="UseLightShaders" + top_pad="1" + width="256"> + <check_box.commit_callback + function="Pref.VertexShaderEnable" /> + </check_box> + <check_box + control_name="RenderDeferredSSAO" + height="16" + initial_value="true" + label="Ambient Occlusion" + layout="topleft" + left_delta="0" + name="UseSSAO" + top_pad="1" + width="256"> + <check_box.commit_callback + function="Pref.VertexShaderEnable" /> + </check_box> - <text - type="string" - length="1" - top_pad="8" - follows="top|left" - height="23" - width="110" - word_wrap="true" - layout="topleft" - left="10" - name="shadows_label"> - Shadows: - </text> - <combo_box - control_name="RenderShadowDetail" - height="23" - layout="topleft" - left="10" - top_pad="0" - name="ShadowDetail" - width="150"> - <combo_box.item - label="None" - name="0" - value="0"/> - <combo_box.item - label="Sun/Moon" - name="1" - value="1"/> - <combo_box.item - label="Sun/Moon + Projectors" - name="2" - value="2"/> - </combo_box> + <text + type="string" + length="1" + top_pad="8" + follows="top|left" + height="23" + width="110" + word_wrap="true" + layout="topleft" + left="10" + name="shadows_label"> + Shadows: + </text> + <combo_box + control_name="RenderShadowDetail" + height="23" + layout="topleft" + left="10" + top_pad="0" + name="ShadowDetail" + width="150"> + <combo_box.item + label="None" + name="0" + value="0"/> + <combo_box.item + label="Sun/Moon" + name="1" + value="1"/> + <combo_box.item + label="Sun/Moon + Projectors" + name="2" + value="2"/> + </combo_box> --> - <text - type="string" - length="1" - top_pad="8" - follows="top|left" - height="23" - width="110" - word_wrap="true" - layout="topleft" - left="10" - name="reflection_label"> - Water Reflections: - </text> - <combo_box - control_name="RenderReflectionDetail" - height="23" - layout="topleft" - left_="10" - top_pad ="0" - name="Reflections" - width="150"> - <combo_box.item - label="Minimal" - name="0" - value="0"/> - <combo_box.item - label="Terrain and trees" - name="1" - value="1"/> - <combo_box.item - label="All static objects" - name="2" - value="2"/> - <combo_box.item - label="All avatars and objects" - name="3" - value="3"/> - <combo_box.item - label="Everything" - name="4" - value="4"/> - </combo_box> + <text + type="string" + length="1" + top_pad="8" + follows="top|left" + height="12" + width="110" + word_wrap="true" + layout="topleft" + left="05" + name="reflection_label"> + Water Reflections: + </text> + <combo_box + control_name="RenderReflectionDetail" + height="18" + layout="topleft" + left_delta="10" + top_pad ="3" + name="Reflections" + width="150"> + <combo_box.item + label="Minimal" + name="0" + value="0"/> + <combo_box.item + label="Terrain and trees" + name="1" + value="1"/> + <combo_box.item + label="All static objects" + name="2" + value="2"/> + <combo_box.item + label="All avatars and objects" + name="3" + value="3"/> + <combo_box.item + label="Everything" + name="4" + value="4"/> + </combo_box> <slider - control_name="RenderFarClip" - decimal_digits="0" - follows="left|top" - height="16" - increment="8" - initial_value="160" - label="Draw distance:" - label_width="185" - layout="topleft" - left="200" - max_val="512" - min_val="64" - name="DrawDistance" - top="3" - width="296" /> + control_name="RenderFarClip" + decimal_digits="0" + follows="left|top" + height="16" + increment="8" + initial_value="160" + label="Draw distance:" + label_width="185" + layout="topleft" + left="200" + max_val="512" + min_val="64" + name="DrawDistance" + top="3" + width="296" /> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="291" - name="DrawDistanceMeterText2" - top_delta="0" - width="128"> + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="291" + name="DrawDistanceMeterText2" + top_delta="0" + width="128"> m </text> <slider - control_name="RenderMaxPartCount" - decimal_digits="0" - follows="left|top" - height="16" - increment="256" - initial_value="4096" - label="Max. particle count:" - label_width="185" - layout="topleft" - left="200" - max_val="8192" - name="MaxParticleCount" - top_pad="7" - width="303" /> - <slider - control_name="RenderAvatarMaxVisible" - decimal_digits="0" - follows="left|top" - height="16" - increment="1" - initial_value="12" - label="Max. # of non-impostor avatars:" - label_width="185" - layout="topleft" - left_delta="0" - max_val="65" - min_val="1" - name="MaxNumberAvatarDrawn" - top_pad="4" - width="290" /> + control_name="RenderMaxPartCount" + decimal_digits="0" + follows="left|top" + height="16" + increment="256" + initial_value="4096" + label="Max. particle count:" + label_width="185" + layout="topleft" + left="200" + max_val="8192" + name="MaxParticleCount" + top_pad="7" + width="303" /> + <slider + control_name="RenderAvatarMaxVisible" + decimal_digits="0" + follows="left|top" + height="16" + increment="1" + initial_value="12" + label="Max. # of non-impostor avatars:" + label_width="185" + layout="topleft" + left_delta="0" + max_val="65" + min_val="1" + name="MaxNumberAvatarDrawn" + top_pad="4" + width="290" /> <slider - control_name="RenderGlowResolutionPow" - decimal_digits="0" - follows="left|top" - height="16" - increment="1" - initial_value="8" - label="Post process quality:" - label_width="185" - layout="topleft" - left="200" - max_val="9" - min_val="8" - name="RenderPostProcess" - show_text="false" - top_pad="4" - width="264"> + control_name="RenderGlowResolutionPow" + decimal_digits="0" + follows="left|top" + height="16" + increment="1" + initial_value="8" + label="Post process quality:" + label_width="185" + layout="topleft" + left="200" + max_val="9" + min_val="8" + name="RenderPostProcess" + show_text="false" + top_pad="4" + width="264"> <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="PostProcessText" /> + function="Pref.UpdateSliderText" + parameter="PostProcessText" /> </slider> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="MeshDetailText" - top_pad="5" - width="128"> + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="MeshDetailText" + top_pad="5" + width="128"> Mesh detail: </text> <slider - control_name="RenderVolumeLODFactor" - follows="left|top" - height="16" - increment="0.125" - initial_value="160" - label=" Objects:" - label_width="185" - layout="topleft" - left_delta="0" - max_val="2" - name="ObjectMeshDetail" - show_text="false" - top_pad="6" - width="264"> + control_name="RenderVolumeLODFactor" + follows="left|top" + height="16" + increment="0.125" + initial_value="160" + label=" Objects:" + label_width="185" + layout="topleft" + left_delta="0" + max_val="2" + name="ObjectMeshDetail" + show_text="false" + top_pad="6" + width="264"> <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="ObjectMeshDetailText" /> + function="Pref.UpdateSliderText" + parameter="ObjectMeshDetailText" /> </slider> <slider - control_name="RenderFlexTimeFactor" - follows="left|top" - height="16" - initial_value="160" - label=" Flexiprims:" - label_width="185" - layout="topleft" - left_delta="0" - name="FlexibleMeshDetail" - show_text="false" - top_pad="4" - width="264"> + control_name="RenderFlexTimeFactor" + follows="left|top" + height="16" + initial_value="160" + label=" Flexiprims:" + label_width="185" + layout="topleft" + left_delta="0" + name="FlexibleMeshDetail" + show_text="false" + top_pad="4" + width="264"> <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="FlexibleMeshDetailText" /> + function="Pref.UpdateSliderText" + parameter="FlexibleMeshDetailText" /> </slider> <slider - control_name="RenderTreeLODFactor" - follows="left|top" - height="16" - increment="0.125" - initial_value="160" - label=" Trees:" - label_width="185" - layout="topleft" - left_delta="0" - name="TreeMeshDetail" - show_text="false" - top_pad="4" - width="264"> - <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="TreeMeshDetailText" /> - </slider> + control_name="RenderTreeLODFactor" + follows="left|top" + height="16" + increment="0.125" + initial_value="160" + label=" Trees:" + label_width="185" + layout="topleft" + left_delta="0" + name="TreeMeshDetail" + show_text="false" + top_pad="4" + width="264"> + <slider.commit_callback + function="Pref.UpdateSliderText" + parameter="TreeMeshDetailText" /> + </slider> <slider - control_name="RenderAvatarLODFactor" - follows="left|top" - height="16" - increment="0.125" - initial_value="160" - label=" Avatars:" - label_width="185" - layout="topleft" - left_delta="0" - name="AvatarMeshDetail" - show_text="false" - top_pad="4" - width="264"> - <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="AvatarMeshDetailText" /> + control_name="RenderAvatarLODFactor" + follows="left|top" + height="16" + increment="0.125" + initial_value="160" + label=" Avatars:" + label_width="185" + layout="topleft" + left_delta="0" + name="AvatarMeshDetail" + show_text="false" + top_pad="4" + width="264"> + <slider.commit_callback + function="Pref.UpdateSliderText" + parameter="AvatarMeshDetailText" /> </slider> <slider - control_name="RenderTerrainLODFactor" - follows="left|top" - height="16" - increment="0.125" - initial_value="160" - label=" Terrain:" - label_width="185" - layout="topleft" - left_delta="0" - max_val="2" - min_val="1" - name="TerrainMeshDetail" - show_text="false" - top_pad="4" - width="264"> - <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="TerrainMeshDetailText" /> + control_name="RenderTerrainLODFactor" + follows="left|top" + height="16" + increment="0.125" + initial_value="160" + label=" Terrain:" + label_width="185" + layout="topleft" + left_delta="0" + max_val="2" + min_val="1" + name="TerrainMeshDetail" + show_text="false" + top_pad="4" + width="264"> + <slider.commit_callback + function="Pref.UpdateSliderText" + parameter="TerrainMeshDetailText" /> </slider> <slider - control_name="WLSkyDetail" - enabled_control="WindLightUseAtmosShaders" - decimal_digits="0" - follows="left|top" - height="16" - increment="8" - initial_value="160" - label=" Sky:" - label_width="185" - layout="topleft" - left_delta="0" - max_val="128" - min_val="16" - name="SkyMeshDetail" - show_text="false" - top_pad="4" - width="264"> - <slider.commit_callback - function="Pref.UpdateSliderText" - parameter="SkyMeshDetailText" /> + control_name="WLSkyDetail" + enabled_control="WindLightUseAtmosShaders" + decimal_digits="0" + follows="left|top" + height="16" + increment="8" + initial_value="160" + label=" Sky:" + label_width="185" + layout="topleft" + left_delta="0" + max_val="128" + min_val="16" + name="SkyMeshDetail" + show_text="false" + top_pad="4" + width="264"> + <slider.commit_callback + function="Pref.UpdateSliderText" + parameter="SkyMeshDetailText" /> </slider> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left="469" - name="PostProcessText" - top="60" - width="128"> - Low + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left="469" + name="PostProcessText" + top="60" + width="128"> + Low </text> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="ObjectMeshDetailText" - top_pad="26" - width="128"> - Low + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="ObjectMeshDetailText" + top_pad="26" + width="128"> + Low </text> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="FlexibleMeshDetailText" - top_pad="8" - width="128"> - Low + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="FlexibleMeshDetailText" + top_pad="8" + width="128"> + Low </text> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="TreeMeshDetailText" - top_pad="8" - width="128"> - Low + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="TreeMeshDetailText" + top_pad="8" + width="128"> + Low </text> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="AvatarMeshDetailText" - top_pad="8" - width="128"> - Low + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="AvatarMeshDetailText" + top_pad="8" + width="128"> + Low </text> <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="TerrainMeshDetailText" - top_pad="8" - width="128"> - Low + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="TerrainMeshDetailText" + top_pad="8" + width="128"> + Low </text> <text - enabled_control="WindLightUseAtmosShaders" - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="0" - name="SkyMeshDetailText" - top_pad="8" - width="128"> - Low + enabled_control="WindLightUseAtmosShaders" + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="0" + name="SkyMeshDetailText" + top_pad="8" + width="128"> + Low </text> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left_delta="-260" - name="AvatarRenderingText" - top_pad="18" - width="128"> - Avatar rendering: + <text + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left_delta="-260" + name="AvatarRenderingText" + top_pad="18" + width="128"> + Avatar rendering: </text> <check_box - control_name="RenderUseImpostors" - height="16" - initial_value="true" - label="Avatar impostors" - layout="topleft" - left_delta="0" - name="AvatarImpostors" - top_pad="7" - width="256" /> + control_name="RenderUseImpostors" + height="16" + initial_value="true" + label="Avatar impostors" + layout="topleft" + left_delta="0" + name="AvatarImpostors" + top_pad="7" + width="256" /> <check_box - control_name="RenderAvatarVP" - height="16" - initial_value="true" - label="Hardware skinning" - layout="topleft" - left_delta="0" - name="AvatarVertexProgram" - top_pad="1" - width="256"> - <check_box.commit_callback - function="Pref.VertexShaderEnable" /> + control_name="RenderAvatarVP" + height="16" + initial_value="true" + label="Hardware skinning" + layout="topleft" + left_delta="0" + name="AvatarVertexProgram" + top_pad="1" + width="256"> + <check_box.commit_callback + function="Pref.VertexShaderEnable" /> </check_box> <check_box - control_name="RenderAvatarCloth" - height="16" - initial_value="true" - label="Avatar cloth" - layout="topleft" - left_delta="0" - name="AvatarCloth" - top_pad="1" - width="256" /> - <text - type="string" - length="1" - follows="left|top" - height="12" - layout="topleft" - left="358" - left_pad="-30" - name="TerrainDetailText" - top="226" - width="155"> - Terrain detail: - </text> - <radio_group - control_name="RenderTerrainDetail" - draw_border="false" - height="38" - layout="topleft" - left_delta="0" - name="TerrainDetailRadio" - top_pad="5" - width="70"> - <radio_item - height="16" - label="Low" - layout="topleft" - name="0" - top="3" - width="50" /> - <radio_item - height="16" - label="High" - layout="topleft" - name="2" - top_delta="16" - width="50" /> - </radio_group> --> + control_name="RenderAvatarCloth" + height="16" + initial_value="true" + label="Avatar cloth" + layout="topleft" + left_delta="0" + name="AvatarCloth" + top_pad="1" + width="256" /> + <text + type="string" + length="1" + follows="left|top" + height="12" + layout="topleft" + left="358" + left_pad="-30" + name="TerrainDetailText" + top="226" + width="155"> + Terrain detail: + </text> + <radio_group + control_name="RenderTerrainDetail" + draw_border="false" + height="38" + layout="topleft" + left_delta="0" + name="TerrainDetailRadio" + top_pad="5" + width="70"> + <radio_item + height="16" + label="Low" + layout="topleft" + name="0" + top="3" + width="50" /> + <radio_item + height="16" + label="High" + layout="topleft" + name="2" + top_delta="16" + width="50" /> + </radio_group> --> </panel> - <button + <button follows="left|bottom" height="23" label="Apply" @@ -701,8 +711,7 @@ left="10" name="Apply" top="383" - width="115" - > + width="115"> <button.commit_callback function="Pref.Apply" /> </button> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_move.xml b/indra/newview/skins/default/xui/en/panel_preferences_move.xml new file mode 100644 index 0000000000..d2fc6ea09a --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_preferences_move.xml @@ -0,0 +1,220 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + border="true" + follows="left|top|right|bottom" + height="408" + label="Move" + layout="topleft" + left="102" + name="move_panel" + top="1" + width="517"> + <icon + follows="left|top" + height="18" + image_name="Cam_FreeCam_Off" + layout="topleft" + name="camera_icon" + mouse_opaque="false" + visible="true" + width="18" + left="30" + top="10"/> + <slider + can_edit_text="true" + control_name="CameraAngle" + decimal_digits="2" + follows="left|top" + height="16" + increment="0.025" + initial_value="1.57" + layout="topleft" + label_width="100" + label="View angle" + left_pad="30" + max_val="2.97" + min_val="0.17" + name="camera_fov" + show_text="false" + width="240" /> + <slider + can_edit_text="true" + control_name="CameraOffsetScale" + decimal_digits="2" + follows="left|top" + height="16" + increment="0.025" + initial_value="1" + layout="topleft" + label="Distance" + left_delta="0" + label_width="100" + max_val="3" + min_val="0.5" + name="camera_offset_scale" + show_text="false" + width="240" + top_pad="5"/> + <text + follows="left|top" + type="string" + length="1" + height="10" + left="80" + name="heading2" + width="270" + top_pad="5"> + Automatic position for: + </text> + <check_box + control_name="EditCameraMovement" + height="20" + follows="left|top" + label="Build/Edit" + layout="topleft" + left_delta="30" + name="edit_camera_movement" + tool_tip="Use automatic camera positioning when entering and exiting edit mode" + width="280" + top_pad="5" /> + <check_box + control_name="AppearanceCameraMovement" + follows="left|top" + height="16" + label="Appearance" + layout="topleft" + name="appearance_camera_movement" + tool_tip="Use automatic camera positioning while in edit mode" + width="242" /> + <check_box + control_name="SidebarCameraMovement" + follows="left|top" + height="16" + initial_value="true" + label="Sidebar" + layout="topleft" + name="appearance_sidebar_positioning" + tool_tip="Use automatic camera positioning for sidebar" + width="242" /> + <icon + follows="left|top" + height="18" + image_name="Move_Walk_Off" + layout="topleft" + name="avatar_icon" + mouse_opaque="false" + visible="true" + width="18" + top_pad="2" + left="30" /> + <check_box + control_name="FirstPersonAvatarVisible" + follows="left|top" + height="20" + label="Show me in Mouselook" + layout="topleft" + left_pad="30" + name="first_person_avatar_visible" + width="256" /> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_delta="3" + name=" Mouse Sensitivity" + top_pad="10" + width="160"> + Mouselook mouse sensitivity: + </text> + <slider + control_name="MouseSensitivity" + follows="left|top" + height="15" + initial_value="2" + layout="topleft" + show_text="false" + left_pad="5" + max_val="15" + name="mouse_sensitivity" + top_delta="-1" + width="145" /> + <check_box + control_name="InvertMouse" + height="16" + label="Invert" + layout="topleft" + left_pad="2" + name="invert_mouse" + top_delta="0" + width="128" /> + <check_box + control_name="ArrowKeysAlwaysMove" + follows="left|top" + height="20" + label="Arrow keys always move me" + layout="topleft" + left="78" + name="arrow_keys_move_avatar_check" + width="237" + top_pad="1"/> + <check_box + control_name="AllowTapTapHoldRun" + follows="left|top" + height="20" + label="Tap-tap-hold to run" + layout="topleft" + left_delta="0" + name="tap_tap_hold_to_run" + width="237" + top_pad="0"/> + <check_box + follows="left|top" + height="20" + label="Double-Click to:" + layout="topleft" + left_delta="0" + name="double_click_chkbox" + width="237" + top_pad="0"> + <check_box.commit_callback + function="Pref.CommitDoubleClickChekbox"/> + </check_box> + <radio_group + height="20" + layout="topleft" + left_delta="17" + top_pad="2" + name="double_click_action"> + <radio_item + height="16" + label="Teleport" + layout="topleft" + left="0" + name="radio_teleport" + top_delta="20" + width="100" /> + <radio_item + height="16" + label="Auto-pilot" + left_pad="0" + layout="topleft" + name="radio_autopilot" + top_delta="0" + width="75" /> + <radio_group.commit_callback + function="Pref.CommitRadioDoubleClick"/> + </radio_group> + <button + height="23" + label="Other Devices" + left="30" + name="joystick_setup_button" + top="30" + width="155"> + <button.commit_callback + function="Floater.Show" + parameter="pref_joystick" /> + </button> +</panel>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml index 4ebd4c76f8..2ddb81559f 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml @@ -47,7 +47,7 @@ layout="topleft" left="30" name="online_visibility" - top_pad="20" + top_pad="30" width="350" /> <check_box enabled_control="EnableVoiceChat" @@ -78,9 +78,9 @@ left="30" mouse_opaque="false" name="Logs:" - top_pad="10" + top_pad="30" width="350"> - Logs: + Chat Logs: </text> <check_box enabled="false" @@ -108,13 +108,23 @@ control_name="LogTimestamp" enabled="false" height="16" - label="Add timestamp" + label="Add timestamp to each line in chat log" layout="topleft" left_delta="0" name="show_timestamps_check_im" top_pad="10" width="237" /> - <text + <check_box + control_name="LogFileNamewithDate" + enabled="false" + height="16" + label="Add datestamp to log file name." + layout="topleft" + left_detla="5" + name="logfile_name_datestamp" + top_pad="10" + width="350"/> + <text type="string" length="1" follows="left|top" @@ -123,7 +133,7 @@ left_delta="0" mouse_opaque="false" name="log_path_desc" - top_pad="5" + top_pad="30" width="128"> Location of logs: </text> @@ -160,11 +170,25 @@ layout="topleft" left="30" name="block_list" - top_pad="20" + top_pad="35" width="145"> <!--<button.commit_callback function="SideTray.ShowPanel"--> <button.commit_callback function="Pref.BlockList"/> </button> + <text + type="string" + length="1" + follows="left|top" + height="10" + layout="topleft" + left_pad="10" + mouse_opaque="false" + name="cache_size_label_l" + top_delta="3" + text_color="LtGray_50" + width="300"> + (People and/or Objects you have blocked) + </text> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index 2c6ceeef2e..14aa38c5d3 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -10,51 +10,6 @@ top="1" width="517"> <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left="30" - name="Mouselook:" - top="10" - width="300"> - Mouselook: - </text> - <text - type="string" - length="1" - follows="left|top" - height="10" - layout="topleft" - left_delta="50" - name=" Mouse Sensitivity" - top_pad="10" - width="150"> - Mouse sensitivity - </text> - <slider - control_name="MouseSensitivity" - follows="left|top" - height="15" - initial_value="2" - layout="topleft" - show_text="false" - left_delta="150" - max_val="15" - name="mouse_sensitivity" - top_delta="0" - width="145" /> - <check_box - control_name="InvertMouse" - height="16" - label="Invert" - layout="topleft" - left_pad="2" - name="invert_mouse" - top_delta="0" - width="128" /> - <text type="string" length="1" follows="left|top" @@ -63,7 +18,7 @@ left="30" name="Network:" mouse_opaque="false" - top_pad="4" + top="10" width="300"> Network: </text> @@ -187,7 +142,7 @@ layout="topleft" left="80" name="Cache location" - top_delta="20" + top_delta="40" width="300"> Cache location: </text> @@ -195,7 +150,6 @@ control_name="CacheLocationTopFolder" border_style="line" border_thickness="1" - enabled="false" follows="left|top" font="SansSerif" height="23" @@ -320,7 +274,19 @@ radio_style="false" width="400" top_pad="5"/> - + <check_box + top_delta="4" + enabled="true" + follows="left|top" + height="14" + initial_value="false" + control_name="MediaEnablePopups" + label="Enable media browser pop-ups" + left_delta="0" + mouse_opaque="true" + name="media_popup_enabled" + width="400" + top_pad="5"/> <check_box top_delta="4" enabled="true" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml index aa760edad3..da366f30ae 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml @@ -9,6 +9,10 @@ name="Preference Media panel" top="1" width="517"> + <panel.string + name="middle_mouse"> + Middle Mouse + </panel.string> <slider control_name="AudioLevelMaster" follows="left|top" @@ -66,7 +70,7 @@ name="UI Volume" show_text="false" slider_label.halign="right" - top_pad="7" + top_pad="4" volume="true" width="300"> <slider.commit_callback @@ -100,7 +104,7 @@ name="Wind Volume" show_text="false" slider_label.halign="right" - top_pad="7" + top_pad="4" volume="true" width="300"> <slider.commit_callback @@ -134,7 +138,7 @@ left="0" name="SFX Volume" show_text="false" - top_pad="7" + top_pad="4" volume="true" width="300"> <slider.commit_callback @@ -168,7 +172,7 @@ name="Music Volume" slider_label.halign="right" show_text="false" - top_pad="7" + top_pad="4" volume="true" width="300"> <slider.commit_callback @@ -211,7 +215,7 @@ name="Media Volume" show_text="false" slider_label.halign="right" - top_pad="7" + top_pad="4" volume="true" width="300"> <slider.commit_callback @@ -253,7 +257,7 @@ label_width="120" layout="topleft" left="0" - top_delta="20" + top_pad="4" name="Voice Volume" show_text="false" slider_label.halign="right" @@ -297,9 +301,9 @@ height="15" tool_tip="Check this to let media auto-play if it wants" label="Allow Media to auto-play" - top_pad="5" + top_pad="1" left="25"/> - <check_box + <check_box name="media_show_on_others_btn" control_name="MediaShowOnOthers" value="true" @@ -307,7 +311,8 @@ height="15" tool_tip="Uncheck this to hide media attached to other avatars nearby" label="Play media attached to other avatars" - left="25"/> + left="25" + width="230"/> <text type="string" @@ -317,8 +322,8 @@ layout="topleft" left="25" name="voice_chat_settings" - width="200" - top="210"> + width="180" + top_pad="7"> Voice Chat Settings </text> <text @@ -326,10 +331,10 @@ length="1" follows="left|top" layout="topleft" - left="80" + left="46" top_delta="16" name="Listen from" - width="142"> + width="112"> Listen from: </text> <icon @@ -341,43 +346,107 @@ mouse_opaque="false" visible="true" width="18" - left_pad="0" + left_pad="-4" top_delta="-5"/> <icon follows="left|top" height="18" image_name="Move_Walk_Off" layout="topleft" + left_pad="170" name="avatar_icon" mouse_opaque="false" visible="true" width="18" - top_delta="20" /> + top_delta="0" /> <radio_group enabled_control="EnableVoiceChat" control_name="VoiceEarLocation" draw_border="false" follows="left|top" layout="topleft" - left_pad="2" + left_delta="-168" width="221" - height="38" + height="20" name="ear_location"> <radio_item - height="16" + height="19" label="Camera position" follows="left|top" layout="topleft" name="0" width="200"/> <radio_item - height="16" + height="19" follows="left|top" label="Avatar position" layout="topleft" + left_pad="-16" name="1" + top_delta ="0" width="200" /> </radio_group> + <check_box + control_name="LipSyncEnabled" + follows="left|top" + height="15" + label="Move avatar lips when speaking" + layout="topleft" + left="44" + name="enable_lip_sync" + top_pad="5" + width="237"/> + <check_box + follows="top|left" + enabled_control="EnableVoiceChat" + control_name="PushToTalkToggle" + height="15" + label="Toggle speak on/off when I press:" + layout="topleft" + left="44" + name="push_to_talk_toggle_check" + width="237" + tool_tip="When in toggle mode, press and release the trigger key ONCE to switch your microphone on or off. When not in toggle mode, the microphone broadcasts your voice only while the trigger is being held down." + top_pad="3"/> + <line_editor + follows="top|left" + control_name="PushToTalkButton" + enabled="false" + enabled_control="EnableVoiceChat" + height="23" + left="80" + max_length_bytes="200" + name="modifier_combo" + label="Push-to-Speak trigger" + top_pad="3" + width="200" /> + <button + layout="topleft" + follows="top|left" + enabled_control="EnableVoiceChat" + height="23" + label="Set Key" + left_pad="5" + name="set_voice_hotkey_button" + width="100"> + <button.commit_callback + function="Pref.VoiceSetKey" /> + </button> + <button + enabled_control="EnableVoiceChat" + follows="top|left" + halign="center" + height="23" + image_overlay="Refresh_Off" + layout="topleft" + tool_tip="Reset to Middle Mouse Button" + mouse_opaque="true" + name="set_voice_middlemouse_button" + left_pad="5" + width="25"> + <button.commit_callback + function="Pref.VoiceSetMiddleMouse" /> + </button> <button control_name="ShowDeviceSettings" follows="left|top" @@ -385,8 +454,8 @@ is_toggle="true" label="Input/Output devices" layout="topleft" - left="80" - top_pad="5" + left="20" + top_pad="6" name="device_settings_btn" width="190"> </button> @@ -396,14 +465,14 @@ visiblity_control="ShowDeviceSettings" border="false" follows="top|left" - height="120" + height="100" label="Device Settings" layout="topleft" - left="0" + left_delta="-2" name="device_settings_panel" class="panel_voice_device_settings" - width="501" - top="285"> + width="470" + top_pad="0"> <panel.string name="default_text"> Default @@ -419,7 +488,7 @@ <icon height="18" image_name="Microphone_On" - left="80" + left_delta="4" name="microphone_icon" mouse_opaque="false" top="7" @@ -434,17 +503,17 @@ layout="topleft" left_pad="3" name="Input" - width="200"> + width="70"> Input </text> <combo_box height="23" control_name="VoiceInputAudioDevice" layout="topleft" - left="165" + left_pad="0" max_chars="128" name="voice_input_device" - top_pad="-2" + top_delta="-5" width="200" /> <text type="string" @@ -452,9 +521,9 @@ follows="left|top" height="16" layout="topleft" - left="165" + left_delta="-70" name="My volume label" - top_pad="5" + top_pad="4" width="200"> My volume: </text> @@ -465,11 +534,11 @@ increment="0.025" initial_value="1.0" layout="topleft" - left="160" + left_delta="-6" max_val="2" name="mic_volume_slider" tool_tip="Change the volume using this slider" - top_pad="-2" + top_pad="-1" width="220" /> <text type="string" @@ -480,7 +549,7 @@ layout="topleft" left_pad="5" name="wait_text" - top_delta="0" + top_delta="-1" width="110"> Please wait </text> @@ -489,7 +558,7 @@ layout="topleft" left_delta="0" name="bar0" - top_delta="0" + top_delta="-2" width="20" /> <locate height="20" @@ -522,10 +591,10 @@ <icon height="18" image_name="Parcel_Voice_Light" - left="80" + left="5" name="speaker_icon" mouse_opaque="false" - top_pad="-8" + top_pad="3" visible="true" width="22" /> <text @@ -537,17 +606,17 @@ layout="topleft" left_pad="0" name="Output" - width="200"> + width="70"> Output </text> <combo_box control_name="VoiceOutputAudioDevice" height="23" layout="topleft" - left="165" + left_pad="0" max_chars="128" name="voice_output_device" - top_pad="-2" + top_delta="-3" width="200" /> </panel> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index 6bf00373ea..273c252474 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -33,10 +33,9 @@ mouse_opaque="false" layout="topleft" user_resize="false" /> - <panel + <layout_panel name="media_progress_indicator" mouse_opaque="false" - follows="left|right|top" height="8" layout="topleft" left="0" @@ -55,7 +54,7 @@ top="0" left="0" tool_tip="Media is Loading"/> - </panel> + </layout_panel> <layout_panel name="right_bookend_bottom" width="0" @@ -320,7 +319,7 @@ min_width="90"> <line_editor name="media_address_url" - max_length="1024" + max_length_bytes="1023" follows="top|left|right" height="22" top="0" diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index 78b192d4af..efc37c2127 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -263,7 +263,7 @@ name="partner_data_panel" top_pad="0" width="300"> - <name_box + <text follows="left|top" height="10" initial_value="(retrieving)" @@ -272,8 +272,8 @@ link="true" name="partner_text" top="0" - width="300" - word_wrap="true" /> + use_ellipses="true" + width="300" /> </panel> <text follows="left|top" 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 3b4d6ae58d..97229c413c 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -8,85 +8,152 @@ name="panel_target_profile" left="0" width="333"> - <string - name="status_online"> - Online - </string> - <string - name="status_offline"> - Offline - </string> - <button - follows="top|left" - height="24" - image_hover_unselected="BackButton_Over" - image_pressed="BackButton_Press" - image_unselected="BackButton_Off" + <string + name="status_online"> + Online + </string> + <string + name="status_offline"> + Offline + </string> + <button + follows="top|left" + height="24" + image_hover_unselected="BackButton_Over" + image_pressed="BackButton_Press" + image_unselected="BackButton_Off" + layout="topleft" + name="back" + left="10" + tab_stop="false" + top="2" + width="30" /> + <text + top="10" + follows="top|left" + height="13" + layout="topleft" + left="45" + name="display_name_label" + text_color="LtGray" + value="Display Name:" + width="80" /> + <text + top_delta="0" + follows="top|left" + height="13" + layout="topleft" + left="45" + name="solo_username_label" + text_color="LtGray" + value="Username:" + visible="false" + width="80" /> + <text + follows="top|right" + halign="right" + height="13" + layout="topleft" + right="-15" + name="status" + text_color="LtGray_50" + top_delta="0" + value="Online" + width="150" /> + <text + follows="top|left|right" + font="SansSerifBigBold" + height="29" + layout="topleft" + left="45" + name="user_name_small" + text_color="LtGray" + top="22" + value="Jack oh look at me this is a super duper long name" + use_ellipses="true" + word_wrap="true" + visible="false" + width="255" /> + <text + follows="top|left|right" + font="SansSerifHugeBold" + height="27" + layout="topleft" + left="45" + name="user_name" + text_color="LtGray" + top="25" + value="Jack Linden" + visible="true" + use_ellipses="true" + width="258" /> + <button + name="copy_to_clipboard" + layout="topleft" + follows="top|right" + image_overlay="Copy" + top_delta="0" + right="-15" + height="21" + width="21" + tab_stop="false" + tool_tip="Copy to Clipboard"/> + <text + follows="top|left" + height="13" + layout="topleft" + left="45" + name="user_label" + text_color="LtGray" + top_pad="10" + value="Username:" + width="70" /> + <text + follows="top|left" + height="20" + layout="topleft" + left_pad="0" + name="user_slid" + text_color="EmphasisColor" + font="SansSerifBold" + top_delta="-2" + use_ellipses="true" + value="jack.linden" + width="195" + wrap="true "/> + <tab_container + follows="all" + height="489" + halign="center" + layout="topleft" + left="5" + min_width="333" + name="tabs" + tab_min_width="80" + tab_height="30" + tab_position="top" + top_pad="5" + width="317"> + <panel + class="panel_profile" + filename="panel_profile.xml" + label="PROFILE" layout="topleft" - name="back" - left="10" - tab_stop="false" - top="2" - width="30" /> - <text_editor - h_pad="0" - v_pad="0" - allow_scroll="false" - bg_visible="false" - read_only = "true" - follows="top|left|right" - font="SansSerifHugeBold" - height="26" - layout="topleft" - left_pad="5" - name="user_name" - text_color="LtGray" - top="2" - value="(Loading...)" - use_ellipses="true" - width="275" /> - <text - follows="top|left" - height="13" + help_topic="profile_profile_tab" + name="panel_profile" /> + <panel + class="panel_picks" + filename="panel_picks.xml" + label="PICKS" layout="topleft" - left="45" - name="status" - text_color="LtGray_50" - value="Online" - width="150" /> - <tab_container - follows="all" - height="515" - halign="center" + help_topic="profile_picks_tab" + name="panel_picks" /> + <panel + class="panel_notes" + filename="panel_notes.xml" + label="NOTES & PRIVACY" layout="topleft" - left="5" - min_width="333" - name="tabs" - tab_min_width="80" - tab_height="30" - tab_position="top" - top_pad="5" - width="317"> - <panel - class="panel_profile" - filename="panel_profile.xml" - label="PROFILE" - layout="topleft" - help_topic="profile_profile_tab" - name="panel_profile" /> - <panel - class="panel_picks" - filename="panel_picks.xml" - label="PICKS" - layout="topleft" - help_topic="profile_picks_tab" - name="panel_picks" /> - <panel - class="panel_notes" - filename="panel_notes.xml" - label="NOTES & PRIVACY" - layout="topleft" - help_topic="profile_notes_tab" - name="panel_notes" /> - </tab_container> + help_topic="profile_notes_tab" + name="panel_notes" /> + </tab_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_progress.xml b/indra/newview/skins/default/xui/en/panel_progress.xml index 727c5fb7b2..2868d91cc7 100644 --- a/indra/newview/skins/default/xui/en/panel_progress.xml +++ b/indra/newview/skins/default/xui/en/panel_progress.xml @@ -34,6 +34,7 @@ height="768" layout="topleft" left="0" + orientation="vertical" name="stack2" top="0" width="640"> diff --git a/indra/newview/skins/default/xui/en/panel_region_debug.xml b/indra/newview/skins/default/xui/en/panel_region_debug.xml index a6b4ddd01e..15df095efa 100644 --- a/indra/newview/skins/default/xui/en/panel_region_debug.xml +++ b/indra/newview/skins/default/xui/en/panel_region_debug.xml @@ -103,7 +103,7 @@ mouse_opaque="false" name="target_avatar_name" top_delta="-2" - width="180"> + width="270"> (none) </line_editor> <button diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml index 08e36d5e57..1307d807e2 100644 --- a/indra/newview/skins/default/xui/en/panel_region_estate.xml +++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml @@ -72,7 +72,8 @@ left_delta="0" name="estate_owner" top_delta="16" - width="150"> + use_ellipses="true" + width="290"> (unknown) </text> <view_border diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml deleted file mode 100644 index ffa1a257d5..0000000000 --- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml +++ /dev/null @@ -1,242 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel - border="true" - follows="top|left" - height="360" - label="Region" - layout="topleft" - left="0" - name="General" - top="360" - width="280"> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left="10" - name="region_text_lbl" - top="10" - width="100"> - Region: - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left_delta="50" - name="region_text" - top_delta="0" - width="200"> - unknown - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left="10" - name="version_channel_text_lbl" - top="30" - width="100"> - Version: - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left_delta="50" - name="version_channel_text" - top_delta="0" - width="200"> - unknown - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left="10" - name="region_type_lbl" - top="50" - width="100"> - Type: - </text> - <text - follows="left|top" - font="SansSerif" - height="20" - layout="topleft" - left_delta="50" - name="region_type" - top_delta="0" - width="200"> - unknown - </text> - <check_box - height="20" - label="Block Terraform" - layout="topleft" - left="10" - name="block_terraform_check" - top="70" - width="80" /> - <check_box - height="20" - label="Block Fly" - layout="topleft" - left="10" - name="block_fly_check" - top="90" - width="80" /> - <check_box - height="20" - label="Allow Damage" - layout="topleft" - left="10" - name="allow_damage_check" - top="110" - width="80" /> - <check_box - height="20" - label="Restrict Pushing" - layout="topleft" - left="10" - name="restrict_pushobject" - top="130" - width="80" /> - <check_box - height="20" - label="Allow Land Resell" - layout="topleft" - left="10" - name="allow_land_resell_check" - top="160" - width="80" /> - <check_box - height="20" - label="Allow Land Join/Divide" - layout="topleft" - left="10" - name="allow_parcel_changes_check" - top="180" - width="80" /> - <check_box - height="20" - label="Block Land Show in Search" - layout="topleft" - left="10" - name="block_parcel_search_check" - tool_tip="Let people see this region and its parcels in search results" - top="200" - width="80" /> - <spinner - follows="left|top" - height="20" - increment="1" - label="Agent Limit" - label_width="97" - layout="topleft" - left="10" - max_val="100" - min_val="1" - name="agent_limit_spin" - top="240" - width="170" /> - <spinner - follows="left|top" - height="20" - increment="0.5" - label="Object Bonus" - label_width="97" - layout="topleft" - left="10" - max_val="10" - min_val="1" - name="object_bonus_spin" - top="260" - width="170" /> - <text - follows="left|top" - height="20" - label="Maturity" - layout="topleft" - left="10" - name="access_text" - top="290" - width="100"> - Rating: - </text> - <combo_box - height="20" - label="Moderate" - layout="topleft" - left_delta="100" - name="access_combo" - top_delta="0" - width="85"> - <combo_box.item - label="Adult" - name="Adult" - value="42" /> - <combo_box.item - label="Moderate" - name="Mature" - value="21" /> - <combo_box.item - label="General" - name="PG" - value="13" /> - </combo_box> - <button - enabled="false" - follows="left|top" - height="20" - label="Apply" - layout="topleft" - left="108" - name="apply_btn" - top="320" - width="100"/> - <button - follows="left|top" - height="20" - label="Teleport Home One Resident..." - layout="topleft" - left="10" - name="kick_btn" - top_pad="10" - width="250" /> - <button - follows="left|top" - height="20" - label="Teleport Home All Residents..." - layout="topleft" - left_delta="0" - name="kick_all_btn" - top_pad="3" - width="250" /> - <button - follows="left|top" - height="20" - label="Send Message To Region..." - layout="topleft" - left_delta="0" - name="im_btn" - top_pad="20" - width="200" /> - <button - follows="left|top" - height="20" - label="Manage Telehub..." - layout="topleft" - left_delta="0" - name="manage_telehub_btn" - top_pad="20" - width="150" > - <button.commit_callback - function="RegionInfo.ManageTelehub" /> - </button> -</panel> diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml index c5c66c04d5..a041c9b229 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -141,6 +141,7 @@ layout="topleft" max_length="65536" name="Script Editor" + text_readonly_color="DkGray" width="487" show_line_numbers="true" word_wrap="true"> @@ -178,4 +179,13 @@ right="487" name="Save_btn" width="81" /> + <button + follows="right|bottom" + height="23" + label="Edit..." + layout="topleft" + top_pad="-23" + right="400" + name="Edit_btn" + width="81" /> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml index 9dff00fa0b..c5e8bf5803 100644 --- a/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml +++ b/indra/newview/skins/default/xui/en/panel_script_limits_region_memory.xml @@ -79,6 +79,8 @@ layout="topleft" left_delta="0" multi_select="true" + sort_column="0" + sort_ascending="true" name="scripts_list" top_delta="16" width="460"> diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml index ab3cc036d5..72b2f5e84f 100644 --- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml +++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml @@ -17,15 +17,18 @@ left="10" name="stack" top_pad="10" + orientation="vertical" width="313"> <layout_panel height="550" layout="topleft" left_delta="0" name="browser_layout" + orientation="vertical" top_delta="0" width="313"> <web_browser + trusted_content="true" border_visible="false" follows="all" height="550" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index bf09836e87..768efc2f3f 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -157,7 +157,7 @@ left="3" name="bottom_panel" width="313"> - <button + <menu_button follows="bottom|left" tool_tip="Show additional options" height="25" diff --git a/indra/newview/skins/default/xui/en/role_actions.xml b/indra/newview/skins/default/xui/en/role_actions.xml index a6036f8b78..89aef57cca 100644 --- a/indra/newview/skins/default/xui/en/role_actions.xml +++ b/indra/newview/skins/default/xui/en/role_actions.xml @@ -108,6 +108,9 @@ <action description="Allow 'Set Home to Here' on group land" longdescription="Members in a Role with this Ability can use World menu > Landmarks > Set Home to Here on a parcel deeded to this group." name="land allow set home" value="28" /> + <action description="Allow 'Event Hosting' on group land" + longdescription="Members in a Role with this Ability can select group owned parcels as venus when hosting an event." + name="land allow host event" value="41" /> </action_set> <action_set description="These Abilities include powers to allow or restrict access to group-owned parcels, including freezing and ejecting Residents." diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml index c1c0f07304..b5839878d5 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml @@ -77,6 +77,7 @@ width="333"> font="SansSerifLargeBold" height="20" left="35" + parse_urls="false" text_color="White" top="15" use_ellipses="true" 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 182bc29e27..6940d1549b 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -118,7 +118,7 @@ height="20" layout="topleft" left_delta="78" - max_length="63" + max_length_bytes="63" name="LabelItemName" top_delta="0" width="210" /> @@ -141,7 +141,7 @@ height="23" layout="topleft" left_delta="78" - max_length="127" + max_length_bytes="127" name="LabelItemDesc" top_delta="-5" width="210" /> @@ -174,8 +174,9 @@ layout="topleft" left_pad="5" name="LabelCreatorName" - top_delta="6" - width="140"> + top_delta="6" + use_ellipses="true" + width="165"> </text> <button follows="top|right" @@ -217,7 +218,8 @@ left_pad="5" name="LabelOwnerName" top_delta="6" - width="140"> + use_ellipses="true" + width="165"> </text> <button follows="top|right" diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml index 843015cb8b..ca63d2df39 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -118,7 +118,7 @@ height="20" layout="topleft" left_delta="78" - max_length="63" + max_length_bytes="63" name="Object Name" top_delta="0" width="225" /> @@ -143,7 +143,7 @@ name="Object Description" select_on_focus="true" left_delta="78" - max_length="127" + max_length_bytes="127" top_delta="-5" width="225"/> <text @@ -167,7 +167,8 @@ left_pad="0" name="Creator Name" top_delta="0" - width="140"> + use_ellipses="true" + width="225"> Erica Linden </text> <text @@ -191,7 +192,8 @@ left_pad="0" name="Owner Name" top_delta="0" - width="140"> + use_ellipses="true" + width="225"> Erica Linden </text> <text diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 6b3fd9ff9e..1ec0d34d9a 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -89,6 +89,7 @@ <string name="TooltipHttpUrl">Click to view this web page</string> <string name="TooltipSLURL">Click to view this location's information</string> <string name="TooltipAgentUrl">Click to view this Resident's profile</string> + <string name="TooltipAgentInspect">Learn more about this Resident</string> <string name="TooltipAgentMute">Click to mute this Resident</string> <string name="TooltipAgentUnmute">Click to unmute this Resident</string> <string name="TooltipAgentIM">Click to IM this Resident</string> @@ -321,6 +322,8 @@ <!-- For land type back from the simulator --> <string name="Estate / Full Region">Estate / Full Region</string> + <string name="Estate / Homestead">Estate / Homestead</string> + <string name="Mainland / Homestead">Mainland / Homestead</string> <string name="Mainland / Full Region">Mainland / Full Region</string> <!-- File load/save dialogs --> @@ -335,7 +338,7 @@ <string name="avi_movie_file">AVI Movie File</string> <string name="xaf_animation_file">XAF Anim File</string> <string name="xml_file">XML File</string> - <string name="dot_raw_file">RAW File</string> + <string name="raw_file">RAW File</string> <string name="compressed_image_files">Compressed Images</string> <string name="load_files">Load Files</string> <string name="choose_the_directory">Choose Directory</string> @@ -1790,6 +1793,43 @@ Returns the media params for a particular face on an object, given the desired l llClearPrimMedia(integer face) Clears (deletes) the media and all params from the given face. </string> +<string name="LSLTipText_llSetLinkPrimitiveParamsFast" translate="false"> +llSetLinkPrimitiveParamsFast(integer linknumber,list rules) +Set primitive parameters for linknumber based on rules. +</string> +<string name="LSLTipText_llGetLinkPrimitiveParams" translate="false"> +llGetLinkPrimitiveParams(integer linknumber,list rules) +Get primitive parameters for linknumber based on rules. +</string> +<string name="LSLTipText_llLinkParticleSystem" translate="false"> +llLinkParticleSystem(integer linknumber,list rules) +Creates a particle system based on rules. Empty list removes particle system from object. +List format is [ rule1, data1, rule2, data2 . . . rulen, datan ]. +</string> +<string name="LSLTipText_llSetLinkTextureAnim" translate="false"> +llSetLinkTextureAnim(integer link, integer mode, integer face, integer sizex, integer sizey, float start, float length, float rate) +Animate the texture on the specified prim's face/faces. +</string> +<string name="LSLTipText_llGetLinkNumberOfSides" translate="false"> +integer llGetLinkNumberOfSides(integer link) +Returns the number of sides of the specified linked prim. +</string> +<string name="LSLTipText_llGetUsername" translate="false"> +string llGetUsername(key id) +Returns the single-word username of an avatar, iff the avatar is in the current region, otherwise the empty string. +</string> +<string name="LSLTipText_llRequestUsername" translate="false"> +key llRequestUsername(key id) +Requests single-word username of an avatar. When data is available the dataserver event will be raised. +</string> +<string name="LSLTipText_llGetDisplayName" translate="false"> +string llGetDisplayName(key id) +Returns the name of an avatar, iff the avatar is in the current simulator, otherwise the empty string. +</string> +<string name="LSLTipText_llRequestDisplayName" translate="false"> +key llRequestDisplayName(key id) +Requests name of an avatar. When data is available the dataserver event will be raised. +</string> <!-- Avatar busy/away mode --> <string name="AvatarSetNotAway">Not Away</string> @@ -2239,8 +2279,7 @@ Clears (deletes) the media and all params from the given face. <string name="InvOfferOwnedBy">owned by</string> <string name="InvOfferOwnedByUnknownUser">owned by an unknown user</string> <string name="InvOfferGaveYou">gave you</string> - <string name="InvOfferYouDecline">You decline</string> - <string name="InvOfferFrom">from</string> + <string name="InvOfferDecline">You decline [DESC] from <nolink>[NAME]</nolink>.</string> <!-- group money --> <string name="GroupMoneyTotal">Total</string> @@ -3046,7 +3085,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. You are the only user in this session. </string> <string name="offline_message"> - [FIRST] [LAST] is offline. + [NAME] is offline. </string> <string name="invite_message"> Click the [BUTTON NAME] button to accept/connect to this voice chat. @@ -3132,17 +3171,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string> <!-- Financial operations strings --> - <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT]</string> + <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT] [REASON].</string> + <string name="paid_you_ldollars_no_reason">[NAME] paid you L$[AMOUNT].</string> <string name="you_paid_ldollars">You paid [NAME] L$[AMOUNT] [REASON].</string> <string name="you_paid_ldollars_no_info">You paid L$[AMOUNT].</string> <string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string> <string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string> + <string name="for item">for [ITEM]</string> <string name="for a parcel of land">for a parcel of land</string> <string name="for a land access pass">for a land access pass</string> <string name="for deeding land">for deeding land</string> <string name="to create a group">to create a group</string> <string name="to join a group">to join a group</string> <string name="to upload">to upload</string> + <string name="to publish a classified ad">to publish a classified ad</string> <string name="giving">Giving L$ [AMOUNT]</string> <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string> diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml index ed8df69bf4..1bb3188cc8 100644 --- a/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/widgets/avatar_list_item.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <avatar_list_item + name_right_pad="5" height="0" layout="topleft" left="0" diff --git a/indra/newview/skins/default/xui/en/widgets/chat_history.xml b/indra/newview/skins/default/xui/en/widgets/chat_history.xml index ef885e8045..c0a948931c 100644 --- a/indra/newview/skins/default/xui/en/widgets/chat_history.xml +++ b/indra/newview/skins/default/xui/en/widgets/chat_history.xml @@ -19,6 +19,7 @@ font="SansSerif"> <more_chat_text mouse_opaque="true" + parse_urls="false" word_wrap="true" /> </chat_history>
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/widgets/check_box.xml b/indra/newview/skins/default/xui/en/widgets/check_box.xml index 726ae803fe..7a60bee338 100644 --- a/indra/newview/skins/default/xui/en/widgets/check_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/check_box.xml @@ -1,9 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<check_box text_enabled_color="LabelTextColor" - text_disabled_color="LabelDisabledColor" - font="SansSerifSmall" +<check_box font="SansSerifSmall" follows="left|top"> - <check_box.label_text name="checkbox label" /> + <check_box.label_text name="checkbox label" + text_color="LabelTextColor" + text_readonly_color="LabelDisabledColor"/> <check_box.check_button name="CheckboxCtrl Button" commit_on_return="false" label="" diff --git a/indra/newview/skins/default/xui/en/widgets/hint_popup.xml b/indra/newview/skins/default/xui/en/widgets/hint_popup.xml new file mode 100644 index 0000000000..92080df154 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/hint_popup.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<hint_popup + name="hint" + background_opaque="true" + background_visible="true" + chrome="true" + layout="topleft" + bg_opaque_image="hint_background" + distance="24" + left_arrow="hint_arrow_left" + up_arrow="hint_arrow_up" + right_arrow="hint_arrow_right" + down_arrow="hint_arrow_down" + lower_left_arrow="hint_arrow_lower_left" + left_arrow_offset="3" + up_arrow_offset="-2" + right_arrow_offset="-3" + down_arrow_offset="5" + fade_in_time="0.2" + fade_out_time="0.3"> +</hint_popup> diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml index 428b2ce03b..8c171c387f 100644 --- a/indra/newview/skins/default/xui/en/widgets/inspector.xml +++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <inspector name="inspector" + max_width="300" bg_opaque_color="DkGray_66" background_visible="true" bg_opaque_image="Inspector_Hover" diff --git a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml index 48bc021e6d..830ea12e41 100644 --- a/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml +++ b/indra/newview/skins/default/xui/en/widgets/scroll_bar.xml @@ -8,18 +8,18 @@ thickness="15"> <up_button image_unselected="ScrollArrow_Up" image_selected="ScrollArrow_Up" - scale_image="true" thickness="15" + scale_image="true" hover_glow_amount="0.35"/> <down_button image_unselected="ScrollArrow_Down" image_selected="ScrollArrow_Down" - scale_image="true" thickness="15" + scale_image="true" hover_glow_amount="0.35"/> <left_button image_unselected="ScrollArrow_Left" image_selected="ScrollArrow_Left" - scale_image="true" thickness="15" + scale_image="true" hover_glow_amount="0.35"/> <right_button image_unselected="ScrollArrow_Right" image_selected="ScrollArrow_Right" - scale_image="true" thickness="15" + scale_image="true" hover_glow_amount="0.35"/> </scroll_bar> diff --git a/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml b/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml index 3878c7a144..a120b1aec8 100644 --- a/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/simple_text_editor.xml @@ -23,7 +23,4 @@ bg_writeable_color="TextBgWriteableColor" bg_selected_color="EmphasisColor" bg_focus_color="TextBgFocusColor"> - <simple_text_editor.border - bevel_style="in" - follows="all" /> </simple_text_editor> diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml index 180120ec89..0f7f50b312 100644 --- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml +++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml @@ -2,5 +2,4 @@ <!-- Core parameters are in simple_text_editor.xml --> <text_editor parse_urls="false" - text_readonly_color="LabelDisabledColor" show_context_menu="true"/> 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 92831cc21c..be5b5d011c 100644 --- a/indra/newview/skins/default/xui/es/floater_about_land.xml +++ b/indra/newview/skins/default/xui/es/floater_about_land.xml @@ -427,7 +427,17 @@ los media: <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/> </panel> <panel label="SONIDO" name="land_audio_panel"> + <text name="MusicURL:"> + URL de música: + </text> <check_box label="Ocultar la URL" name="hide_music_url" tool_tip="Al marcar esta opción se ocultará la URL de la música a quien no esté autorizado a ver la información de esta parcela."/> + <text name="Sound:"> + Sonido: + </text> + <check_box label="Restringir sonidos de objetos y gestos a esta parcela" name="check sound local"/> + <text name="Voice settings:"> + Voz: + </text> <check_box label="Activar la voz" name="parcel_enable_voice_channel"/> <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/> <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/> @@ -460,7 +470,20 @@ los media: <spinner label="Precio en L$:" name="PriceSpin"/> <spinner label="Horas de acceso:" name="HoursSpin"/> <panel name="Allowed_layout_panel"> + <text label="Always Allow" name="AllowedText"> + Residentes autorizados + </text> <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/> + <button label="Añadir" name="add_allowed"/> + <button label="Quitar" label_selected="Quitar" name="remove_allowed"/> + </panel> + <panel name="Banned_layout_panel"> + <text label="Ban" name="BanCheck"> + Residentes con el acceso prohibido + </text> + <name_list name="BannedList" tool_tip="([LISTED] listados de un máx. de [MAX])"/> + <button label="Añadir" name="add_banned"/> + <button label="Quitar" label_selected="Quitar" name="remove_banned"/> </panel> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml index c83dd3ef3e..49fce5d4ec 100644 --- a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml @@ -24,6 +24,10 @@ Escribe parte del nombre de la persona: </text> <button label="Ir" label_selected="Ir" name="Find"/> + <scroll_list name="SearchResults"> + <columns label="Nombre" name="name"/> + <columns label="Nombre de usuario" name="username"/> + </scroll_list> </panel> <panel label="Amigos" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -39,7 +43,10 @@ Metros </text> <button font="SansSerifSmall" label="Actualizar la lista" label_selected="Actualizar la lista" left_delta="1" name="Refresh" width="115"/> - <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + <scroll_list bottom_delta="-169" height="159" name="NearMe"> + <columns label="Nombre" name="name"/> + <columns label="Nombre de usuario" name="username"/> + </scroll_list> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/es/floater_bumps.xml b/indra/newview/skins/default/xui/es/floater_bumps.xml index 6a9c6b1f22..6d4196ca7c 100644 --- a/indra/newview/skins/default/xui/es/floater_bumps.xml +++ b/indra/newview/skins/default/xui/es/floater_bumps.xml @@ -4,19 +4,19 @@ No se han detectado </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] ha chocado con usted + [TIME] [NAME] ha chocado contigo </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] le ha empujado con un script + [TIME] [NAME] te ha empujado con un script </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] ha hecho que un objeto impacte con usted + [TIME] [NAME] te ha golpeado con un script </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] ha hecho que un objeto con script impacte con usted + [TIME] [NAME] te ha golpeado con un objeto con script </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] ha hecho que un objeto material impacte con usted + [TIME] [NAME] te ha golpeado con un objeto fÃsico </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/es/floater_buy_object.xml b/indra/newview/skins/default/xui/es/floater_buy_object.xml index 117d29777f..a774bc6d05 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_object.xml @@ -1,26 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="COMPRAR UNA COPIA DEL OBJETO"> + <floater.string name="title_buy_text"> + Comprar + </floater.string> + <floater.string name="title_buy_copy_text"> + Comprar una copia de + </floater.string> + <floater.string name="no_copy_text"> + (no copiable) + </floater.string> + <floater.string name="no_modify_text"> + (no modificable) + </floater.string> + <floater.string name="no_transfer_text"> + (no transferible) + </floater.string> <text name="contents_text"> Contenidos: </text> <text name="buy_text"> - ¿Comprarlo por [AMOUNT] L$ a [NAME]? + ¿Comprar por [AMOUNT] L$ a: + </text> + <text name="buy_name_text"> + [NAME]? </text> - <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> <button label="Comprar" label_selected="Comprar" name="buy_btn"/> - <string name="title_buy_text"> - Comprar - </string> - <string name="title_buy_copy_text"> - Comprar una copia de - </string> - <string name="no_copy_text"> - (no copiable) - </string> - <string name="no_modify_text"> - (no modificable) - </string> - <string name="no_transfer_text"> - (no transferible) - </string> + <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_device_settings.xml b/indra/newview/skins/default/xui/es/floater_device_settings.xml deleted file mode 100644 index eadf04a417..0000000000 --- a/indra/newview/skins/default/xui/es/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="CONFIGURACIÓN DE LOS DISPOSITIVOS DEL CHAT DE VOZ"/> diff --git a/indra/newview/skins/default/xui/es/floater_display_name.xml b/indra/newview/skins/default/xui/es/floater_display_name.xml new file mode 100644 index 0000000000..f1a31a6776 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_display_name.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Display Name" title="CAMBIAR EL NOMBRE MOSTRADO"> + <text name="info_text"> + El nombre que le has dado a tu avatar se denomina Nombre mostrado. Puedes cambiarlo una vez a la semana. + </text> + <text name="lockout_text"> + No puedes cambiar el nombre mostrado hasta: [TIME]. + </text> + <text name="set_name_label"> + Nuevo nombre mostrado: + </text> + <text name="name_confirm_label"> + Vuelve a escribir tu nombre nuevo para confirmarlo: + </text> + <button label="Guardar" name="save_btn" tool_tip="Guarda tu nombre nuevo"/> + <button label="Reconfigurar" name="reset_btn" tool_tip="Hacer que el nombre mostrado y el nombre de usuario coincidan"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/es/floater_event.xml b/indra/newview/skins/default/xui/es/floater_event.xml index 4bc5221796..d2724bf8b0 100644 --- a/indra/newview/skins/default/xui/es/floater_event.xml +++ b/indra/newview/skins/default/xui/es/floater_event.xml @@ -1,72 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Evento" name="Event" title="DETALLES DEL EVENTO"> - <floater.string name="none"> - ninguno +<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600"> + <floater.string name="loading_text"> + Cargando... </floater.string> - <floater.string name="notify"> - Notificar + <floater.string name="done_text"> + Hecho </floater.string> - <floater.string name="dont_notify"> - No notificar - </floater.string> - <floater.string name="moderate"> - Moderado - </floater.string> - <floater.string name="adult"> - Adulto - </floater.string> - <floater.string name="general"> - General - </floater.string> - <floater.string name="unknown"> - desconocida - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Evento sin nombre... - </text> - <text name="event_category"> - (sin categorÃa) - </text> - <text name="event_runby_label"> - Organizado por: - </text> - <text initial_value="(obteniendo)" name="event_runby"/> - <text name="event_date_label"> - Fecha: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - Duración: - </text> - <text name="event_duration"> - 1 hora - </text> - <text name="event_covercharge_label"> - Entrada: - </text> - <text name="event_cover"> - Gratis - </text> - <text name="event_location_label"> - Localización: - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="Calificación:"/> - <text name="rating_value" value="desconocida"/> - <expandable_text name="event_desc"> - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - </expandable_text> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Crear el evento"/> - <button name="god_delete_event_btn" tool_tip="Borrar el evento"/> - <button label="Notificarme" name="notify_btn"/> - <button label="Teleportar" name="teleport_btn"/> - <button label="Mapa" name="map_btn"/> - </layout_panel> - </layout_stack> + <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/> + <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_im.xml b/indra/newview/skins/default/xui/es/floater_im.xml deleted file mode 100644 index 3850b94fd6..0000000000 --- a/indra/newview/skins/default/xui/es/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Mensaje Instantáneo"> - <string name="only_user_message"> - Eres el único Residente en esta sesión. - </string> - <string name="offline_message"> - [FIRST] [LAST] no está conectado. - </string> - <string name="invite_message"> - Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. - </string> - <string name="muted_message"> - Has ignorado a este Residente. Enviándole un mensaje, automáticamente dejarás de ignorarle. - </string> - <string name="generic_request_error"> - Error al hacer lo solicitado; por favor, inténtelo más tarde. - </string> - <string name="insufficient_perms_error"> - Usted no tiene permisos suficientes. - </string> - <string name="session_does_not_exist_error"> - La sesión ya acabó - </string> - <string name="no_ability_error"> - Usted no tiene esa capacidad. - </string> - <string name="not_a_mod_error"> - Usted no es un moderador de la sesión. - </string> - <string name="muted_error"> - Un moderador del grupo le ha desactivado el chat de texto. - </string> - <string name="add_session_event"> - No es posible añadir Residentes a la sesión de chat con [RECIPIENT]. - </string> - <string name="message_session_event"> - No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT]. - </string> - <string name="removed_from_group"> - Ha sido eliminado del grupo. - </string> - <string name="close_on_no_ability"> - Usted ya no tendrá más la capacidad de estar en la sesión de chat. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/es/floater_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml index c7312e609b..3d9d17fc81 100644 --- a/indra/newview/skins/default/xui/es/floater_im_session.xml +++ b/indra/newview/skins/default/xui/es/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="Panel de control de MI" name="panel_im_control_panel"/> <layout_panel> <line_editor label="A" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/es/floater_incoming_call.xml b/indra/newview/skins/default/xui/es/floater_incoming_call.xml index 88cfc9575a..b5b756abb6 100644 --- a/indra/newview/skins/default/xui/es/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="ESTà LLAMANDO ALGUIEN DESCONOCIDO"> +<floater name="incoming call" title="Llamada entrante"> <floater.string name="lifetime"> 5 </floater.string> diff --git a/indra/newview/skins/default/xui/es/floater_my_friends.xml b/indra/newview/skins/default/xui/es/floater_my_friends.xml deleted file mode 100644 index 07f362560b..0000000000 --- a/indra/newview/skins/default/xui/es/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="CONTACTOS"> - <tab_container name="friends_and_groups"> - <panel label="Amigos" name="friends_panel"/> - <panel label="Grupos" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml deleted file mode 100644 index 9f9902a3a0..0000000000 --- a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Guardar el vestuario"> - <button label="Guardar" label_selected="Guardar" name="Save"/> - <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <text name="Save item as:"> - Guardar lo que llevo puesto -como un vestuario nuevo: - </text> - <line_editor name="name ed"> - [DESC] (nuevo) - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/es/floater_pay.xml b/indra/newview/skins/default/xui/es/floater_pay.xml index d4a4e81310..ad9a43ad71 100644 --- a/indra/newview/skins/default/xui/es/floater_pay.xml +++ b/indra/newview/skins/default/xui/es/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Persona"/> <text left="115" name="payee_name"> - [FIRST] [LAST] + Nombre de prueba demasiado largo para comprobar la función de recorte </text> <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/es/floater_pay_object.xml b/indra/newview/skins/default/xui/es/floater_pay_object.xml index f29745ea9b..4767f4dfa0 100644 --- a/indra/newview/skins/default/xui/es/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/es/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Persona"/> <text left="120" name="payee_name" width="180"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text left="5" name="object_name_label" width="110"> A través del objeto: diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml deleted file mode 100644 index f5b771c6e7..0000000000 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml deleted file mode 100644 index ea955f9727..0000000000 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"> - <text name="trigger_label"> - Chat : - </text> - <text name="key_label"> - Teclado: - </text> - <combo_box label="Ninguno/a" name="modifier_combo"/> - <combo_box label="Ninguno/a" name="key_combo"/> - <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'QuerÃa decir hola' por 'QuerÃa decir qué tal' en cuanto realices el gesto."> - Reemplazar por: - </text> - <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave 'hola' por 'qué tal', se cambiará en el chat 'QuerÃa decir hola' por 'QuerÃa decir qué tal' en cuanto realices el gesto."/> -</floater> diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml deleted file mode 100644 index f5b771c6e7..0000000000 --- a/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/> diff --git a/indra/newview/skins/default/xui/es/floater_statistics.xml b/indra/newview/skins/default/xui/es/floater_statistics.xml deleted file mode 100644 index c9b0a76df0..0000000000 --- a/indra/newview/skins/default/xui/es/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="ESTADÃSTICAS"/> diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml index 9867f1b575..d85b43b7e8 100644 --- a/indra/newview/skins/default/xui/es/floater_tools.xml +++ b/indra/newview/skins/default/xui/es/floater_tools.xml @@ -171,13 +171,13 @@ Creador: </text> <text name="Creator Name"> - Thrax Linden + Dª Esbee Linden (esbee.linden) </text> <text name="Owner:"> Propietario: </text> <text name="Owner Name"> - Thrax Linden + Dª Erica "Moose" Linden (erica.linden) </text> <text name="Group:"> Grupo: @@ -186,10 +186,10 @@ <button label="Configurar..." label_selected="Configurar..." name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/> <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/> <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/> - <text name="label click action" width="180"> + <text name="label click action"> Al tocarlo: </text> - <combo_box name="clickaction" width="192"> + <combo_box name="clickaction"> <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/> <combo_box.item label="Sentarse en el objeto" name="Sitonobject"/> <combo_box.item label="Comprar el objeto" name="Buyobject"/> diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml index 51adeb4dff..f02855123c 100644 --- a/indra/newview/skins/default/xui/es/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mi avatar:"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Colgar" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Colgar" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml deleted file mode 100644 index bf96ed53ce..0000000000 --- a/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title=" "> - <button label="Guardar" label_selected="Guardar" name="Save"/> - <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <text name="Save item as:"> - Guardar el Ãtem en mi inventario como: - </text> - <line_editor name="name ed"> - Nuevo [DESC] - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/es/inspect_avatar.xml b/indra/newview/skins/default/xui/es/inspect_avatar.xml index bff10d9292..119f252db2 100644 --- a/indra/newview/skins/default/xui/es/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/es/inspect_avatar.xml @@ -10,6 +10,11 @@ <string name="Details"> [SL_PROFILE] </string> + <text name="user_name_small" value="Grumpity ProductEngine con un nombre demasiado largo"/> + <text name="user_slid" value="james.linden"/> + <text name="user_details"> + Ésta es mi descripción de Second Life que, por cierto, me encanta. Pero, por lo que sea, me he enrollado más de la cuenta y la descripción es larguÃsima. + </text> <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/> <button label="Añadir como amigo" name="add_friend_btn"/> <button label="MI" name="im_btn"/> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 4ad631ac10..649c0c2043 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -85,6 +85,7 @@ <menu_item_call label="Coger una copia" name="Take Copy"/> <menu_item_call label="Guardar una copia en mi inventario" name="Save Object Back to My Inventory"/> <menu_item_call label="Guardar una copia del objeto en los contenidos de donde salió" name="Save Object Back to Object Contents"/> + <menu_item_call label="Devolver objeto" name="Return Object back to Owner"/> </menu> <menu label="Scripts" name="Scripts"> <menu_item_call label="Recompilar los scripts (Mono)" name="Mono"/> @@ -98,6 +99,7 @@ <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/> <menu_item_check label="Seleccionar sólo los objetos movibles" name="Select Only Movable Objects"/> <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/> + <menu_item_check label="Mostrar detalles de la selección" name="Show Selection Outlines"/> <menu_item_check label="Al seleccionar, mostrar lo oculto" name="Show Hidden Selection"/> <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/> <menu_item_check label="Mostrar el rayo indicador" name="Show Selection Beam"/> @@ -118,6 +120,7 @@ <menu_item_call label="Denunciar una infracción" name="Report Abuse"/> <menu_item_call label="Informar de un fallo" name="Report Bug"/> <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/> + <menu_item_check label="Permitir consejos" name="Enable Hints"/> </menu> <menu label="Avanzado" name="Advanced"> <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> @@ -264,7 +267,7 @@ <menu_item_call label="Web Browser Test" name="Web Browser Test"/> <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/> <menu_item_call label="Memory Stats" name="Memory Stats"/> - <menu_item_check label="Double-Click Auto-Pilot" name="Double-Click Auto-Pilot"/> + <menu_item_check label="Haz doble clic en Piloto automático" name="Double-ClickAuto-Pilot"/> <menu_item_check label="Teleportar mediante doble clic" name="DoubleClick Teleport"/> <menu_item_check label="Debug Clicks" name="Debug Clicks"/> <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> @@ -276,6 +279,7 @@ <menu_item_call label="Save to XML" name="Save to XML"/> <menu_item_check label="Show XUI Names" name="Show XUI Names"/> <menu_item_call label="Send Test IMs" name="Send Test IMs"/> + <menu_item_call label="Eliminar registros de nombres en caché" name="Flush Names Caches"/> </menu> <menu label="Avatar" name="Character"> <menu label="Grab Baked Texture" name="Grab Baked Texture"> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 91d47061c4..6c5fe6a9eb 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -110,7 +110,7 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente. </notification> <notification name="GrantModifyRights"> Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso. -¿Quieres conceder permisos de modificación a [FIRST_NAME] [LAST_NAME]? +¿Quieres conceder permisos de modificación a [NAME]? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="GrantModifyRightsMultiple"> @@ -119,7 +119,7 @@ Asegúrate de que tu conexión a Internet está funcionando adecuadamente. <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="RevokeModifyRights"> - ¿Quieres revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]? + ¿Quieres retirar los permisos de modificación a [NAME]? <usetemplate name="okcancelbuttons" notext="No" yestext="SÃ"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -314,17 +314,17 @@ Se ha superado el lÃmite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quÃt No puedes vestirte este Ãtem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto. </notification> <notification name="MustHaveAccountToLogIn"> - ¡Vaya! Algo se quedó en blanco. -Debes escribir tanto el nombre como el apellido de tu avatar, los dos. + Lo sentimos. Se ha quedado algún espacio en blanco. +Tienes que volver a introducir el nombre de usuario de tu avatar. -Necesitas una cuenta para entrar en [SECOND_LIFE]. ¿Quieres crear una ahora? +Necesitas una cuenta para acceder a [SECOND_LIFE]. ¿Te gustarÃa crear una ahora? <url name="url"> https://join.secondlife.com/index.php?lang=es-ES </url> <usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/> </notification> <notification name="InvalidCredentialFormat"> - Escribe el nombre y apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez. + Escribe el nombre de usuario o el nombre y el apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez. </notification> <notification name="AddClassified"> Los anuncios clasificados aparecen durante una semana en la sección 'Clasificados' de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com]. @@ -921,12 +921,6 @@ Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el Ãte No se ha podido comprar terreno para el grupo: no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente. </notification> - <notification label="Añadir como amigo" name="AddFriend"> - Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado. - -¿Ofrecer a [NAME] que sea tu amigo? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> - </notification> <notification label="Añadir como amigo" name="AddFriendWithMessage"> Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado. @@ -970,7 +964,7 @@ no tienes el permiso de comprar terreno para el grupo que tienes activado actual </form> </notification> <notification name="RemoveFromFriends"> - ¿Quieres quitar a [FIRST_NAME] [LAST_NAME] de tu lista de amigos? + ¿Quieres eliminar a [NAME] de tu lista de amigos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="RemoveMultipleFromFriends"> @@ -1093,12 +1087,11 @@ Si se vende una parcela transferida, el precio de venta se dividirá a partes ig <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DeedLandToGroupWithContribution"> - Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno. -La tranferencia incluirá, a la vez, una contribucÃon de terreno al grupo de '[FIRST_NAME] [LAST_NAME]'. -El precio de compra de la parcela no se reembolsa al propietario. -Si se vende una parcela transferida, el precio de venta se dividirá a partes iguales entre los miembros del grupo. + Al transferir esta parcela, el grupo deberá poseer y mantener el número suficiente de créditos de uso de terreno. +El traspaso incluirá una contribución simultánea de terreno al grupo de "[NAME]". +El precio de compra del terreno no se le devolverá al propietario. Si se vende una parcela transferida, el precio de venta se dividirá en partes iguales entre los miembros del grupo. -¿Transferir estos [AREA] m² de terreno al grupo '[GROUP_NAME]'? +¿Transferir este terreno de [AREA] m² al grupo '[GROUP_NAME]'? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DisplaySetToSafe"> @@ -1419,7 +1412,7 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar </notification> <notification name="BusyModeSet"> Pasar al modo ocupado. -Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera. +Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera. <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/> </notification> <notification name="JoinedTooManyGroupsMember"> @@ -1471,6 +1464,46 @@ Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuest <button name="Cancel" text="Cancelar"/> </form> </notification> + <notification name="SetDisplayNameSuccess"> + ¡Hola, [DISPLAY_NAME]! + +Al igual que en la vida real, normalmente se tarda algún tiempo en aprender nombres nuevos. Te recomendamos que esperes varios dÃas antes de [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] en objetos, scripts, búsquedas, etc. + </notification> + <notification name="SetDisplayNameBlocked"> + Lo sentimos. No puedes cambiar tu nombre mostrado. Si crees que se trata de un error, ponte en contacto con soporte. + </notification> + <notification name="SetDisplayNameFailedLength"> + Lo sentimos. El nombre es demasiado largo. Los nombres mostrados pueden tener un máximo de [LENGTH] caracteres. + +Prueba con un nombre más corto. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Lo sentimos. No hemos podido configurar tu nombre mostrado. Vuelve a intentarlo más tarde. + </notification> + <notification name="SetDisplayNameMismatch"> + Los nombres mostrados introducidos no coinciden. Vuelve a introducirlos. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Lo sentimos. Tendrás que esperar para poder cambiar tu nombre mostrado. + +Consulta http://wiki.secondlife.com/wiki/Setting_your_display_name + +Vuelve a intentarlo más tarde. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Lo sentimos. No he mos podido configurar el nombre que has solicitado porque contiene una palabra prohibida. + + Prueba con un nombre distinto. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + El nombre mostrado que deseas configurar contiene caracteres no válidos. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Tu nombre mostrado debe contener letras y no debe incluir signos de puntuación. + </notification> + <notification name="DisplayNameUpdate"> + A [OLD_NAME] ([SLID]) se le conoce ahora como [NEW_NAME]. + </notification> <notification name="OfferTeleport"> ¿Ofrecer teleporte a tu posición con este mensaje? <form name="form"> @@ -1890,7 +1923,7 @@ Linden Lab </form> </notification> <notification name="ConfirmDeleteProtectedCategory"> - La carpeta '[FOLDERNAME]' pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla? + La carpeta '[FOLDERNAME]' pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla? <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> <notification name="ConfirmEmptyTrash"> @@ -2038,10 +2071,10 @@ PublÃcala en una página web para que otros puedan acceder fácilmente a esta p Asunto: [SUBJECT], Mensaje: [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] está conectado + [NAME] está conectado </notification> <notification name="FriendOffline"> - [FIRST] [LAST] no está conectado + [NAME] está desconectado </notification> <notification name="AddSelfFriend"> Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo. @@ -2108,9 +2141,6 @@ Esto puede influir en tu contraseña. <notification name="CannotRemoveProtectedCategories"> No puedes quitar categorÃas que están protegidas. </notification> - <notification name="OfferedCard"> - Has ofrecido una tarjeta de visita a [FIRST] [LAST] - </notification> <notification name="UnableToBuyWhileDownloading"> No se puede comprar un objeto mientras se descargan los datos. Por favor, vuelve a intentarlo. @@ -2181,7 +2211,10 @@ Inténtalo seleccionando un trozo más pequeño de terreno. <notification name="SystemMessage"> [MESSAGE] </notification> - <notification name="PaymentRecived"> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> [MESSAGE] </notification> <notification name="EventNotification"> @@ -2190,8 +2223,7 @@ Inténtalo seleccionando un trozo más pequeño de terreno. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teleportar"/> - <button name="Description" text="Descripción"/> + <button name="Details" text="Detalles"/> <button name="Cancel" text="Cancelar"/> </form> </notification> @@ -2227,7 +2259,7 @@ Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo pro Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada. </notification> <notification name="OtherObjectsReturned"> - Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela propiedad de [FIRST] [LAST]. + Se han devuelto a su inventario los objetos en la parcela de terreno seleccionada propiedad de [NAME]. </notification> <notification name="OtherObjectsReturned2"> Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de '[NAME]'. @@ -2351,7 +2383,7 @@ Por favor, vuelve a intentarlo en unos momentos. No se ha podido encontrar una parcela válida. </notification> <notification name="ObjectGiveItem"> - Un objeto de nombre [OBJECTFROMNAME], propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]: + Un objeto de nombre <nolink>[OBJECTFROMNAME]</nolink>, propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Guardar"/> @@ -2416,9 +2448,9 @@ Por favor, vuelve a intentarlo en unos momentos. Has ofrecido amistad a [TO_NAME] </notification> <notification name="OfferFriendshipNoMessage"> - [NAME] te está ofreciendo amistad. + [NAME_SLURL] está ofreciendo amistad. -(Por defecto, podrás ver si están conectados los demás). +(De manera predeterminada, podrás ver si están conectados los demás.) <form name="form"> <button name="Accept" text="Aceptar"/> <button name="Decline" text="Rehusar"/> @@ -2437,7 +2469,7 @@ Por favor, vuelve a intentarlo en unos momentos. Rehusado el ofrecimiento de amistad. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] te está ofreciendo su tarjeta de visita. + [NAME] te está ofreciendo su tarjeta de visita. Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI. <form name="form"> <button name="Accept" text="Aceptar"/> @@ -2449,15 +2481,15 @@ Esto añadirá un marcador en tu inventario para que puedas enviarle rápidament Si permaneces en esta región serás desconectado. </notification> <notification name="RegionRestartSeconds"> - Esta región se reiniciará en [SECONDS] segundos. + Esta región se reiniciará en [SECONDS] segundos. Si permaneces en esta región serás desconectado. </notification> <notification name="LoadWebPage"> - ¿Cargar la página web [URL]? + ¿Cargar página web [URL]? [MESSAGE] -Del objeto: [OBJECTNAME]; propiedad de: [NAME]? +Del objeto: <nolink>[OBJECTNAME]</nolink>, propietario: [NAME]? <form name="form"> <button name="Gotopage" text="Cargar"/> <button name="Cancel" text="Cancelar"/> @@ -2473,10 +2505,10 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]? El Ãtem que quieres vestirte tiene una caracterÃstica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este Ãtem. </notification> <notification name="ScriptQuestion"> - '[OBJECTNAME]', un objeto propiedad de '[NAME]', querrÃa: + <nolink>[OBJECTNAME]</nolink>, un objeto propiedad de '[NAME]', quiere: [QUESTIONS] -¿Estás de acuerdo? +¿Es correcto? <form name="form"> <button name="Yes" text="SÃ"/> <button name="No" text="No"/> @@ -2484,7 +2516,7 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]? </form> </notification> <notification name="ScriptQuestionCaution"> - Un objeto de nombre '[OBJECTNAME]', propiedad de '[NAME]', quiere: + Un objeto de nombre '<nolink>[OBJECTNAME]</nolink>', propiedad de '[NAME]', quiere: [QUESTIONS] Si no confias en este objeto y en su creador, deberÃas rehusar esta petición. @@ -2497,14 +2529,14 @@ Si no confias en este objeto y en su creador, deberÃas rehusar esta petición. </form> </notification> <notification name="ScriptDialog"> - '[TITLE]' de [FIRST] [LAST] + '<nolink>[TITLE]</nolink>' de [NAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorar"/> </form> </notification> <notification name="ScriptDialogGroup"> - '[TITLE]' de [GROUPNAME]' + '<nolink>[TITLE]</nolink>' de [GROUPNAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorar"/> @@ -2513,7 +2545,7 @@ Si no confias en este objeto y en su creador, deberÃas rehusar esta petición. <notification name="BuyLindenDollarSuccess"> ¡Gracias por tu pago! -Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$. +Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$. Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control] </notification> @@ -2540,13 +2572,13 @@ Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar a </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo. + [NAME] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] ha dejado automáticamente de estar ignorado al darle dinero. + [NAME] ha dejado automáticamente de estar ignorado al darle dinero. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] ha dejado automáticamente de estar ignorado al ofrecerle algo del inventario. + [NAME] ha dejado automáticamente de estar ignorado al ofrecerle inventario. </notification> <notification name="VoiceInviteGroup"> [NAME] ha empezado un chat de voz con el grupo [GROUP]. @@ -2772,6 +2804,37 @@ Si lo haces, todos los residentes que se unan posteriormente a la llamada tambià ¿Deseas silenciar a todos? <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> + <notification label="Chat" name="HintChat"> + Para unirte a la conversación, escribe en el campo de chat que aparece a continuación. + </notification> + <notification label="Levantarme" name="HintSit"> + Para levantarte y salir de la posición de sentado, haz clic en el botón Levantarme. + </notification> + <notification label="Explora el mundo" name="HintDestinationGuide"> + La GuÃa de destinos contiene miles de nuevos lugares por descubrir. Selecciona una ubicación y elige Teleportarme para iniciar la exploración. + </notification> + <notification label="Panel lateral" name="HintSidePanel"> + Accede de manera rápida a tu inventario, asà como a tu ropa, los perfiles y el resto de la información disponible en el panel lateral. + </notification> + <notification label="Mover" name="HintMove"> + Si deseas caminar o correr, abre el panel Mover y utiliza las flechas de dirección para navegar. También puedes utilizar las flechas de dirección del teclado. + </notification> + <notification label="Nombre mostrado" name="HintDisplayName"> + Configura y personaliza aquà tu nombre mostrado. Esto se añadirá a tu nombre de usuario personal, que no puedes modificar. Puedes cambiar la manera en que ves los nombres de otras personas en tus preferencias. + </notification> + <notification label="Inventario" name="HintInventory"> + Accede a tu inventario para buscar Ãtems. Los Ãtems más recientes se pueden encontrar fácilmente en la pestaña Recientes. + </notification> + <notification label="¡Tienes dólares Linden!" name="HintLindenDollar"> + Éste es tu saldo actual de L$. Haz clic en Comprar L$ para comprar más dólares Linden. + </notification> + <notification name="PopupAttempt"> + Se ha impedido que se abriera una ventana emergente. + <form name="form"> + <ignore name="ignore" text="Permitir todas las ventanas emergentes"/> + <button name="open" text="Abrir ventana emergente"/> + </form> + </notification> <global name="UnsupportedCPU"> - La velocidad de tu CPU no cumple los requerimientos mÃnimos. </global> diff --git a/indra/newview/skins/default/xui/es/panel_audio_device.xml b/indra/newview/skins/default/xui/es/panel_audio_device.xml deleted file mode 100644 index d20a0af4fb..0000000000 --- a/indra/newview/skins/default/xui/es/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="device_settings"> - <text name="Audio Devices"> - Dispositivos de sonido - </text> - <text name="Input device (microphone):"> - Dispositivo de entrada (micrófono): - </text> - <text name="Output device (speakers):"> - Dispositivo de salida (altavoces): - </text> - <text name="Input level:"> - Volumen de entrada - </text> - <text_editor name="voice_intro_text1"> - Ajuste el deslizable para controlar el volumen con el que usted le sonará a otros residentes. Para probar el volumen de entrada, basta con que hable al micrófono. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Cambie el volumen usando este deslizable"/> - <text name="wait_text"> - Por favor, espere - </text> - <string name="default_text"> - Por defecto - </string> -</panel> diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml index 8da8a9771b..56d03dccc2 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml @@ -22,6 +22,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="data_panel"> + <text name="display_name_label" value="Nombre mostrado:"/> + <text name="solo_username_label" value="Nombre de usuario:"/> + <button name="set_name" tool_tip="Configurar nombre mostrado"/> + <text name="solo_user_name" value="Hamilton Hitchings"/> + <text name="user_name" value="Hamilton Hitchings"/> + <text name="user_name_small" value="Hamilton Hitchings"/> + <text name="user_label" value="Nombre de usuario:"/> + <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa para elegir una imagen"/> </panel> @@ -38,7 +46,7 @@ <text name="my_account_link" value="[[URL] Ir a mi Panel de Control]"/> <text name="title_partner_text" value="Mi compañero/a:"/> <panel name="partner_data_panel"> - <name_box initial_value="(obteniendo)" name="partner_text"/> + <text initial_value="(obteniendo)" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] Editar]"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_group_land_money.xml b/indra/newview/skins/default/xui/es/panel_group_land_money.xml index f307126b03..3afb0f5665 100644 --- a/indra/newview/skins/default/xui/es/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/es/panel_group_land_money.xml @@ -24,6 +24,7 @@ <scroll_list.columns label="Región" name="location"/> <scroll_list.columns label="Tipo" name="type"/> <scroll_list.columns label="Ãrea" name="area"/> + <scroll_list.columns label="Oculto" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Contribución total: diff --git a/indra/newview/skins/default/xui/es/panel_groups.xml b/indra/newview/skins/default/xui/es/panel_groups.xml deleted file mode 100644 index 232de85522..0000000000 --- a/indra/newview/skins/default/xui/es/panel_groups.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="groups"> - <scroll_list bottom="50" name="group list"/> - <text bottom="16" height="32" name="groupdesc" width="268"> - El grupo que tiene activado actualmente se -muestra en negrilla. - </text> - <text bottom="3" name="groupcount" width="268"> - Pertenece a [COUNT] grupo/s (de un máximo de [MAX]). - </text> - <button label="MI/Llamar" name="IM" tool_tip="Abrir una sesión de mensajes instantáneos"/> - <button label="Información" name="Info"/> - <button label="Activar" name="Activate"/> - <button label="Abandonar" name="Leave"/> - <button label="Crear..." name="Create"/> - <button label="Buscar..." name="Search..."/> -</panel> diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml index 4b45a6f7b8..49d4881737 100644 --- a/indra/newview/skins/default/xui/es/panel_login.xml +++ b/indra/newview/skins/default/xui/es/panel_login.xml @@ -11,7 +11,7 @@ <text name="username_text"> Nombre de usuario: </text> - <line_editor label="Nombre de usuario" name="username_edit" tool_tip="Nombre de usuario de [SECOND_LIFE]"/> + <line_editor label="bobsmith12 o Steller Sunshine" name="username_edit" tool_tip="El nombre de usuario que elegiste al registrarte, como bobsmith12 o Steller Sunshine"/> <text name="password_text"> Contraseña: </text> @@ -30,7 +30,7 @@ Registrarme </text> <text name="forgot_password_text"> - ¿Olvidaste el nombre o la contraseña? + ¿Olvidaste el nombre de usuario o la contraseña? </text> <text name="login_help"> ¿Necesitas ayuda para conectarte? diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml deleted file mode 100644 index 986c109c41..0000000000 --- a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name"> - CHAT - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/es/panel_online_status.xml b/indra/newview/skins/default/xui/es/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/es/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml index 6fe7895d45..524ba2253b 100644 --- a/indra/newview/skins/default/xui/es/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml @@ -76,7 +76,7 @@ <text name="region_rating_label" value="Calificación:"/> <text name="region_rating" value="Adulto"/> <text name="region_owner_label" value="Propietario:"/> - <text name="region_owner" value="moose Van Moose"/> + <text name="region_owner" value="Moose Van Moose: nombre demasiado largo"/> <text name="region_group_label" value="Grupo:"/> <text name="region_group"> The Mighty Moose of mooseville soundvillemoose @@ -89,6 +89,7 @@ <text name="estate_name_label" value="Estado:"/> <text name="estate_rating_label" value="Calificación:"/> <text name="estate_owner_label" value="Propietario:"/> + <text name="estate_owner" value="Comprobación de la longitud del nombre de un propietario con nombre largo"/> <text name="covenant_label" value="Contrato:"/> </panel> </accordion_tab> 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 c609cb74ba..5b8cb77173 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -44,9 +44,10 @@ <radio_item label="On" name="radio2" value="1"/> <radio_item label="Mostrar brevemente" name="radio3" value="2"/> </radio_group> - <check_box label="Ver yo mi nombre" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Etiquetas de los avatares en pequeño" name="small_avatar_names_checkbox"/> - <check_box label="Mostrar las etiquetas de grupo" name="show_all_title_checkbox1"/> + <check_box label="Mi nombre" name="show_my_name_checkbox1"/> + <check_box label="Nombre de usuario" name="show_slids" tool_tip="Mostrar el nombre de usuario, como bobsmith123"/> + <check_box label="TÃtulos de grupos" name="show_all_title_checkbox1" tool_tip="Mostrar tÃtulos de grupos, como Jefe o Miembro"/> + <check_box label="Realzar amigos" name="show_friends" tool_tip="Realzar las etiquetas de los nombres de tus amigos"/> <text name="effects_color_textbox"> Mis efectos: </text> @@ -61,6 +62,7 @@ <combo_box.item label="30 minutos" name="item3"/> <combo_box.item label="nunca" name="item4"/> </combo_box> + <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/> <text name="text_box3"> Respuesta cuando estoy en modo ocupado: </text> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml index 88f5ba42b5..100951a51e 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Configurar" name="Input panel"> - <button bottom_delta="-40" label="Otros dispositivos" name="joystick_setup_button"/> <text name="Mouselook:"> Vista subjetiva: </text> @@ -37,10 +36,11 @@ <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="1"/> <radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value=""/> </radio_group> - <check_box label="Activar plugins" name="browser_plugins_enabled"/> - <check_box label="Aceptar las 'cookies'" name="cookies_enabled"/> - <check_box label="Activar Javascript" name="browser_javascript_enabled"/> - <check_box label="Activar web proxy" name="web_proxy_enabled"/> + <check_box initial_value="true" label="Activar plugins" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Aceptar las 'cookies'" name="cookies_enabled"/> + <check_box initial_value="true" label="Activar Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="falso" label="Permitir ventanas emergentes de navegadores de medios" name="media_popup_enabled"/> + <check_box initial_value="false" label="Activar web proxy" name="web_proxy_enabled"/> <text name="Proxy location"> Localización del proxy: </text> diff --git a/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml index 174922e28e..90b9e475e7 100644 --- a/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml @@ -13,9 +13,9 @@ 50 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="Los media se están cargando"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml index b556346051..a11fc31607 100644 --- a/indra/newview/skins/default/xui/es/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/es/panel_profile_view.xml @@ -6,8 +6,14 @@ <string name="status_offline"> Desconectado/a </string> - <text_editor name="user_name" value="(Cargando...)"/> + <text name="display_name_label" value="Nombre mostrado:"/> + <text name="solo_username_label" value="Nombre de usuario:"/> <text name="status" value="Conectado/a"/> + <text name="user_name_small" value="Jack, ¿has visto esto? Es un nombre larguÃsimo."/> + <text name="user_name" value="Jack Linden"/> + <button name="copy_to_clipboard" tool_tip="Copiar al portapapeles"/> + <text name="user_label" value="Nombre de usuario:"/> + <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PERFIL" name="panel_profile"/> <panel label="DESTACADOS" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/es/panel_region_general_layout.xml b/indra/newview/skins/default/xui/es/panel_region_general_layout.xml deleted file mode 100644 index 9ff88e2f79..0000000000 --- a/indra/newview/skins/default/xui/es/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Región" name="General"> - <text name="region_text_lbl"> - Región: - </text> - <text name="region_text"> - desconocida - </text> - <text name="version_channel_text_lbl"> - Versión: - </text> - <text name="version_channel_text"> - desconocida - </text> - <text name="region_type_lbl"> - Tipo: - </text> - <text name="region_type"> - desconocido - </text> - <check_box label="No permitir modificar el terreno" name="block_terraform_check"/> - <check_box label="Prohibir volar" name="block_fly_check"/> - <check_box label="Permitir el daño" name="allow_damage_check"/> - <check_box label="Impedir los 'empujones'" name="restrict_pushobject"/> - <check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/> - <check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/> - <check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permite que la gente vea esta región y sus parcelas en los resultados de la búsqueda"/> - <spinner label="Nº máximo de avatares" name="agent_limit_spin"/> - <spinner label="Plus de objetos" name="object_bonus_spin"/> - <text label="Calificación" name="access_text"> - Calificación: - </text> - <combo_box label="Moderado" name="access_combo"> - <combo_box.item label="Adulto" name="Adult"/> - <combo_box.item label="Moderado" name="Mature"/> - <combo_box.item label="General" name="PG"/> - </combo_box> - <button label="Aplicar" name="apply_btn"/> - <button label="Teleportar a su Base a un Residente..." name="kick_btn"/> - <button label="Teleportar a sus Bases a todos los Residentes..." name="kick_all_btn"/> - <button label="Enviar un mensaje a toda la región..." name="im_btn"/> - <button label="Administrar el Punto de Teleporte..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/es/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml index 14df3d67ca..660293b02c 100644 --- a/indra/newview/skins/default/xui/es/role_actions.xml +++ b/indra/newview/skins/default/xui/es/role_actions.xml @@ -39,6 +39,7 @@ <action description="Permitir siempre 'Crear objetos'" longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." name="land allow create" value="25"/> <action description="Permitir siempre 'Crear hitos'" longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno > pestaña Opciones." name="land allow landmark" value="26"/> <action description="Permitir 'Fijar mi Base aquÃ' en el terreno del grupo" longdescription="Los miembros que tengan un rol con esta capacidad pueden usar el menú Mundo > Hitos > Fijar aquà mi Base en una parcela transferida al grupo." name="land allow set home" value="28"/> + <action description="Permitir "Organización de eventos" en un terreno de grupo" longdescription="Los miembros con un rol que tenga esta capacidad pueden seleccionar parcelas propiedad de un grupo como sede de la organización de eventos." name="land allow host event" value="41"/> </action_set> <action_set description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes." name="Parcel Access"> <action description="Administrar las listas de acceso a la parcela" longdescription="Administre las listas de acceso a la parcela en Acerca del terreno > pestaña Acceso." name="land manage allowed" value="29"/> @@ -64,10 +65,6 @@ <action description="Enviar aviso" longdescription="Los miembros con un rol que tenga esta capacidad pueden enviar avisos a través de la sección Grupo > Avisos." name="notices send" value="42"/> <action description="Recibir avisos nuevos y ver los anteriores" longdescription="Los miembros con un rol que tenga esta capacidad pueden recibir Avisos y ver los ya enviados en la sección Grupo > Avisos." name="notices receive" value="43"/> </action_set> - <action_set description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones." name="Proposals"> - <action description="Hacer una propuesta" longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo > pestaña Propuestas." name="proposal start" value="44"/> - <action description="Votar en propuestas" longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo > pestaña Propuestas." name="proposal vote" value="45"/> - </action_set> <action_set description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo." name="Chat"> <action description="Abrir chat de grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz." name="join group chat" value="16"/> <action description="Abrir chat de voz del grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad 'Abrir chat de grupo'." name="join voice chat" value="27"/> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index ac12b700ee..0be827f5f7 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -194,6 +194,9 @@ <string name="TooltipAgentUrl"> Pulsa para ver el perfil del Residente </string> + <string name="TooltipAgentInspect"> + Obtén más información acerca de este residente. + </string> <string name="TooltipAgentMute"> Pulsa para silenciar a este Residente </string> @@ -741,6 +744,12 @@ <string name="Estate / Full Region"> Estado /Región completa </string> + <string name="Estate / Homestead"> + Estado / Homestead + </string> + <string name="Mainland / Homestead"> + Continente / Homestead + </string> <string name="Mainland / Full Region"> Continente / Región completa </string> @@ -777,7 +786,7 @@ <string name="xml_file"> Archivo XML </string> - <string name="dot_raw_file"> + <string name="raw_file"> Archivo RAW </string> <string name="compressed_image_files"> @@ -3472,7 +3481,7 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. Usted es el único usuario en esta sesión. </string> <string name="offline_message"> - [FIRST] [LAST] no está conectado. + [NAME] está desconectado. </string> <string name="invite_message"> Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz. @@ -3541,7 +3550,10 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. http://secondlife.com/landing/voicemorphing </string> <string name="paid_you_ldollars"> - [NAME] te ha pagado [AMOUNT] L$ + [NAME] te ha pagado [AMOUNT] L$ [REASON]. + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] te ha pagado [AMOUNT] L$. </string> <string name="you_paid_ldollars"> Has pagado [AMOUNT] L$ a [NAME] por [REASON]. @@ -3555,6 +3567,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="you_paid_ldollars_no_name"> Has pagado [AMOUNT] L$ por [REASON]. </string> + <string name="for item"> + para [ITEM] + </string> <string name="for a parcel of land"> para una parcela de terreno </string> @@ -3573,6 +3588,9 @@ Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE]. <string name="to upload"> to upload </string> + <string name="to publish a classified ad"> + para publicar un anuncio clasificado + </string> <string name="giving"> Dando [AMOUNT] L$ </string> diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml index 65bb683e4c..74de4ddb1c 100644 --- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml @@ -24,6 +24,10 @@ Saisissez une partie du nom du résident : </text> <button label="OK" label_selected="OK" name="Find"/> + <scroll_list name="SearchResults"> + <columns label="Nom" name="name"/> + <columns label="Nom d'utilisateur" name="username"/> + </scroll_list> </panel> <panel label="Amis" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -39,7 +43,10 @@ mètres </text> <button font="SansSerifSmall" label="Rafraîchir la liste" label_selected="Rafraîchir la liste" left_delta="10" name="Refresh" width="105"/> - <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + <scroll_list bottom_delta="-169" height="159" name="NearMe"> + <columns label="Nom" name="name"/> + <columns label="Nom d'utilisateur" name="username"/> + </scroll_list> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_bumps.xml b/indra/newview/skins/default/xui/fr/floater_bumps.xml index 34b33bbd6b..32714ea09c 100644 --- a/indra/newview/skins/default/xui/fr/floater_bumps.xml +++ b/indra/newview/skins/default/xui/fr/floater_bumps.xml @@ -4,19 +4,19 @@ Aucun détecté </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] est entré en collision avec vous + [TIME] [NAME] est entré en collision avec vous. </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] vous a bousculé avec un script + [TIME] [NAME] vous a bousculé avec un script. </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] vous a donné un coup avec un objet + [TIME] [NAME] vous a donné un coup avec un objet. </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] vous a donné un coup avec un objet scripté + [TIME] [NAME] vous a donné un coup avec un objet scripté. </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] vous a donné un coup avec un objet physique + [TIME] [NAME] vous a donné un coup avec un objet physique. </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/fr/floater_buy_object.xml b/indra/newview/skins/default/xui/fr/floater_buy_object.xml index bd29f27cbc..519e741a25 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_object.xml @@ -1,26 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="ACHETER UNE COPIE DE L'OBJET"> + <floater.string name="title_buy_text"> + Acheter + </floater.string> + <floater.string name="title_buy_copy_text"> + Acheter une copie + </floater.string> + <floater.string name="no_copy_text"> + (pas de copie) + </floater.string> + <floater.string name="no_modify_text"> + (pas de modification) + </floater.string> + <floater.string name="no_transfer_text"> + (pas de transfert) + </floater.string> <text name="contents_text"> Contient : </text> <text name="buy_text"> - Acheter pour [AMOUNT] L$ à [NAME] ? + Acheter pour [AMOUNT] L$ à  : + </text> + <text name="buy_name_text"> + [NAME] ? </text> - <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> <button label="Acheter" label_selected="Acheter" name="buy_btn"/> - <string name="title_buy_text"> - Acheter - </string> - <string name="title_buy_copy_text"> - Acheter une copie - </string> - <string name="no_copy_text"> - (pas de copie) - </string> - <string name="no_modify_text"> - (pas de modification) - </string> - <string name="no_transfer_text"> - (pas de transfert) - </string> + <button label="Annuler" label_selected="Annuler" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_device_settings.xml b/indra/newview/skins/default/xui/fr/floater_device_settings.xml deleted file mode 100644 index f5994cb604..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="PARAMÈTRES DU MATÉRIEL UTILISÉ POUR LE CHAT VOCAL"/> diff --git a/indra/newview/skins/default/xui/fr/floater_display_name.xml b/indra/newview/skins/default/xui/fr/floater_display_name.xml new file mode 100644 index 0000000000..eebe7abf2c --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_display_name.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Display Name" title="MODIFICATION DU NOM D'AFFICHAGE"> + <text name="info_text"> + Le nom que vous donnez à votre avatar s'appelle le nom d'affichage. Vous pouvez en changer une fois par semaine. + </text> + <text name="lockout_text"> + Vous ne pouvez pas changer de nom d'affichage jusqu'au : [TIME]. + </text> + <text name="set_name_label"> + Nouveau nom d'affichage : + </text> + <text name="name_confirm_label"> + Saisir à nouveau le nom pour confirmer : + </text> + <button label="Enregistrer" name="save_btn" tool_tip="Enregistrer le nouveau nom d'affichage."/> + <button label="Réinitialiser" name="reset_btn" tool_tip="Définir le nom d'affichage sur le nom d'utilisateur."/> + <button label="Annuler" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_event.xml b/indra/newview/skins/default/xui/fr/floater_event.xml index b005ce3b36..67d70ac003 100644 --- a/indra/newview/skins/default/xui/fr/floater_event.xml +++ b/indra/newview/skins/default/xui/fr/floater_event.xml @@ -1,69 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Événement" name="Event" title="DÉTAILS SUR L'ÉVÉNEMENT"> - <floater.string name="none"> - aucun +<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600"> + <floater.string name="loading_text"> + Chargement... </floater.string> - <floater.string name="notify"> - Prévenir + <floater.string name="done_text"> + Terminé </floater.string> - <floater.string name="dont_notify"> - Ne pas prévenir - </floater.string> - <floater.string name="moderate"> - Modéré - </floater.string> - <floater.string name="adult"> - Adulte - </floater.string> - <floater.string name="general"> - Général - </floater.string> - <floater.string name="unknown"> - Inconnu - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Nameless Event...of Doom! De doom! Doom doom. - </text> - <text name="event_category"> - (pas de catégorie) - </text> - <text name="event_runby_label"> - Organisé par : - </text> - <text initial_value="(récupération en cours)" name="event_runby"/> - <text name="event_date_label"> - Date : - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - Durée : - </text> - <text name="event_duration"> - 1 heure - </text> - <text name="event_covercharge_label"> - Prix : - </text> - <text name="event_cover"> - Gratuit - </text> - <text name="event_location_label"> - Lieu : - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="Catégorie :"/> - <text name="rating_value" value="inconnu"/> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Créer un événement"/> - <button name="god_delete_event_btn" tool_tip="Supprimer l'événement"/> - <button label="Me prévenir" name="notify_btn"/> - <button label="Téléporter" name="teleport_btn"/> - <button label="Carte" name="map_btn"/> - </layout_panel> - </layout_stack> + <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/> + <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/> </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_first_time_tip.xml b/indra/newview/skins/default/xui/fr/floater_first_time_tip.xml deleted file mode 100644 index a1c6a19e8c..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_first_time_tip.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="set_name_in_the_cladd"> - <check_box label="Désactiver les astuces" name="DontShowFirstTimeTip_checkbox"/> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im.xml b/indra/newview/skins/default/xui/fr/floater_im.xml deleted file mode 100644 index 15b01dbf12..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Message instantané"> - <text name="only_user_message"> - Vous êtes le seul résident participant à cette session. - </text> - <text name="offline_message"> - [FIRST] [LAST] est déconnecté(e). - </text> - <string name="invite_message"> - Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. - </string> - <string name="muted_message"> - Vous ignorez ce résident. Si vous lui envoyez un message, il ne sera plus ignoré. - </string> - <string name="generic_request_error"> - Erreur lors de la requête, veuillez réessayer ultérieurement. - </string> - <string name="insufficient_perms_error"> - Vous n'avez pas les droits requis. - </string> - <string name="session_does_not_exist_error"> - La session a expiré - </string> - <string name="no_ability_error"> - Vous n'avez pas ce pouvoir. - </string> - <string name="not_a_mod_error"> - Vous n'êtes pas modérateur de session. - </string> - <string name="muted_error"> - Un modérateur de groupe a désactivé votre chat écrit. - </string> - <string name="add_session_event"> - Impossible d'ajouter des résidents à la session de chat avec [RECIPIENT]. - </string> - <string name="message_session_event"> - Impossible d'envoyer votre message à la session de chat avec [RECIPIENT]. - </string> - <string name="removed_from_group"> - Vous avez été supprimé du groupe. - </string> - <string name="close_on_no_ability"> - Vous ne pouvez plus participer à la session de chat. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/fr/floater_im_session.xml b/indra/newview/skins/default/xui/fr/floater_im_session.xml index c3df4a869c..516eb41362 100644 --- a/indra/newview/skins/default/xui/fr/floater_im_session.xml +++ b/indra/newview/skins/default/xui/fr/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="Panneau de contrôle IM" name="panel_im_control_panel"/> <layout_panel> <line_editor label="À" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml index 43a7424851..7594eec5f2 100644 --- a/indra/newview/skins/default/xui/fr/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/fr/floater_incoming_call.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="APPEL D'UN(E)INCONNU(E)"> +<floater name="incoming call" title="Appel entrant"> <floater.string name="lifetime"> 5 </floater.string> diff --git a/indra/newview/skins/default/xui/fr/floater_my_friends.xml b/indra/newview/skins/default/xui/fr/floater_my_friends.xml deleted file mode 100644 index db7c026e22..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="CONTACTS"> - <tab_container name="friends_and_groups"> - <panel label="Amis" name="friends_panel"/> - <panel label="Groupes" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_pay.xml b/indra/newview/skins/default/xui/fr/floater_pay.xml index 06cc7df522..397436876d 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Résident"/> <text name="payee_name"> - [FIRST] [LAST] + Test Name That Is Extremely Long To Check Clipping </text> <button label="1 L$" label_selected="1 L$" name="fastpay 1"/> <button label="5 L$" label_selected="5 L$" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml index bb8dee241f..966fa3b8a6 100644 --- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Résident"/> <text left="105" name="payee_name"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text left="25" name="object_name_label"> Via un objet : diff --git a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml b/indra/newview/skins/default/xui/fr/floater_preview_classified.xml deleted file mode 100644 index 23f86d88b9..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_preview_classified.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFOS SUR LA PETITE ANNONCE"> - <floater.string name="Title"> - Petite annonce : [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_event.xml b/indra/newview/skins/default/xui/fr/floater_preview_event.xml deleted file mode 100644 index 7590c43af1..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_preview_event.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="INFORMATIONS SUR LES ÉVÉNEMENTS"> - <floater.string name="Title"> - Événement : [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml deleted file mode 100644 index 4a91992f6a..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="RACCOURCI DU GESTE"/> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml deleted file mode 100644 index d866c32882..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="RACCOURCI DU GESTE"> - <text name="trigger_label"> - Chat : - </text> - <text name="key_label"> - Clavier : - </text> - <combo_box label="Aucun" name="modifier_combo" width="62"/> - <combo_box label="Aucun" name="key_combo" width="62"/> - <text name="replace_text" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé " bonjour " par " salut ", le chat " Je voulais te dire bonjour " devient " Je voulais te dire salut " et le geste correspondant s'affiche."> - Remplacer : - </text> - <line_editor name="replace_editor" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé " bonjour " par " salut ", le chat " Je voulais te dire bonjour " devient " Je voulais te dire salut " et le geste correspondant s'affiche."/> -</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml deleted file mode 100644 index 4a91992f6a..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="RACCOURCI DU GESTE"/> diff --git a/indra/newview/skins/default/xui/fr/floater_statistics.xml b/indra/newview/skins/default/xui/fr/floater_statistics.xml deleted file mode 100644 index a2e3c199ab..0000000000 --- a/indra/newview/skins/default/xui/fr/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATISTIQUES"/> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 666aaa8147..46a27e960c 100644 --- a/indra/newview/skins/default/xui/fr/floater_tools.xml +++ b/indra/newview/skins/default/xui/fr/floater_tools.xml @@ -171,13 +171,13 @@ Créateur : </text> <text name="Creator Name"> - Esbee Linden + Mrs. Esbee Linden (esbee.linden) </text> <text name="Owner:"> Propriétaire : </text> <text name="Owner Name"> - Erica Linden + Mrs. Erica "Moose" Linden (erica.linden) </text> <text name="Group:"> Groupe : @@ -189,7 +189,7 @@ <text name="label click action"> Cliquer pour : </text> - <combo_box name="clickaction" width="178"> + <combo_box name="clickaction"> <combo_box.item label="Toucher (par défaut)" name="Touch/grab(default)"/> <combo_box.item label="S'asseoir sur l'objet" name="Sitonobject"/> <combo_box.item label="Acheter l'objet" name="Buyobject"/> diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml index 5c26527ed6..d4f07a0a25 100644 --- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mon avatar :"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Quitter l'appel" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Quitter l'appel" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml index 381a52ed43..f34ca1f8dd 100644 --- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml @@ -10,10 +10,12 @@ <string name="Details"> [SL_PROFILE] </string> + <text name="user_name_small" value="Grumpity ProductEngine with a long name"/> <text name="user_name" value="Grumpity ProductEngine"/> + <text name="user_slid" value="james.linden"/> <text name="user_subtitle" value="11 mois, 3 jours"/> <text name="user_details"> - C'est ma description second life et je la trouve vraiment géniale. + This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot </text> <slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/> <button label="Devenir amis" name="add_friend_btn"/> diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml index 8bda133a0b..17254ff325 100644 --- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml +++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml @@ -3,7 +3,7 @@ <menu_item_call label="Voir le profil" name="view_profile"/> <menu_item_call label="Devenir amis" name="add_friend"/> <menu_item_call label="IM" name="im"/> - <menu_item_call label="Appeler" name="call"/> + <menu_item_call label="Appel" name="call"/> <menu_item_call label="Téléporter" name="teleport"/> <menu_item_call label="Inviter dans le groupe" name="invite_to_group"/> <menu_item_call label="Ignorer" name="block"/> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 5f51c61655..4e09a9bec3 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -85,6 +85,7 @@ <menu_item_call label="Prendre une copie" name="Take Copy"/> <menu_item_call label="Enregistrer dans mon inventaire" name="Save Object Back to My Inventory"/> <menu_item_call label="Enregistrer dans le contenu des objets" name="Save Object Back to Object Contents"/> + <menu_item_call label="Renvoi de l'objet" name="Return Object back to Owner"/> </menu> <menu label="Scripts" name="Scripts"> <menu_item_call label="Recompiler les scripts (Mono)" name="Mono"/> @@ -98,6 +99,7 @@ <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/> <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/> <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/> + <menu_item_check label="Afficher les contours de la sélection" name="Show Selection Outlines"/> <menu_item_check label="Afficher la sélection masquée" name="Show Hidden Selection"/> <menu_item_check label="Afficher le rayon lumineux pour la sélection" name="Show Light Radius for Selection"/> <menu_item_check label="Afficher le faisceau de sélection lumineux" name="Show Selection Beam"/> @@ -118,6 +120,7 @@ <menu_item_call label="Signaler une infraction" name="Report Abuse"/> <menu_item_call label="Signaler un bug" name="Report Bug"/> <menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/> + <menu_item_check label="Activer les astuces" name="Enable Hints"/> </menu> <menu label="Avancé" name="Advanced"> <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> @@ -308,7 +311,7 @@ <menu_item_call label="Imprimer les infos sur l'objet sélectionné" name="Print Selected Object Info"/> <menu_item_call label="Imprimer les infos sur l'avatar" name="Print Agent Info"/> <menu_item_call label="Statistiques de mémoire" name="Memory Stats"/> - <menu_item_check label="Pilote auto par double-click" name="Double-Click Auto-Pilot"/> + <menu_item_check label="Pilotage auto par double-clic" name="Double-ClickAuto-Pilot"/> <menu_item_check label="Téléportation par double-clic" name="DoubleClick Teleport"/> <menu_item_check label="Débogage SelectMgr" name="Debug SelectMgr"/> <menu_item_check label="Débogage clics" name="Debug Clicks"/> @@ -325,6 +328,7 @@ <menu_item_call label="Enregistrer en XML" name="Save to XML"/> <menu_item_check label="Afficher les noms XUI" name="Show XUI Names"/> <menu_item_call label="Envoyer des IM tests" name="Send Test IMs"/> + <menu_item_call label="Vider les caches de noms" name="Flush Names Caches"/> </menu> <menu label="Avatar" name="Character"> <menu label="Récupérer la texture fixée" name="Grab Baked Texture"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 2a7d1d1a5d..341cc9830d 100644 --- a/indra/newview/skins/default/xui/fr/notifications.xml +++ b/indra/newview/skins/default/xui/fr/notifications.xml @@ -110,8 +110,8 @@ Veuillez ne sélectionner qu'un seul objet. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="GrantModifyRights"> - Lorsque vous accordez des droits d'édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans le Monde. Réfléchissez bien avant d'accorder ces droits. -Souhaitez-vous accorder des droits d'édition à [FIRST_NAME] [LAST_NAME] ? + Lorsque vous accordez des droits de modification à un autre résident, vous lui permettez de changer, supprimer ou prendre n'importe lequel de vos objets dans Second Life. Réfléchissez bien avant d'accorder ces droits. +Voulez-vous vraiment accorder des droits de modification à [NAME] ? <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> <notification name="GrantModifyRightsMultiple"> @@ -120,7 +120,7 @@ Souhaitez-vous accorder des droits d'édition aux résidents sélectionnés <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> <notification name="RevokeModifyRights"> - Souhaitez-vous retirer les droits d'édition à [FIRST_NAME] [LAST_NAME] ? + Voulez-vous retirer les droits de modification à [NAME] ? <usetemplate name="okcancelbuttons" notext="Non" yestext="Oui"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -178,7 +178,7 @@ Voulez-vous continuer ? <notification name="JoinGroupNoCost"> Vous vous apprêtez à rejoindre le groupe [NAME]. Voulez-vous continuer ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/> + <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Fusionner"/> </notification> <notification name="JoinGroupCannotAfford"> Rejoindre ce groupe coûte [COST] L$. @@ -316,17 +316,17 @@ La limite de [MAX_ATTACHMENTS] objets joints a été dépassée. Veuillez commen Vous ne pouvez pas porter cet article car il n'a pas encore été chargé. Veuillez réessayer dans une minute. </notification> <notification name="MustHaveAccountToLogIn"> - Zut ! Vous avez oublié de fournir certaines informations. -Vous devez saisir le nom et le prénom de votre avatar. + Zut ! Vous avez oublié de fournir certaines informations. +Vous devez saisir le nom d'utilisateur de votre avatar. -Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ? +Pour entrer dans [SECOND_LIFE], vous devez disposer d'un compte. Voulez-vous en créer un maintenant ? <url name="url"> https://join.secondlife.com/index.php?lang=fr-FR </url> <usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/> </notification> <notification name="InvalidCredentialFormat"> - Saisissez à la fois le prénom et le nom de votre avatar dans le champ Nom d'utilisateur, puis connectez-vous. + Saisissez soit le nom d'utilisateur soit à la fois le prénom et le nom de votre avatar dans le champ Nom d'utilisateur, puis connectez-vous. </notification> <notification name="AddClassified"> Les petites annonces sont publiées à l'onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine. @@ -920,12 +920,6 @@ Cette erreur est généralement temporaire. Veuillez modifier et sauvegarder l&a Impossible d'acheter du terrain pour le groupe : Vous n'avez pas le droit d'acheter de terrain pour votre groupe. </notification> - <notification label="Devenir amis" name="AddFriend"> - Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. - -Proposer à [NAME] de devenir votre ami(e) ? - <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> - </notification> <notification label="Devenir amis" name="AddFriendWithMessage"> Vous pouvez suivre les déplacements de vos amis sur la carte et voir lorsqu'ils se connectent. @@ -969,7 +963,7 @@ Proposer à [NAME] de devenir votre ami(e) ? </form> </notification> <notification name="RemoveFromFriends"> - Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d'amis ? + Voulez-vous supprimer [NAME] de votre liste d'amis ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="RemoveMultipleFromFriends"> @@ -1084,9 +1078,9 @@ Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> </notification> <notification name="DeedLandToGroupWithContribution"> - Si vous cédez ce terrain, le groupe devra avoir les moyens de le prendre en charge. -La cession incluera une contribution de terrain simultanée au groupe de [FIRST_NAME] [LAST_NAME]. -Le prix de la vente du terrain n'est pas remboursé par le propriétaire. Si la parcelle que vous cédez se vend, le prix de la vente sera divisé en parts égales parmi les membres du groupe. + La cession de cette parcelle requiert que le groupe dispose en permanence d'un crédit suffisant pour payer les frais d'occupation de terrain. +Elle inclura une contribution simultanée au groupe de la part de [NAME]. +Le prix d'achat du terrain n'est pas remboursé au propriétaire. Si une parcelle cédée est vendue, son prix de vente est redistribué à part égale entre les membres du groupe. Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ? <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/> @@ -1460,6 +1454,46 @@ Les chats et les messages instantanés ne s'afficheront pas. Les messages i <button name="Cancel" text="Annuler"/> </form> </notification> + <notification name="SetDisplayNameSuccess"> + Bonjour [DISPLAY_NAME], + +Comme dans la vie réelle, il faut quelque temps aux gens pour qu'ils se familiarisent avec un nouveau nom. Veuillez compter quelques jours avant la [http://wiki.secondlife.com/wiki/Setting_your_display_name mise à jour de votre nom] au niveau des objets, scripts, recherches, etc. + </notification> + <notification name="SetDisplayNameBlocked"> + Impossible de changer de nom d'affichage. Si vous pensez qu'il s'agit d'une erreur, contactez l'Assistance. + </notification> + <notification name="SetDisplayNameFailedLength"> + Le nom saisi est trop long. Le nombre de caractères maximum est de [LENGTH]. + +Veuillez essayer avec un nom plus court. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Impossible de définir votre nom d'affichage. Veuillez réessayer ultérieurement. + </notification> + <notification name="SetDisplayNameMismatch"> + Non-concordance des noms d'affichage saisis. Effectuez une nouvelle saisie. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Le délai au bout duquel vous pouvez changer de nom d'affichage n'est pas encore écoulé. + +Voir http://wiki.secondlife.com/wiki/Setting_your_display_name + +Veuillez réessayer ultérieurement. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Impossible de définir le nom demandé car il contient un terme interdit. + + Veuillez essayer avec un nom différent. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + Le nom d'affichage que vous souhaitez définir contient des caractères non valides. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Votre nom d'affichage doit contenir des lettres autres que des signes de ponctuation. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) a désormais le nom [NEW_NAME]. + </notification> <notification name="OfferTeleport"> Proposez une téléportation avec le message suivant ? <form name="form"> @@ -2028,10 +2062,10 @@ Liez-la à partir d'une page web pour permettre aux autres résidents d&apo Sujet : [SUBJECT], Message : [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] est connecté(e) + [NAME] est en ligne </notification> <notification name="FriendOffline"> - [FIRST] [LAST] est déconnecté(e) + [NAME] est hors ligne </notification> <notification name="AddSelfFriend"> Même si vous êtes extrêmement sympathique, vous ne pouvez pas devenir ami avec vous-même. @@ -2099,9 +2133,6 @@ Merci d'essayer à nouveau dans une minute. <notification name="CannotRemoveProtectedCategories"> Vous ne pouvez pas supprimer de catégories protégées. </notification> - <notification name="OfferedCard"> - Vous avez offert votre carte de visite à [FIRST] [LAST] - </notification> <notification name="UnableToBuyWhileDownloading"> Achat impossible durant le chargement de l'objet. Merci de réessayer. @@ -2172,7 +2203,10 @@ Veuillez sélectionner un terrain plus petit. <notification name="SystemMessage"> [MESSAGE] </notification> - <notification name="PaymentRecived"> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> [MESSAGE] </notification> <notification name="EventNotification"> @@ -2181,8 +2215,7 @@ Veuillez sélectionner un terrain plus petit. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Téléporter"/> - <button name="Description" text="Description"/> + <button name="Details" text="Détails"/> <button name="Cancel" text="Annuler"/> </form> </notification> @@ -2218,7 +2251,7 @@ Si le problème persiste, veuillez réinstaller le plugin ou contacter le vendeu Les objets que vous possédez sur la parcelle de terrain sélectionnée ont été renvoyés dans votre inventaire. </notification> <notification name="OtherObjectsReturned"> - Les objets que vous possédez sur la parcelle de terrain appartenant à [FIRST] [LAST] ont été renvoyés dans votre inventaire. + Les objets de la parcelle de terrain sélectionnée appartenant à [NAME] ont été renvoyés vers son inventaire. </notification> <notification name="OtherObjectsReturned2"> Les objets sur la parcelle de terrain sélectionnée appartenant au résident [NAME] ont été rendus à leur propriétaire. @@ -2345,7 +2378,7 @@ Veuillez réessayer dans quelques minutes. Aucune parcelle valide n'a été trouvée. </notification> <notification name="ObjectGiveItem"> - Un objet appelé [OBJECTFROMNAME] appartenant à [NAME_SLURL] vous a donné un [OBJECTTYPE] : + Un objet nommé <nolink>[OBJECTFROMNAME]</nolink> appartenant à [NAME_SLURL] vous a donné un objet de type [OBJECTTYPE] : [ITEM_SLURL] <form name="form"> <button name="Keep" text="Garder"/> @@ -2410,9 +2443,9 @@ Veuillez réessayer dans quelques minutes. Vous avez proposé à [TO_NAME] de devenir votre ami(e) </notification> <notification name="OfferFriendshipNoMessage"> - [NAME] vous demande de devenir son ami. + [NAME_SLURL] vous demande de devenir son ami(e). -(Par défaut, vous pourrez voir quand vous êtes tous deux connectés) +(Par défaut, chacun pourra voir si l'autre est connecté.) <form name="form"> <button name="Accept" text="Accepter"/> <button name="Decline" text="Refuser"/> @@ -2431,7 +2464,7 @@ Veuillez réessayer dans quelques minutes. Amitié refusée. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] vous offre sa carte de visite. + [NAME] vous offre sa carte de visite. Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d'envoyer rapidement un IM à ce résident. <form name="form"> <button name="Accept" text="Accepter"/> @@ -2447,11 +2480,11 @@ Si vous restez dans cette région, vous serez déconnecté(e). Si vous restez dans cette région, vous serez déconnecté(e). </notification> <notification name="LoadWebPage"> - Charger cette page web [URL] ? + Charger la page Web [URL] ? [MESSAGE] -Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? +Venant de l'objet : <nolink>[OBJECTNAME]</nolink>, propriétaire : [NAME] ? <form name="form"> <button name="Gotopage" text="Charger"/> <button name="Cancel" text="Annuler"/> @@ -2467,7 +2500,7 @@ Venant de l'objet : [OBJECTNAME], appartenant à : [NAME]? L'objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour de [APP_NAME]. </notification> <notification name="ScriptQuestion"> - '[OBJECTNAME]', un objet appartenant à '[NAME]', aimerait : + <nolink>[OBJECTNAME]</nolink>, un objet appartenant à [NAME], aimerait : [QUESTIONS] Acceptez-vous ? @@ -2478,12 +2511,12 @@ Acceptez-vous ? </form> </notification> <notification name="ScriptQuestionCaution"> - Un objet appelé [OBJECTNAME], appartenant à [NAME], aimerait : + Un objet nommé <nolink>[OBJECTNAME]</nolink>, appartenant à [NAME], aimerait : [QUESTIONS] -Si vous n'avez pas confiance en cet objet ni en son créateur, vous devriez refuser cette requête. +Si vous n'avez pas confiance en cet objet ni en son créateur, refusez cette requête. -Accepter cette requête ? +Accepter cette requête ? <form name="form"> <button name="Grant" text="Accepter"/> <button name="Deny" text="Refuser"/> @@ -2491,14 +2524,14 @@ Accepter cette requête ? </form> </notification> <notification name="ScriptDialog"> - '[TITLE]' de [FIRST] [LAST] + <nolink>[TITLE]</nolink> de [NAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorer"/> </form> </notification> <notification name="ScriptDialogGroup"> - '[TITLE]' de [GROUPNAME] + <nolink>[TITLE]</nolink> de [GROUPNAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorer"/> @@ -2535,13 +2568,13 @@ Pour y participer, cliquez sur Accepter. Sinon, cliquez sur Refuser. Pour ignore </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] a reçu un message instantané et n'est donc plus ignoré. + [NAME] a reçu un message instantané et n'est donc plus ignoré. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] a reçu de l'argent et n'est donc plus ignoré. + [NAME] a reçu de l'argent et n'est donc plus ignoré. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] a reçu un inventaire et n'est donc plus ignoré. + [NAME] a reçu une offre d'inventaire et n'est donc plus ignoré. </notification> <notification name="VoiceInviteGroup"> [NAME] a rejoint un chat vocal avec le groupe [GROUP]. @@ -2768,6 +2801,37 @@ ignorés, même si vous quittez l'appel. Ignorer les autres ? <usetemplate ignoretext="Confirmer avant d'ignorer les autres lors d'un appel de groupe" name="okcancelignore" notext="Annuler" yestext="Ok"/> </notification> + <notification label="Chat" name="HintChat"> + Pour participer à la conversation, saisissez du texte dans le champ de chat situé en dessous. + </notification> + <notification label="Se lever" name="HintSit"> + Pour passer d'une position assise à une position debout, cliquez sur le bouton Me lever. + </notification> + <notification label="Explorer le monde" name="HintDestinationGuide"> + Le Guide des destinations comprend des milliers d'endroits nouveaux à découvrir. Sélectionnez-en un, puis cliquez sur Téléporter pour commencer à l'explorer. + </notification> + <notification label="Panneau latéral" name="HintSidePanel"> + Obtenir un accès rapide à votre inventaire, à vos habits, à vos profils et bien plus encore dans le panneau latéral. + </notification> + <notification label="Bouger" name="HintMove"> + Pour marcher ou courir, cliquez sur le bouton Bouger, puis naviguez à l'aide des flèches directionnelles. Vous pouvez également utiliser les touches fléchées de votre clavier. + </notification> + <notification label="Nom d'affichage" name="HintDisplayName"> + Définissez ici votre nom d'affichage personnalisable. Cette fonctionnalité vous est fournie en plus de votre nom d'utilisateur unique qui, lui, ne peut être changé. Vous pouvez modifier l'apparence des noms des autres résidents dans vos préférences. + </notification> + <notification label="Inventaire" name="HintInventory"> + Permet de rechercher des articles dans l'inventaire. Pour accéder aux derniers articles ajoutés, cliquez sur l'onglet Récent. + </notification> + <notification label="Vous possédez des Linden dollars !" name="HintLindenDollar"> + Votre solde actuel en L$ est celui-ci. Pour y ajouter d'autres Linden dollars, cliquez sur Acheter L$. + </notification> + <notification name="PopupAttempt"> + Impossible d'ouvrir une fenêtre popup. + <form name="form"> + <ignore name="ignore" text="Activer toutes les fenêtres popup"/> + <button name="open" text="Ouvrir la fenêtre popup"/> + </form> + </notification> <global name="UnsupportedCPU"> - Votre processeur ne remplit pas les conditions minimum requises. </global> diff --git a/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/indra/newview/skins/default/xui/fr/panel_audio_device.xml deleted file mode 100644 index 2caa013f54..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="device_settings"> - <text name="Audio Devices"> - Matériel audio - </text> - <text name="Input device (microphone):"> - Périphérique d'entrée (micro) : - </text> - <text name="Output device (speakers):" width="300"> - Périphérique de sortie (haut-parleurs) : - </text> - <text name="Input level:"> - Volume d'entrée - </text> - <text_editor name="voice_intro_text1"> - Pour que les autres résidents vous entendent plus ou moins fort, utilisez le curseur. Pour tester le volume, parlez dans le micro. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Réglez le volume avec ce curseur."/> - <text name="wait_text"> - Veuillez patienter - </text> - <string name="default_text"> - Défaut - </string> -</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml index 9a6401536f..ef65d2fe24 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml @@ -26,6 +26,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="data_panel"> + <text name="display_name_label" value="Nom d'affichage :"/> + <text name="solo_username_label" value="Nom d'utilisateur :"/> + <button name="set_name" tool_tip="Définir un nom d'affichage"/> + <text name="solo_user_name" value="Hamilton Hitchings"/> + <text name="user_name" value="Hamilton Hitchings"/> + <text name="user_name_small" value="Hamilton Hitchings"/> + <text name="user_label" value="Nom d'utilisateur :"/> + <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <panel name="second_life_image_panel"> <text name="second_life_photo_title_text" value="[SECOND_LIFE]:"/> @@ -46,7 +54,7 @@ <text name="my_account_link" value="[[URL] Accéder à ma Page d'accueil]"/> <text name="title_partner_text" value="Mon partenaire :"/> <panel name="partner_data_panel"> - <name_box initial_value="(récupération en cours)" name="partner_text" value="[FIRST] [LAST]"/> + <text initial_value="(récupération en cours)" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] Modifier]"/> </panel> @@ -55,7 +63,7 @@ <panel name="profile_me_buttons_panel"> <layout_stack name="bottom_panel_ls"> <layout_panel name="save_changes_btn_lp"> - <button label="Enregistrer les changements" name="save_btn"/> + <button label="Enregistrer" name="save_btn"/> </layout_panel> <layout_panel name="show_on_map_btn_lp"> <button label="Annuler" name="cancel_btn"/> diff --git a/indra/newview/skins/default/xui/fr/panel_friends.xml b/indra/newview/skins/default/xui/fr/panel_friends.xml deleted file mode 100644 index ad9e3daf3d..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_friends.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="friends"> - <string name="Multiple"> - Amis multiples - </string> - <scroll_list name="friend_list" tool_tip="Pour sélectionner plusieurs amis, cliquez en maintenant la touche Maj ou Ctrl appuyée"> - <column name="icon_online_status" tool_tip="Statut en ligne"/> - <column label="Nom" name="friend_name" tool_tip="Nom"/> - <column name="icon_visible_online" tool_tip="Votre ami voit si vous êtes connecté(e)"/> - <column name="icon_visible_map" tool_tip="Votre ami peut vous situer sur la carte"/> - <column name="icon_edit_mine" tool_tip="Votre ami peut modifier, supprimer ou prendre vos objets"/> - <column name="icon_edit_theirs" tool_tip="Vous pouvez modifier les objets de cet ami"/> - </scroll_list> - <button label="IM/Appel" name="im_btn" tool_tip="Envoyez un IM à ce résident"/> - <button label="Profil" name="profile_btn" tool_tip="Consultez le profil de ce résident (photos, groupes et autres infos)"/> - <button label="Téléporter" name="offer_teleport_btn" tool_tip="Proposez à cet ami d'être téléporté là où vous êtes"/> - <button label="Payer" name="pay_btn" tool_tip="Donnez des L$ à cet ami"/> - <button label="Supprimer" name="remove_btn" tool_tip="Supprimez ce résident de votre liste d'amis"/> - <button label="Ajouter" name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/> -</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml index dcc27a9be4..4011d1b8c7 100644 --- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml @@ -24,6 +24,7 @@ <scroll_list.columns label="Région" name="location"/> <scroll_list.columns label="Type" name="type"/> <scroll_list.columns label="Surf." name="area"/> + <scroll_list.columns label="Masquage" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Total des contributions : diff --git a/indra/newview/skins/default/xui/fr/panel_groups.xml b/indra/newview/skins/default/xui/fr/panel_groups.xml deleted file mode 100644 index 4cda98b9f7..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_groups.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="groups"> - <scroll_list bottom="50" name="group list"/> - <text name="groupdesc"> - Le groupe actif est en gras. - </text> - <text name="groupcount" width="280"> - Vous appartenez à [COUNT] groupes ([MAX] max). - </text> - <button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/> - <button label="Infos" name="Info"/> - <button label="Activer" name="Activate"/> - <button label="Quitter" name="Leave"/> - <button label="Créer..." name="Create"/> - <button label="Rechercher..." name="Search..."/> -</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml index b3ab2f4f90..b667780180 100644 --- a/indra/newview/skins/default/xui/fr/panel_login.xml +++ b/indra/newview/skins/default/xui/fr/panel_login.xml @@ -11,7 +11,7 @@ <text name="username_text"> Nom d'utilisateur : </text> - <line_editor label="Nom d'utilisateur" name="username_edit" tool_tip="Nom d'utilisateur [SECOND_LIFE]"/> + <line_editor label="bobsmith12 ou Steller Sunshine" name="username_edit" tool_tip="Nom d'utilisateur que vous avez choisi lors de votre inscription (par exemple, bobsmith12 ou Steller Sunshine)."/> <text name="password_text"> Mot de passe : </text> @@ -31,7 +31,7 @@ S'inscrire </text> <text name="forgot_password_text"> - Nom ou mot de passe oublié ? + Nom d'utilisateur ou mot de passe oublié ? </text> <text name="login_help"> Besoin d'aide ? diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml index f631cf8b85..3e7225d8ac 100644 --- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Choses" name="main inventory panel"> <panel.string name="ItemcountFetching"> - Récupération de [ITEM_COUNT] objets... [FILTER] + Récupération : [ITEM_COUNT] articles... [FILTER] </panel.string> <panel.string name="ItemcountCompleted"> - [ITEM_COUNT] objets [FILTER] + [ITEM_COUNT] articles [FILTER] </panel.string> <text name="ItemcountText"> - Objets : + Articles : </text> <filter_editor label="Filtrer l'inventaire" name="inventory search editor"/> <tab_container name="inventory filter tabs"> diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml deleted file mode 100644 index b506a202bd..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text - name="sender_name" -width="170">CHAT PRÈS DE MOI</text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_notifications_channel.xml b/indra/newview/skins/default/xui/fr/panel_notifications_channel.xml index 5beb71981c..110e017050 100644 --- a/indra/newview/skins/default/xui/fr/panel_notifications_channel.xml +++ b/indra/newview/skins/default/xui/fr/panel_notifications_channel.xml @@ -1,15 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="notifications_panel"> <layout_stack name="stack1"> - <scroll_list name="notifications_list"> - <column label="Nom" name="name"/> - <column label="Contenu" name="content"/> - <column label="Date" name="date"/> - </scroll_list> - <scroll_list name="notification_rejects_list"> - <column label="Nom" name="name"/> - <column label="Contenu" name="content"/> - <column label="Date" name="date"/> - </scroll_list> + <layout_panel name="notifications_list_panel" > + <scroll_list name="notifications_list"> + <column label="Nom" name="name"/> + <column label="Contenu" name="content"/> + <column label="Date" name="date"/> + </scroll_list> + </layout_panel> + <layout_panel name="rejects_list_panel" > + <scroll_list name="notification_rejects_list"> + <column label="Nom" name="name"/> + <column label="Contenu" name="content"/> + <column label="Date" name="date"/> + </scroll_list> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_online_status.xml b/indra/newview/skins/default/xui/fr/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index 76edc316c2..0ca4208282 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -68,7 +68,7 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/> </layout_panel> <layout_panel name="chat_btn_lp"> - <button label="Appeler" name="call_btn" tool_tip="Appeler ce résident"/> + <button label="Appel" name="call_btn" tool_tip="Appeler ce résident"/> </layout_panel> <layout_panel name="chat_btn_lp"> <button label="Partager" name="share_btn" tool_tip="Partager un article de l'inventaire"/> diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml index 731e045019..3c2c1b9d37 100644 --- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml @@ -80,7 +80,7 @@ <text name="region_rating_label" value="Catégorie :"/> <text name="region_rating" value="Adulte"/> <text name="region_owner_label" value="Propriétaire :"/> - <text name="region_owner" value="orignal Van Orignal"/> + <text name="region_owner" value="moose Van Moose extra long name moose"/> <text name="region_group_label" value="Groupe :"/> <text name="region_group"> Le puissant orignal d’Orignalville @@ -93,6 +93,7 @@ <text name="estate_name_label" value="Domaine :"/> <text name="estate_rating_label" value="Catégorie :"/> <text name="estate_owner_label" value="Propriétaire :"/> + <text name="estate_owner" value="Testing owner name length with long name"/> <text name="covenant_label" value="Règlement :"/> </panel> </accordion_tab> 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 20d5f754ce..30389a0ef9 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -44,9 +44,10 @@ <radio_item label="Activé" name="radio2" value="1"/> <radio_item label="Afficher brièvement" name="radio3" value="2"/> </radio_group> - <check_box label="Montrer mon nom" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Affichage en petit" name="small_avatar_names_checkbox"/> - <check_box label="Afficher les titres de groupe" name="show_all_title_checkbox1"/> + <check_box label="Mon nom" name="show_my_name_checkbox1"/> + <check_box label="Noms d'utilisateur" name="show_slids" tool_tip="Afficher le nom d'utilisateur, comme bobsmith123."/> + <check_box label="Titres de groupe" name="show_all_title_checkbox1" tool_tip="Afficher les titres de groupe, comme Officier ou Membre."/> + <check_box label="Mettre mes amis en surbrillance" name="show_friends" tool_tip="Mettre en surbrillance l'affichage des noms de vos amis."/> <text name="effects_color_textbox"> Mes effets : </text> @@ -61,6 +62,7 @@ <combo_box.item label="30 minutes" name="item3"/> <combo_box.item label="Jamais" name="item4"/> </combo_box> + <check_box label="Voir les noms d'affichage" name="display_names_check" tool_tip="Cocher pour utiliser les noms d'affichage dans les chats, les IM, l'affichage des noms, etc."/> <text name="text_box3"> Réponse si occupé(e) : </text> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml index eae49e7810..c1cec7537e 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Configuration" name="Input panel"> - <button label="Autres accessoires" name="joystick_setup_button" width="175"/> <text name="Mouselook:"> Vue subjective : </text> @@ -40,6 +39,7 @@ <check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Accepter les cookies" name="cookies_enabled"/> <check_box initial_value="true" label="Activer Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="false" label="Activer les fenêtres popup de navigateur de médias" name="media_popup_enabled"/> <check_box initial_value="false" label="Activer le proxy Web" name="web_proxy_enabled"/> <text name="Proxy location"> Emplacement du proxy : diff --git a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml index f6b9bdcb81..f16fcebd02 100644 --- a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml @@ -7,9 +7,9 @@ 0.2 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="Le média est en cours de chargement"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/fr/panel_profile_view.xml b/indra/newview/skins/default/xui/fr/panel_profile_view.xml index 8f57dd89c7..0447618420 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile_view.xml @@ -6,8 +6,14 @@ <string name="status_offline"> Hors ligne </string> - <text_editor name="user_name" value="(en cours de chargement...)"/> + <text name="display_name_label" value="Nom d'affichage :"/> + <text name="solo_username_label" value="Nom d'utilisateur :"/> <text name="status" value="En ligne"/> + <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> + <text name="user_name" value="Jack Linden"/> + <button name="copy_to_clipboard" tool_tip="Copier dans le presse-papiers"/> + <text name="user_label" value="Nom d'utilisateur :"/> + <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PROFIL" name="panel_profile"/> <panel label="FAVORIS" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml deleted file mode 100644 index 663ae55134..0000000000 --- a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Région" name="General"> - <text name="region_text_lbl"> - Région : - </text> - <text left_delta="56" name="region_text"> - inconnu - </text> - <text name="version_channel_text_lbl"> - Version : - </text> - <text left_delta="56" name="version_channel_text"> - inconnu - </text> - <text name="region_type_lbl"> - Type : - </text> - <text left_delta="56" name="region_type"> - inconnu - </text> - <check_box label="Interdire le terraformage" name="block_terraform_check"/> - <check_box label="Interdire le vol" name="block_fly_check"/> - <check_box label="Autoriser les dégâts" name="allow_damage_check"/> - <check_box label="Interdire les bousculades" name="restrict_pushobject"/> - <check_box label="Autoriser la revente de terrains" name="allow_land_resell_check"/> - <check_box label="Autoriser la fusion/division de terrains" name="allow_parcel_changes_check"/> - <check_box label="Interdire l'affichage du terrain dans les recherches" name="block_parcel_search_check" tool_tip="Permettre aux autres résidents de voir cette région et ses parcelles dans les résultats de recherche"/> - <spinner label="Nombre maximum d'avatars" label_width="160" name="agent_limit_spin" width="240"/> - <spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/> - <text label="Accès" name="access_text"> - Catégorie : - </text> - <combo_box label="Modéré" name="access_combo"> - <combo_box.item label="Adulte" name="Adult"/> - <combo_box.item label="Modéré" name="Mature"/> - <combo_box.item label="Général" name="PG"/> - </combo_box> - <button label="Appliquer" name="apply_btn"/> - <button label="Téléporter un résident chez lui…" name="kick_btn"/> - <button label="Téléporter tous les résidents chez eux…" name="kick_all_btn"/> - <button label="Envoyer un message à la région..." name="im_btn"/> - <button label="Gérer le téléhub..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml index d731fa6896..7187de8760 100644 --- a/indra/newview/skins/default/xui/fr/role_actions.xml +++ b/indra/newview/skins/default/xui/fr/role_actions.xml @@ -39,6 +39,7 @@ <action description="Toujours autoriser à créer des objets" longdescription="Vous pouvez créer des objets sur une parcelle du groupe, même si l'option est désactivée à partir du menu À propos du terrain > Options." name="land allow create" value="25"/> <action description="Toujours autoriser à créer des repères" longdescription="Vous pouvez créer un repère sur une parcelle du groupe, même si l'option est désactivée à partir du menu À propos du terrain > Options." name="land allow landmark" value="26"/> <action description="Autoriser à définir un domicile sur le terrain du groupe" longdescription="Un membre dans un rôle avec ce pouvoir peut utiliser le menu Monde > Repères > Définir le domicile ici sur une parcelle cédée à ce groupe." name="land allow set home" value="28"/> + <action description="Autoriser la réception d'événements sur les terrains du groupe" longdescription="Les membres dont le rôle possède ce pouvoir peuvent sélectionner les parcelles détenues par le groupe comme lieu de réception lors d'un événement." name="land allow host event" value="41"/> </action_set> <action_set description="Ces pouvoirs permettent d'autoriser ou d'interdire l'accès à des parcelles du groupe et de figer ou d'expulser des résidents." name="Parcel Access"> <action description="Gérer la liste d'accès à la parcelle" longdescription="Gérez la liste des résidents autorisés sur la parcelle à partir du menu À propos du terrain > Accès." name="land manage allowed" value="29"/> @@ -64,13 +65,9 @@ <action description="Envoyer des notices" longdescription="Les membres dans un rôle avec ce pouvoir peuvent envoyer des notices par le biais de la section Groupe > Notices." name="notices send" value="42"/> <action description="Recevoir et consulter les notices" longdescription="Les membres dans un rôle avec ce pouvoir peuvent recevoir des notices et consulter les anciennes notices par le biais de la section Groupe > Notices." name="notices receive" value="43"/> </action_set> - <action_set description="Ces pouvoirs permettent de créer de nouvelles propositions, de voter et de consulter l'historique des votes." name="Proposals"> - <action description="Créer des propositions" longdescription="Ces pouvoirs permettent de créer des propositions et de les soumettre au vote, à partir du menu Profil du groupe > Propositions." name="proposal start" value="44"/> - <action description="Voter les propositions" longdescription="Votez les propositions à partir du menu Profil du groupe > Propositions." name="proposal vote" value="45"/> - </action_set> <action_set description="Ces pouvoirs vous permettent de gérer l'accès aux sessions de chat écrit ou vocal du groupe." name="Chat"> - <action description="Participer aux chats" longdescription="Participez aux chats du groupe." name="join group chat"/> - <action description="Participer au chat vocal" longdescription="Participez au chat vocal du groupe. Remarque : vous devez au préalable avoir le pouvoir de participer aux chats." name="join voice chat"/> - <action description="Modérer les chats" longdescription="Contrôlez l'accès et la participation aux chats de groupe écrits et vocaux." name="moderate group chat"/> + <action description="Participer aux chats" longdescription="Participez aux chats du groupe." name="join group chat" value="16"/> + <action description="Participer au chat vocal" longdescription="Participez au chat vocal du groupe. Remarque : vous devez au préalable avoir le pouvoir de participer aux chats." name="join voice chat" value="27"/> + <action description="Modérer les chats" longdescription="Contrôlez l'accès et la participation aux chats de groupe écrits et vocaux." name="moderate group chat" value="37"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml index a7a766f6a6..8b958119eb 100644 --- a/indra/newview/skins/default/xui/fr/strings.xml +++ b/indra/newview/skins/default/xui/fr/strings.xml @@ -206,6 +206,9 @@ <string name="TooltipAgentUrl"> Cliquez pour afficher le profil de ce résident </string> + <string name="TooltipAgentInspect"> + En savoir plus sur ce résident + </string> <string name="TooltipAgentMute"> Cliquer pour ignorer ce résident </string> @@ -246,7 +249,7 @@ Cliquez pour voir cet emplacement sur la carte </string> <string name="TooltipSLAPP"> - Cliquez pour exécuter la commande secondlife:// command + Cliquez pour exécuter la commande secondlife:// </string> <string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/> <string name="SLurlLabelTeleport"> @@ -762,6 +765,12 @@ <string name="Estate / Full Region"> Domaine / Région entière </string> + <string name="Estate / Homestead"> + Domaine / Homestead + </string> + <string name="Mainland / Homestead"> + Continent / Homestead + </string> <string name="Mainland / Full Region"> Continent / Région entière </string> @@ -798,7 +807,7 @@ <string name="xml_file"> Fichier XML </string> - <string name="dot_raw_file"> + <string name="raw_file"> Fichier RAW </string> <string name="compressed_image_files"> @@ -1027,10 +1036,10 @@ Appuyez sur ESC pour quitter la vue subjective </string> <string name="InventoryNoMatchingItems"> - Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/Rechercher [SEARCH_TERM]]. + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/ Rechercher [SEARCH_TERM]]. </string> <string name="PlacesNoMatchingItems"> - Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/Rechercher [SEARCH_TERM]]. + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/ Rechercher [SEARCH_TERM]]. </string> <string name="FavoritesNoMatchingItems"> Faites glisser un repère ici pour l'ajouter à vos Favoris. @@ -1080,7 +1089,7 @@ <string name="Textures" value=" Textures,"/> <string name="Snapshots" value=" Photos,"/> <string name="No Filters" value="Non "/> - <string name="Since Logoff" value=" - Depuis la déconnexion"/> + <string name="Since Logoff" value=" depuis la déconnexion"/> <string name="InvFolder My Inventory"> Mon inventaire </string> @@ -1388,7 +1397,7 @@ Personne dont l'âge n'a pas été vérifié </string> <string name="Center 2"> - Centrer 2 + Centre 2 </string> <string name="Top Right"> En haut à droite @@ -1400,7 +1409,7 @@ En haut à gauche </string> <string name="Center"> - Centrer + Centre </string> <string name="Bottom Left"> En bas à gauche @@ -3574,7 +3583,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. Vous êtes le seul participant à cette session. </string> <string name="offline_message"> - [FIRST] [LAST] est déconnecté(e). + [NAME] est hors ligne. </string> <string name="invite_message"> Pour accepter ce chat vocal/vous connecter, cliquez sur le bouton [BUTTON NAME]. @@ -3643,7 +3652,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. http://secondlife.com/landing/voicemorphing </string> <string name="paid_you_ldollars"> - [NAME] vous a payé [AMOUNT] L$ + [NAME] vous a payé [AMOUNT] L$ [REASON]. + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] vous a payé [AMOUNT] L$. </string> <string name="you_paid_ldollars"> Vous avez payé à [AMOUNT] L$ [REASON]. @@ -3657,6 +3669,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="you_paid_ldollars_no_name"> Vous avez payé à [AMOUNT] L$ [REASON]. </string> + <string name="for item"> + pour l'article suivant : [ITEM] + </string> <string name="for a parcel of land"> pour une parcelle de terrain </string> @@ -3675,6 +3690,9 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE]. <string name="to upload"> pour charger </string> + <string name="to publish a classified ad"> + pour publier une petite annonce + </string> <string name="giving"> Donner [AMOUNT] L$ </string> diff --git a/indra/newview/skins/default/xui/it/floater_bumps.xml b/indra/newview/skins/default/xui/it/floater_bumps.xml index d9dd3f26d7..6de2fea67f 100644 --- a/indra/newview/skins/default/xui/it/floater_bumps.xml +++ b/indra/newview/skins/default/xui/it/floater_bumps.xml @@ -4,19 +4,19 @@ Nessuno rilevato </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] ti ha urtato + [TIME] [NAME] ti ha urtato </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] ti ha spinto per mezzo di uno script + [TIME] [NAME] ti ha spinto per mezzo di uno script </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] ti ha colpito con un oggetto + [TIME] [NAME] ti ha colpito con un oggetto </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] ti ha colpito con un oggetto scriptato + [TIME] [NAME] ti ha colpito con un oggetto scriptato </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] ti ha colpito con un oggetto fisico + [TIME] [NAME] ti ha colpito con un oggetto fisico </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml deleted file mode 100644 index 63c26b4d73..0000000000 --- a/indra/newview/skins/default/xui/it/floater_customize.xml +++ /dev/null @@ -1,530 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="ASPETTO"> - <tab_container name="customize tab container" tab_min_width="120"> - <text label="Parti del corpo" name="body_parts_placeholder"> - Parti del corpo - </text> - <panel label="Forma del corpo" left="124" name="Shape"> - <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/> - <button label="Corpo" label_selected="Corpo" name="Body"/> - <button label="Testa" label_selected="Testa" name="Head"/> - <button label="Occhi" label_selected="Occhi" name="Eyes"/> - <button label="Orecchie" label_selected="Orecchie" name="Ears"/> - <button label="Naso" label_selected="Naso" name="Nose"/> - <button label="Bocca" label_selected="Bocca" name="Mouth"/> - <button label="Mento" label_selected="Mento" name="Chin"/> - <button label="Torso" label_selected="Torso" name="Torso"/> - <button label="Gambe" label_selected="Gambe" name="Legs"/> - <radio_group name="sex radio"> - <radio_item label="Femmina" name="radio" value="0"/> - <radio_item label="Maschio" name="radio2" value="1"/> - </radio_group> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossato - </text> - <text name="path"> - Ubicato in [PATH] - </text> - <text name="not worn instructions"> - Metti una nuova figura corporea trascinandola dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label"> - Forma del corpo: - </text> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/> - </panel> - <panel label="Pelle" name="Skin"> - <button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/> - <button label="Dettagli della faccia" label_selected="Dettagli della faccia" name="Face Detail" width="115"/> - <button label="Trucco" label_selected="Trucco" name="Makeup" width="115"/> - <button label="Dettagli del corpo" label_selected="Dettagli del corpo" name="Body Detail" width="115"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossata - </text> - <text name="path"> - Ubicata in [PATH] - </text> - <text name="not worn instructions"> - Per mettere una nuova pelle, trascinala dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Pelle: - </text> - <texture_picker label="Tatuaggi: testa" name="Head Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> - <texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> - <texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un'immagine" width="96"/> - <button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/> - </panel> - <panel label="Capelli" name="Hair"> - <button label="Capelli" label_selected="Colore" name="Color"/> - <button label="Stile" label_selected="Stile" name="Style"/> - <button label="Sopracciglia" label_selected="Sopracciglia" name="Eyebrows"/> - <button label="Facciale" label_selected="Facciale" name="Facial"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabili - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossati - </text> - <text name="path"> - Ubicati in [PATH] - </text> - <text name="not worn instructions"> - Per cambiare capelli, trascinali dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <text name="no modify instructions"> - Non hai il permesso per modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Capelli: - </text> - <texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un'immagine"/> - <button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Occhi" name="Eyes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabili - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossati - </text> - <text name="path"> - Ubicati in [PATH] - </text> - <text name="not worn instructions"> - Puoi cambiare gli occhi trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Occhi: - </text> - <texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un'immagine"/> - <button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <text label="Vestiti" name="clothes_placeholder"> - Abiti - </text> - <panel label="Camicia" name="Shirt"> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossata - </text> - <text name="path"> - Ubicata in [PATH] - </text> - <text name="not worn instructions"> - Metti una nuova camicia trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Camicia: - </text> - </panel> - <panel label="Pantaloni" name="Pants"> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossato - </text> - <text name="path"> - Ubicati in [PATH] - </text> - <text name="not worn instructions"> - Metti dei nuovi pantaloni trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Pantaloni: - </text> - </panel> - <panel label="Scarpe" name="Shoes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabili - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossate - </text> - <text name="path"> - Ubicate in [PATH] - </text> - <text name="not worn instructions"> - Metti delle nuove scarpe trascinandole dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea nuove scarpe" label_selected="Crea nuove scarpe" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Scarpe: - </text> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Calze" name="Socks"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabili - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossate - </text> - <text name="path"> - Ubicato in [PATH] - </text> - <text name="not worn instructions"> - Metti delle nuove calze trascinandole dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Calze: - </text> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Giacca" name="Jacket"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossata - </text> - <text name="path"> - Ubicata in [PATH] - </text> - <text name="not worn instructions"> - Metti una nuova giacca trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea una nuova giacca" label_selected="Crea una nuova giacca" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Giacca: - </text> - <texture_picker label="Tessuto: superiore" name="Upper Fabric" tool_tip="Clicca per scegliere un'immagine" width="96"/> - <texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un'immagine" width="96"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Guanti" name="Gloves"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabili - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossati - </text> - <text name="path"> - Ubicati in [PATH] - </text> - <text name="not worn instructions"> - Metti dei nuovi guanti trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea nuovi guanti" label_selected="Crea nuovi guanti" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Guanti: - </text> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Canottiera" name="Undershirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossata - </text> - <text name="path"> - Ubicata in [PATH] - </text> - <text name="not worn instructions"> - Metti una nuova maglietta intima trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea una nuova canottiera" label_selected="Crea una nuova canottiera" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Canottiera: - </text> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Mutande" name="Underpants"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabili - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossate - </text> - <text name="path"> - Ubicato in [PATH] - </text> - <text name="not worn instructions"> - Metti dei nuovi slip trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea nuove mutande" label_selected="Crea nuove mutande" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Mutande: - </text> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Gonna" name="Skirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: immodificabile - </text> - <text name="title_loading"> - [DESC]: in caricamento... - </text> - <text name="title_not_worn"> - [DESC]: non indossata - </text> - <text name="path"> - Ubicata in [PATH] - </text> - <text name="not worn instructions"> - Metti una nuova gonna trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea una nuova gonna" label_selected="Crea una nuova gonna" name="Create New"/> - <text name="no modify instructions"> - Non hai il permesso di modificare questo indumento. - </text> - <text name="Item Action Label" right="89"> - Gonna: - </text> - <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un'immagine"/> - <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/> - <button font="SansSerifSmall" label="Rimuovi l'indumento" label_selected="Rimuovi l'indumento" name="Take Off" width="115"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/> - <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/> - </panel> - <panel label="Tatuaggio" name="Tattoo"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: non può essere modificato - </text> - <text name="title_loading"> - [DESC]: caricamento in corso... - </text> - <text name="title_not_worn"> - [DESC]: non indossato - </text> - <text name="path"> - Collocato in [PATH] - </text> - <text name="not worn instructions"> - Metti un nuovo tatuaggio trascinandolo dal tuo inventario al avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea un nuovo tatuaggio" label_selected="Crea un nuovo tatuaggio" name="Create New"/> - <text name="no modify instructions"> - Non hai i permessi per modificare questo capo. - </text> - <text name="Item Action Label"> - Tatuaggio: - </text> - <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Tattuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/> - <button label="Ripristina" label_selected="Ripristina" name="Revert"/> - </panel> - <panel label="Alpha (Trasparenza)" name="Alpha"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: non può essere modificato - </text> - <text name="title_loading"> - [DESC]: caricamento in corso... - </text> - <text name="title_not_worn"> - [DESC]: non indossato - </text> - <text name="path"> - Collocato in [PATH] - </text> - <text name="not worn instructions"> - Metti una nuova alpha mask trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo. - </text> - <button label="Crea nuovo Alpha" label_selected="Crea nuovo Alpha" name="Create New"/> - <text name="no modify instructions"> - Non hai i permessi per modificare questo capo. - </text> - <text name="Item Action Label"> - Alpha: - </text> - <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha dell'occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/> - <button label="Togli" label_selected="Togli" name="Take Off"/> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/> - <button label="Ripristina" label_selected="Ripristina" name="Revert"/> - </panel> - </tab_container> - <scroll_container name="panel_container"/> - <button label="Informazioni script" label_selected="Informazioni script" name="script_info" tool_tip="Mostra gli script collegati al tuo avatar"/> - <button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/> - <button label="Annulla" label_selected="Annulla" name="Cancel"/> - <button label="OK" label_selected="OK" name="Ok"/> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_device_settings.xml b/indra/newview/skins/default/xui/it/floater_device_settings.xml deleted file mode 100644 index 97aa64086d..0000000000 --- a/indra/newview/skins/default/xui/it/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="OPZIONI CHAT VOCALE"/> diff --git a/indra/newview/skins/default/xui/it/floater_event.xml b/indra/newview/skins/default/xui/it/floater_event.xml index a0807e04c9..9a0105a589 100644 --- a/indra/newview/skins/default/xui/it/floater_event.xml +++ b/indra/newview/skins/default/xui/it/floater_event.xml @@ -1,72 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Evento" name="Event" title="DETTAGLI DELL'EVENTO"> - <floater.string name="none"> - nessuno +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + follows="all" + height="400" + can_resize="true" + help_topic="event_details" + label="Event" + layout="topleft" + name="Event" + save_rect="true" + save_visibility="false" + title="EVENT DETAILS" + width="600"> + <floater.string + name="loading_text"> + Caricamento in corso... </floater.string> - <floater.string name="notify"> - Avvisare - </floater.string> - <floater.string name="dont_notify"> - Non avvisare - </floater.string> - <floater.string name="moderate"> - Moderato - </floater.string> - <floater.string name="adult"> - Adulto - </floater.string> - <floater.string name="general"> - Generale - </floater.string> - <floater.string name="unknown"> - Sconosciuto - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Evento senza nome...di Doom De doom! Doom doom. - </text> - <text name="event_category"> - (nessuna categoria) - </text> - <text name="event_runby_label"> - Organizzato da: - </text> - <text initial_value="(recupero)" name="event_runby"/> - <text name="event_date_label"> - Data: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - Durata: - </text> - <text name="event_duration"> - 1 ora - </text> - <text name="event_covercharge_label"> - Costo: - </text> - <text name="event_cover"> - Gratis - </text> - <text name="event_location_label"> - Luogo: - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="Categoria:"/> - <text name="rating_value" value="sconosciuto"/> - <expandable_text name="event_desc"> - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - </expandable_text> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Crea evento"/> - <button name="god_delete_event_btn" tool_tip="Elimina evento"/> - <button label="Avvisami" name="notify_btn"/> - <button label="Teleport" name="teleport_btn"/> - <button label="Mappa" name="map_btn"/> - </layout_panel> - </layout_stack> + <floater.string + name="done_text"> + Done + </floater.string> + <web_browser + trusted_content="true" + follows="left|right|top|bottom" + layout="topleft" + left="10" + name="browser" + height="365" + width="580" + top="0"/> + <text + follows="bottom|left" + height="16" + layout="topleft" + left_delta="0" + name="status_text" + top_pad="10" + width="150" /> </floater> + diff --git a/indra/newview/skins/default/xui/it/floater_im.xml b/indra/newview/skins/default/xui/it/floater_im.xml deleted file mode 100644 index aa916adf2c..0000000000 --- a/indra/newview/skins/default/xui/it/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title=""> - <string name="only_user_message"> - Sei il solo residente presente nella sessione. - </string> - <string name="offline_message"> - [FIRST] [LAST] è offline. - </string> - <string name="invite_message"> - Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. - </string> - <string name="muted_message"> - Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato. - </string> - <string name="generic_request_error"> - Errore durante la richiesta, riprova più tardi. - </string> - <string name="insufficient_perms_error"> - Non hai sufficienti permessi. - </string> - <string name="session_does_not_exist_error"> - Questa sessione non esiste più - </string> - <string name="no_ability_error"> - Non hai questa abilitazione. - </string> - <string name="not_a_mod_error"> - Non sei un moderatore. - </string> - <string name="muted_error"> - Un moderatore di gruppo ti ha disabilitato dalla chat di testo. - </string> - <string name="add_session_event"> - Impossibile aggiungere residenti alla sessione chat con [RECIPIENT]. - </string> - <string name="message_session_event"> - Impossibile inviare il messaggio nella chat con [RECIPIENT]. - </string> - <string name="removed_from_group"> - Sei stato espulso dal gruppo. - </string> - <string name="close_on_no_ability"> - Non hai più le abilitazioni per rimanere nella sessione chat. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml index 8d395ea04b..3d9d17fc81 100644 --- a/indra/newview/skins/default/xui/it/floater_im_session.xml +++ b/indra/newview/skins/default/xui/it/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="Pannello di controllo IM" name="panel_im_control_panel"/> <layout_panel> <line_editor label="A" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/it/floater_my_friends.xml b/indra/newview/skins/default/xui/it/floater_my_friends.xml deleted file mode 100644 index faeba0a6d9..0000000000 --- a/indra/newview/skins/default/xui/it/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="CONTATTI"> - <tab_container name="friends_and_groups"> - <panel label="Amici" name="friends_panel"/> - <panel label="Gruppi" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml deleted file mode 100644 index dff5f33e57..0000000000 --- a/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Salva vestiario"> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Annulla" label_selected="Annulla" name="Cancel"/> - <text name="Save item as:"> - Salva quello che indosso -come nuovo vestiario: - </text> - <line_editor name="name ed"> - [DESC] (nuovo) - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml index c1ea8ec9c8..6389cbfbf7 100644 --- a/indra/newview/skins/default/xui/it/floater_pay.xml +++ b/indra/newview/skins/default/xui/it/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Persona"/> <text left="115" name="payee_name"> - [FIRST] [LAST] + Test Name That Is Extremely Long To Check Clipping </text> <button label="1 L$" label_selected="1 L$" left="118" name="fastpay 1" width="80"/> <button label="5 L$" label_selected="5 L$" left="210" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/it/floater_pay_object.xml b/indra/newview/skins/default/xui/it/floater_pay_object.xml index 37f549b5da..8805f3208e 100644 --- a/indra/newview/skins/default/xui/it/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/it/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Persona"/> <text left="120" name="payee_name"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text halign="left" left="5" name="object_name_label" width="110"> Mediante l'oggetto: diff --git a/indra/newview/skins/default/xui/it/floater_preview_classified.xml b/indra/newview/skins/default/xui/it/floater_preview_classified.xml deleted file mode 100644 index c617f81f7b..0000000000 --- a/indra/newview/skins/default/xui/it/floater_preview_classified.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFORMAZIONI RISERVATE"> - <floater.string name="Title"> - Riservato: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_event.xml b/indra/newview/skins/default/xui/it/floater_preview_event.xml deleted file mode 100644 index 1e1653e758..0000000000 --- a/indra/newview/skins/default/xui/it/floater_preview_event.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="INFORMAZIONI SULL'EVENTO"> - <floater.string name="Title"> - Evento: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml deleted file mode 100644 index d490416cc7..0000000000 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="SCORCIATOIA GESTURE"/> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml deleted file mode 100644 index eb0bc4d868..0000000000 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="SCORCIATOIA GESTURE"> - <text name="trigger_label"> - Chat: - </text> - <text name="key_label"> - Tastiera: - </text> - <combo_box label="Nessuno" name="modifier_combo"/> - <combo_box label="Nessuno" name="key_combo"/> - <text name="replace_text" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, se si sceglie di sostituire la parola chiave 'ciao' con 'buongiorno', nella chat il testo 'Volevo dire ciao' diventerà 'Volevo dire buongiorno' e verrà attivata la gesture."> - Sostituisci: - </text> - <line_editor name="replace_editor" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, se si sceglie di sostituire la parola chiave 'ciao' con 'buongiorno', nella chat il testo 'Volevo dire ciao' diventerà 'Volevo dire buongiorno' e verrà attivata la gesture"/> -</floater> diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml deleted file mode 100644 index d490416cc7..0000000000 --- a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="SCORCIATOIA GESTURE"/> diff --git a/indra/newview/skins/default/xui/it/floater_statistics.xml b/indra/newview/skins/default/xui/it/floater_statistics.xml deleted file mode 100644 index 00df1ff994..0000000000 --- a/indra/newview/skins/default/xui/it/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATISTICHE"/> diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml index fbe611407e..a8c985cb12 100644 --- a/indra/newview/skins/default/xui/it/floater_tools.xml +++ b/indra/newview/skins/default/xui/it/floater_tools.xml @@ -283,7 +283,7 @@ <combo_box.item label="Plastica" name="Plastic"/> <combo_box.item label="Gomma" name="Rubber"/> </combo_box> - <text name="text cut"> + <text name="text cut" left_delta="-10" width="170"> Riduci una sezione (inizio/fine) </text> <spinner label="I" name="cut begin"/> diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml index d2fd462062..4741d8d32f 100644 --- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Il mio avatar:"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Abbandona chiamata" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Abbandona chiamata" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml deleted file mode 100644 index 7c3754f004..0000000000 --- a/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title=""> - <button label="Salva" label_selected="Salva" name="Save"/> - <button label="Annulla" label_selected="Annulla" name="Cancel"/> - <text name="Save item as:"> - Salva oggetto nel mio inventario come: - </text> - <line_editor name="name ed"> - Nuovo [DESC] - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index 2346c19926..32483881b2 100644 --- a/indra/newview/skins/default/xui/it/notifications.xml +++ b/indra/newview/skins/default/xui/it/notifications.xml @@ -2035,10 +2035,10 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica Oggetto: [SUBJECT], Messaggio: [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] è Online + [NAME] è Online </notification> <notification name="FriendOffline"> - [FIRST] [LAST] è Offline + [NAME] è Offline </notification> <notification name="AddSelfFriend"> Anche se sei molto simpatico, non puoi aggiungere te stesso all'elenco degli amici. @@ -2105,9 +2105,6 @@ Questo potrebbe incidere sulla tua password. <notification name="CannotRemoveProtectedCategories"> Non è possibile rimuovere le categorie protette. </notification> - <notification name="OfferedCard"> - Hai offerto un biglietto da visita a [FIRST] [LAST] - </notification> <notification name="UnableToBuyWhileDownloading"> Impossibile acquistare l'oggetto durante il download dei dati. Riprova. @@ -2187,8 +2184,7 @@ Prova a selezionare una parte di terreno più piccola. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teleport"/> - <button name="Description" text="Descrizione"/> + <button name="Details" text="Descrizione"/> <button name="Cancel" text="Cancella"/> </form> </notification> @@ -2224,7 +2220,7 @@ Reinstalla il plugin o contatta il venditore se continui ad avere questi problem Gli oggetti che possiedi sul terreno selezionato ti sono stati restituiti nell'inventario. </notification> <notification name="OtherObjectsReturned"> - Gli oggetti selezionati sul terreno che è di proprietà di [FIRST] [LAST] sono stati restituiti nel suo inventario. + Gli oggetti selezionati sul terreno che è di proprietà di [NAME] sono stati restituiti nel suo inventario. </notification> <notification name="OtherObjectsReturned2"> Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente '[NAME]'. @@ -2434,7 +2430,7 @@ Riprova tra qualche istante. Offerta di amicizia rifiutata. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] ti offre il suo biglietto da visita. + [NAME] ti offre il suo biglietto da visita. Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente. <form name="form"> <button name="Accept" text="Accetta"/> @@ -2494,7 +2490,7 @@ Concedi questa richiesta? </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST] '[TITLE]' + [NAME] '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button name="Ignore" text="Ignora"/> @@ -2538,13 +2534,13 @@ Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] ha ricevuto un IM ed è stato automaticamente sbloccato. + [NAME] ha ricevuto un IM ed è stato automaticamente sbloccato. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato. + [NAME] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato. </notification> <notification name="AutoUnmuteByInventory"> - A [FIRST] [LAST] è stato offerto un elemento dell'Inventario e pertanto è stato automaticamente sbloccato. + A [NAME] è stato offerto un elemento dell'Inventario e pertanto è stato automaticamente sbloccato. </notification> <notification name="VoiceInviteGroup"> [NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP]. diff --git a/indra/newview/skins/default/xui/it/panel_audio_device.xml b/indra/newview/skins/default/xui/it/panel_audio_device.xml deleted file mode 100644 index 166db81999..0000000000 --- a/indra/newview/skins/default/xui/it/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="device_settings"> - <text name="Audio Devices"> - Periferiche audio - </text> - <text name="Input device (microphone):"> - Periferica di input (microfono): - </text> - <text name="Output device (speakers):"> - Periferica di Output (altoparlanti): - </text> - <text name="Input level:"> - Livello d'ingresso - </text> - <text_editor name="voice_intro_text1"> - Sposta il cursore per impostare il livello della tua voce per gli altri residenti. Per controllare il livello di ingresso, parla semplicemente nel microfono. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Cambia il volume usando il cursore"/> - <text name="wait_text"> - Attendi - </text> - <string name="default_text"> - Default - </string> -</panel> diff --git a/indra/newview/skins/default/xui/it/panel_friends.xml b/indra/newview/skins/default/xui/it/panel_friends.xml deleted file mode 100644 index cfe162a67b..0000000000 --- a/indra/newview/skins/default/xui/it/panel_friends.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="friends"> - <string name="Multiple"> - Più amici - </string> - <scroll_list name="friend_list" tool_tip="Tieni premuto shift o control mentre clicchi per selezionare più di un amico"> - <column name="icon_online_status" tool_tip="Stato Online"/> - <column label="Nome" name="friend_name" tool_tip="Nome"/> - <column name="icon_visible_online" tool_tip="Questo amico può vedere quando sei online"/> - <column name="icon_visible_map" tool_tip="Questo amico può localizzarti sulla mappa"/> - <column name="icon_edit_mine" tool_tip="Questo amico può modificare, cancellare o prendere i tuoi oggetti"/> - <column name="icon_edit_theirs" tool_tip="Puoi modificare gli oggetti di questo amico"/> - </scroll_list> - <button label="IM/Chiama" name="im_btn" tool_tip="Apri una sessione di IM - Messaggio Privato"/> - <button label="Profilo" name="profile_btn" tool_tip="Mostra foto, gruppi, ed altre informazioni"/> - <button label="Teleport" name="offer_teleport_btn" tool_tip="Offri a questo amico un teleport per dove sei tu ora"/> - <button label="Paga" name="pay_btn" tool_tip="Dai Linden dollar (L$) a questo amico"/> - <button label="Rimuovi" name="remove_btn" tool_tip="Rimuovi questa persona dalla tua lista amici"/> - <button label="Aggiungi" name="add_btn" tool_tip="Offri amicizia a un residente"/> -</panel> diff --git a/indra/newview/skins/default/xui/it/panel_groups.xml b/indra/newview/skins/default/xui/it/panel_groups.xml deleted file mode 100644 index 43fd36710e..0000000000 --- a/indra/newview/skins/default/xui/it/panel_groups.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="groups"> - <scroll_list bottom="50" name="group list"/> - <text bottom="16" height="32" name="groupdesc" width="268"> - Il tuo gruppo attualmente attivo è visualizzato -in grassetto. - </text> - <text bottom="3" name="groupcount" width="268"> - Appartieni a [COUNT] gruppo/i (su un massimo di [MAX]). - </text> - <button label="IM/Chiama" name="IM" tool_tip="Apri una sessione di IM/Instant Messages"/> - <button label="Informazioni" name="Info"/> - <button label="Attiva" name="Activate"/> - <button label="Abbandona" name="Leave"/> - <button label="Crea..." name="Create"/> - <button label="Cerca..." name="Search..."/> -</panel> diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml deleted file mode 100644 index 7ffe972181..0000000000 --- a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name"> - CHAT NEI DINTORNI - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/it/panel_online_status.xml b/indra/newview/skins/default/xui/it/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/it/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml index ef7aaf2e8c..4620d72977 100644 --- a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml @@ -13,9 +13,9 @@ 50 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="L'elemento multimediale è in caricamento"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/it/panel_region_general_layout.xml b/indra/newview/skins/default/xui/it/panel_region_general_layout.xml deleted file mode 100644 index 4cf31f4b6e..0000000000 --- a/indra/newview/skins/default/xui/it/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Regione" name="General"> - <text name="region_text_lbl"> - Regione: - </text> - <text name="region_text"> - sconosciuto - </text> - <text name="version_channel_text_lbl"> - Versione: - </text> - <text name="version_channel_text"> - sconosciuto - </text> - <text name="region_type_lbl"> - Tipo: - </text> - <text name="region_type"> - sconosciuto - </text> - <check_box label="Impedisci Terraform" name="block_terraform_check"/> - <check_box label="Impedisci volo" name="block_fly_check"/> - <check_box label="Permetti danni" name="allow_damage_check"/> - <check_box label="Limita spinte" name="restrict_pushobject"/> - <check_box label="Permetti la rivendita dei terreni" name="allow_land_resell_check"/> - <check_box label="Permetti l'unione/divisione del terreno" name="allow_parcel_changes_check"/> - <check_box label="Impedisci la visualizzazione del terreno nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti alla gente di vedere questa regione e i suoi lotti nei risultati dellla ricerca"/> - <spinner label="N. massimo di avatar" name="agent_limit_spin"/> - <spinner label="Bonus oggetto" name="object_bonus_spin"/> - <text label="Categoria di accesso" name="access_text"> - Categoria: - </text> - <combo_box label="Moderato" name="access_combo"> - <combo_box.item label="Adulti" name="Adult"/> - <combo_box.item label="Moderato" name="Mature"/> - <combo_box.item label="Generale" name="PG"/> - </combo_box> - <button label="Applica" name="apply_btn"/> - <button label="Teleport a casa un residente..." name="kick_btn"/> - <button label="Teleport a casa tutti i residenti..." name="kick_all_btn"/> - <button label="Invia messaggio alla regione..." name="im_btn"/> - <button label="Gestisci telehub..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 4fc0d19199..dfe635182e 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -783,7 +783,7 @@ <string name="xml_file"> File XML </string> - <string name="dot_raw_file"> + <string name="raw_file"> File RAW </string> <string name="compressed_image_files"> @@ -3478,7 +3478,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE]. Sei l'unico utente di questa sessione. </string> <string name="offline_message"> - [FIRST] [LAST] è offline. + [NAME] è offline. </string> <string name="invite_message"> Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat. diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml index be24960c6e..d8d0164618 100644 --- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml +++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml @@ -43,7 +43,7 @@ 全員: </text> <check_box label="コピー" name="everyone_copy"/> - <text name="NextOwnerLabel" left="160"> + <text name="NextOwnerLabel"> 次ã®æ‰€æœ‰è€…: </text> <check_box label="ä¿®æ£" name="next_owner_modify"/> diff --git a/indra/newview/skins/default/xui/ja/floater_bumps.xml b/indra/newview/skins/default/xui/ja/floater_bumps.xml index 8a1e19b852..c7e4dd348f 100644 --- a/indra/newview/skins/default/xui/ja/floater_bumps.xml +++ b/indra/newview/skins/default/xui/ja/floater_bumps.xml @@ -4,19 +4,19 @@ 検出ãªã— </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST]ãŒã€ã‚ãªãŸã«ã¶ã¤ã‹ã‚Šã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ã‚ãªãŸã«ã¶ã¤ã‹ã‚Šã¾ã—ãŸã€‚ </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’プッシュã—ã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã‚’プッシュã—ã¾ã—ãŸã€‚ </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST]ãŒã€ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚ </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST]ãŒã€ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚ </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚ + [TIME] [NAME]ãŒã€ç‰©ç†ã‚ªãƒ–ジェクトをã‚ãªãŸã«å½“ã¦ã¾ã—ãŸã€‚ </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/ja/floater_device_settings.xml b/indra/newview/skins/default/xui/ja/floater_device_settings.xml deleted file mode 100644 index 3ae7356fb6..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="ボイスãƒãƒ£ãƒƒãƒˆæ©Ÿå™¨ã®è¨å®š"/> diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml index 671f9077d9..9e99c4a931 100644 --- a/indra/newview/skins/default/xui/ja/floater_event.xml +++ b/indra/newview/skins/default/xui/ja/floater_event.xml @@ -1,69 +1,40 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="イベント" name="Event" title="イベント詳細"> - <floater.string name="none"> - ãªã— +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + follows="all" + height="400" + can_resize="true" + help_topic="event_details" + label="Event" + layout="topleft" + name="Event" + save_rect="true" + save_visibility="false" + title="EVENT DETAILS" + width="600"> + <floater.string + name="loading_text"> + ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°... </floater.string> - <floater.string name="notify"> - 知らã›ã‚‹ - </floater.string> - <floater.string name="dont_notify"> - 知らã›ãªã„ - </floater.string> - <floater.string name="moderate"> - Moderate - </floater.string> - <floater.string name="adult"> - Adult - </floater.string> - <floater.string name="general"> - General - </floater.string> - <floater.string name="unknown"> - ä¸æ˜Ž - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Nameless Event...of Doom! De doom! Doom doom. - </text> - <text name="event_category"> - (カテゴリãªã—) - </text> - <text name="event_runby_label"> - 主催者: - </text> - <text initial_value="(å–å¾—ä¸ï¼‰" name="event_runby"/> - <text name="event_date_label"> - 日付: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - 期間: - </text> - <text name="event_duration"> - 1 時間 - </text> - <text name="event_covercharge_label"> - ã‚«ãƒãƒ¼ãƒãƒ£ãƒ¼ã‚¸ï¼š - </text> - <text name="event_cover"> - ç„¡æ–™ - </text> - <text name="event_location_label"> - å ´æ‰€ï¼š - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="レーティング区分:"/> - <text name="rating_value" value="ä¸æ˜Ž"/> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="イベント作æˆ"/> - <button name="god_delete_event_btn" tool_tip="イベント削除"/> - <button label="知らã›ã‚‹" name="notify_btn"/> - <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/> - <button label="地図" name="map_btn"/> - </layout_panel> - </layout_stack> + <floater.string + name="done_text"> + Done + </floater.string> + <web_browser + trusted_content="true" + follows="left|right|top|bottom" + layout="topleft" + left="10" + name="browser" + height="365" + width="580" + top="0"/> + <text + follows="bottom|left" + height="16" + layout="topleft" + left_delta="0" + name="status_text" + top_pad="10" + width="150" /> </floater> + diff --git a/indra/newview/skins/default/xui/ja/floater_first_time_tip.xml b/indra/newview/skins/default/xui/ja/floater_first_time_tip.xml deleted file mode 100644 index fce9185b8a..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_first_time_tip.xml +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="set_name_in_the_cladd"> - <check_box label="クイックヒントをオフã«ã™ã‚‹" name="DontShowFirstTimeTip_checkbox"/> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im.xml b/indra/newview/skins/default/xui/ja/floater_im.xml deleted file mode 100644 index 2e8993ec21..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_im.xml +++ /dev/null @@ -1,46 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="インスタント・メッセージ"> - <string name="only_user_message"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã¯ã€ã‚ãªãŸã—ã‹ã„ã¾ã›ã‚“。 - </string> - <string name="offline_message"> - [FIRST] [LAST]ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ - </string> - <string name="invite_message"> - ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。 - </string> - <string name="muted_message"> - ã“ã®ä½äººã‚’ブãƒãƒƒã‚¯ã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ã‚‹ã¨ã€ãƒ–ãƒãƒƒã‚¯ãŒè‡ªå‹•çš„ã«è§£é™¤ã•ã‚Œã¾ã™ã€‚ - </string> - <string name="generic_request_error"> - è¦æ±‚ä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。 - </string> - <string name="insufficient_perms_error"> - ã‚ãªãŸã«ã¯å……分ãªæ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="session_does_not_exist_error"> - ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¯æ—¢ã«åˆ‡æ–ã•ã‚Œã¦ã„ã¾ã™ã€‚ - </string> - <string name="no_ability_error"> - ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="not_a_mod_error"> - ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚ã‚Šã¾ã›ã‚“。 - </string> - <string name="muted_error"> - グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚ストãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—㟠- </string> - <!-- ALL of the event strings should have [RECIPIENT] in them --> - <string name="add_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ä½äººã‚’è¿½åŠ ã§ãã¾ã›ã‚“。 - </string> - <string name="message_session_event"> - [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ - </string> - <string name="removed_from_group"> - ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•ã‚Œã¾ã—ãŸã€‚ - </string> - <string name="close_on_no_ability"> - ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“ - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/ja/floater_im_session.xml b/indra/newview/skins/default/xui/ja/floater_im_session.xml index 6646cc0b25..dfa1c85ca2 100644 --- a/indra/newview/skins/default/xui/ja/floater_im_session.xml +++ b/indra/newview/skins/default/xui/ja/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="IM コントãƒãƒ¼ãƒ«ãƒ‘ãƒãƒ«" name="panel_im_control_panel"/> <layout_panel> <line_editor label="宛先" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/floater_my_friends.xml b/indra/newview/skins/default/xui/ja/floater_my_friends.xml deleted file mode 100644 index b55cdde5b5..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater min_width="500" name="floater_my_friends" title="連絡先"> - <tab_container name="friends_and_groups"> - <panel label="フレンド" name="friends_panel"/> - <panel label="グループ" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml index 39bc37bc6c..83a3c641f9 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="ä½äºº"/> <text name="payee_name"> - [FIRST] [LAST] + Test Name That Is Extremely Long To Check Clipping </text> <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/ja/floater_pay_object.xml b/indra/newview/skins/default/xui/ja/floater_pay_object.xml index ffd57ab67b..637ad496ef 100644 --- a/indra/newview/skins/default/xui/ja/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/ja/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="ä½äºº"/> <text name="payee_name"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text name="object_name_label"> オブジェクトを介ã—ã¦ï¼š diff --git a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml b/indra/newview/skins/default/xui/ja/floater_preview_classified.xml deleted file mode 100644 index ba3bb028b2..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_preview_classified.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šæƒ…å ±"> - <floater.string name="Title"> - クラシファイド広告: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_event.xml b/indra/newview/skins/default/xui/ja/floater_preview_event.xml deleted file mode 100644 index 21f57ca7a3..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_preview_event.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="ã‚¤ãƒ™ãƒ³ãƒˆæƒ…å ±"> - <floater.string name="Title"> - イベント: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml deleted file mode 100644 index 682b295a14..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml deleted file mode 100644 index e96a43d0c1..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"> - <text name="trigger_label"> - ãƒãƒ£ãƒƒãƒˆï¼š - </text> - <text name="key_label"> - ã‚ーボード: - </text> - <combo_box label="ãªã—" name="modifier_combo" width="60"/> - <combo_box label="ãªã—" name="key_combo" width="60"/> - <text name="replace_text" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚ã‚Šã¾ã™ã€‚"> - ç½®ãæ›ãˆï¼š - </text> - <line_editor name="replace_editor" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚ã‚Šã¾ã™ã€‚"/> -</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml deleted file mode 100644 index 682b295a14..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ジェスãƒãƒ£ãƒ¼ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆ"/> diff --git a/indra/newview/skins/default/xui/ja/floater_statistics.xml b/indra/newview/skins/default/xui/ja/floater_statistics.xml deleted file mode 100644 index de83e97b80..0000000000 --- a/indra/newview/skins/default/xui/ja/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="統計"/> diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml index 4b95aa544f..0caca22bc1 100644 --- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="マイ ã‚¢ãƒã‚¿ãƒ¼ï¼š"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="コール終了" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="コール終了" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index e0b72e31de..c0af0e03ff 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -2082,10 +2082,10 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã 件å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ + [NAME] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ </notification> <notification name="FriendOffline"> - [FIRST] [LAST] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ + [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ </notification> <notification name="AddSelfFriend"> 残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 @@ -2153,9 +2153,6 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã <notification name="CannotRemoveProtectedCategories"> ä¿è·ã•ã‚ŒãŸã‚«ãƒ†ã‚´ãƒªã¯å‰Šé™¤ã§ãã¾ã›ã‚“。 </notification> - <notification name="OfferedCard"> - [FIRST] [LAST] ã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Šã¾ã—ãŸã€‚ - </notification> <notification name="UnableToBuyWhileDownloading"> オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 @@ -2235,8 +2232,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã [NAME] [DATE] <form name="form"> - <button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/> - <button name="Description" text="説明"/> + <button name="Details" text="説明"/> <button name="Cancel" text="å–り消ã—"/> </form> </notification> @@ -2274,7 +2270,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã </notification> <notification name="OtherObjectsReturned"> é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ - [FIRST] [LAST] + [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="OtherObjectsReturned2"> @@ -2489,7 +2485,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + [NAME] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ <form name="form"> <button name="Accept" text="å—ã‘入れる"/> @@ -2549,7 +2545,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST] ã®ã€Œ [TITLE] 〠+ [NAME] ã®ã€Œ <nolink>[TITLE]</nolink> 〠[MESSAGE] <form name="form"> <button name="Ignore" text="無視ã™ã‚‹"/> @@ -2593,13 +2589,13 @@ M ã‚ーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚ </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + [NAME] ã¯ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] ã¯ãŠé‡‘ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + [NAME] ã¯ãŠé‡‘ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ + [NAME] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚Šã€è‡ªå‹•çš„ã«ãƒ–ãƒãƒƒã‚¯ãŒè§£é™¤ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="VoiceInviteGroup"> [NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚åŠ ã—ã¾ã—ãŸã€‚ diff --git a/indra/newview/skins/default/xui/ja/panel_audio_device.xml b/indra/newview/skins/default/xui/ja/panel_audio_device.xml deleted file mode 100644 index 2352c60989..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_audio_device.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="device_settings"> - <text name="Audio Devices"> - オーディオ機器 - </text> - <text name="Output device (speakers):"> - 出力機器 (スピーカー): - </text> - <text name="Input device (microphone):"> - 入力機器(マイクãƒãƒ•ã‚©ãƒ³): - </text> - <text name="Input level:"> - 入力レベル - </text> - <text_editor name="voice_intro_text1"> - スライダを調節ã—ã¦ã€ä»–ã®ä½äººã«èžã“ãˆã‚‹ã‚ãªãŸã®éŸ³é‡ã‚’制御ã—ã¾ã™ã€‚マイクãƒãƒ•ã‚©ãƒ³ã«å‘ã‹ã£ã¦è©±ã™ã ã‘ã§ã€å…¥åŠ›ãƒ¬ãƒ™ãƒ«ã‚’テストã§ãã¾ã™ã€‚ - </text_editor> - <volume_slider name="mic_volume_slider" - tool_tip="ã“ã®ã‚¹ãƒ©ã‚¤ãƒ€ãƒ¼ã‚’使用ã—ã¦ã€ãƒœãƒªãƒ¥ãƒ¼ãƒ を変ãˆã¦ãã ã•ã„。" /> - <text name="wait_text"> - ãŠå¾…ã¡ãã ã•ã„ - </text> - <text name="default_text"> - デフォルト - </text> -</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml index 2aba4edc0d..334cf54a4d 100644 --- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml @@ -46,7 +46,7 @@ <text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/> <text name="title_partner_text" value="マイパートナー:"/> <panel name="partner_data_panel"> - <name_box initial_value="(å–å¾—ä¸ï¼‰" name="partner_text" value="[FIRST] [LAST]"/> + <name_box initial_value="(å–å¾—ä¸ï¼‰" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] 編集]" width="100"/> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_friends.xml b/indra/newview/skins/default/xui/ja/panel_friends.xml deleted file mode 100644 index 0c7114dbb7..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_friends.xml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="friends"> - <string name="Multiple"> - 複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ - </string> - <scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shift ã‚ーã¾ãŸã¯ Ctrl ã‚ーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚"> - <column name="icon_online_status" tool_tip="オンライン状態"/> - <column label="åå‰" name="friend_name" tool_tip="åå‰"/> - <column name="icon_visible_online" tool_tip="フレンドã¯ã€ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <column name="icon_visible_map" tool_tip="フレンドã¯ã€åœ°å›³ã§ã‚ãªãŸã®å±…å ´æ‰€ã‚’è¦‹ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <column name="icon_edit_mine" tool_tip="フレンドã¯ã€ã‚ªãƒ–ジェクトを編集ã€å‰Šé™¤ã€ã¾ãŸã¯å–å¾—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - <column name="icon_edit_theirs" tool_tip="ã‚ãªãŸã¯ã€ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/> - </scroll_list> - <panel name="rights_container"> - <text name="friend_name_label" right="-10"> - フレンドをé¸æŠžã—ã¦æ¨©åˆ©ã‚’変更... - </text> - <check_box label="オンライン状態ã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•ãƒ¬ãƒ³ãƒ‰ãƒªã‚¹ãƒˆã§ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’確èªã§ãるよã†è¨å®šã—ã¾ã™"/> - <check_box label="世界地図上ã§ã‚ãªãŸã®å±…å ´æ‰€ã‚’æ¤œç´¢å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨å®šã—ã¾ã™"/> - <check_box label="オブジェクトã®ä¿®æ£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ç§ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’æ”¹é€ ã™ã‚‹è¨±å¯ã‚’与ãˆã¾ã™"/> - <text name="process_rights_label"> - 権利変更をプãƒã‚»ã‚¹ä¸... - </text> - </panel> - <pad left="-95"/> - <button label="IM・コール" name="im_btn" tool_tip="インスタントメッセージセッションを開ãã¾ã™ã€‚" width="90"/> - <button label="プãƒãƒ•ã‚£ãƒ¼ãƒ«" name="profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãŠã‚ˆã³ãã®ä»–ã®æƒ…å ±ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚" width="90"/> - <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ã€ã‚ãªãŸã®ç¾åœ¨åœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/> - <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã«ã‚ã’ã¾ã™ã€‚" width="90"/> - <button label="削除" name="remove_btn" tool_tip="ã“ã®äººç‰©ã‚’フレンドリストã‹ã‚‰å¤–ã—ã¾ã™ã€‚" width="90"/> - <button label="è¿½åŠ " name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™ã€‚" width="90"/> -</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml index 4b3a7f880b..016dc97ab6 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml @@ -48,7 +48,7 @@ ã‚ãªãŸã®è²¢çŒ®ï¼š </text> <text name="your_contribution_units"> - m² + 平方メートル </text> <text name="your_contribution_max_value"> (最大 [AMOUNT]) diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml index be203b0761..d40dedf566 100644 --- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml +++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml @@ -20,7 +20,7 @@ Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ <name_list name="member_list"> <name_list.columns label="メンãƒãƒ¼" name="name"/> <name_list.columns label="寄付" name="donated"/> - <name_list.columns label="ãƒã‚°ã‚¤ãƒ³" name="online"/> + <name_list.columns label="ステータス" name="online"/> </name_list> <button label="招待" name="member_invite"/> <button label="追放" name="member_eject"/> @@ -47,7 +47,7 @@ Ctrl ã‚ーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨ <filter_editor label="役割をé¸åˆ¥" name="filter_input"/> <scroll_list name="role_list"> <scroll_list.columns label="役割" name="name"/> - <scroll_list.columns label="タイトル" name="title"/> + <scroll_list.columns label="肩書ã" name="title"/> <scroll_list.columns label="#" name="members"/> </scroll_list> <button label="æ–°ã—ã„役割" name="role_create"/> diff --git a/indra/newview/skins/default/xui/ja/panel_groups.xml b/indra/newview/skins/default/xui/ja/panel_groups.xml deleted file mode 100644 index de81a6431a..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_groups.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="groups"> - <text name="groupdesc"> - アクティブãªã‚°ãƒ«ãƒ¼ãƒ—ã¯å¤ªå—ã§è¡¨ç¤ºã•ã‚Œã¦ã„ã¾ã™ - </text> - <text name="groupcount" width="270"> - [COUNT] ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX]) - </text> - <button label="IM・コール" name="IM" - tool_tip="インスタントメッセージ・セッションを開ã" /> - <button label="æƒ…å ±" name="Info" /> - <button label="アクティブ" name="Activate" /> - <button label="抜ã‘ã‚‹" name="Leave" /> - <button label="作æˆ..." name="Create" /> - <button label="検索..." name="Search..." /> -</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml deleted file mode 100644 index c0549c8ae9..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name"> - è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/ja/panel_notifications_channel.xml b/indra/newview/skins/default/xui/ja/panel_notifications_channel.xml index 5723535fd2..aff427ed49 100644 --- a/indra/newview/skins/default/xui/ja/panel_notifications_channel.xml +++ b/indra/newview/skins/default/xui/ja/panel_notifications_channel.xml @@ -1,15 +1,19 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="notifications_panel"> <layout_stack name="stack1"> - <scroll_list name="notifications_list"> - <column label="åå‰" name="name"/> - <column label="コンテンツ" name="content"/> - <column label="日付" name="date"/> - </scroll_list> - <scroll_list name="notification_rejects_list"> - <column label="åå‰" name="name"/> - <column label="コンテンツ" name="content"/> - <column label="日付" name="date"/> - </scroll_list> + <layout_panel name="notifications_list_panel"> + <scroll_list name="notifications_list"> + <column label="åå‰" name="name"/> + <column label="コンテンツ" name="content"/> + <column label="日付" name="date"/> + </scroll_list> + </layout_panel> + <layout_panel name="rejects_list_panel"> + <scroll_list name="notification_rejects_list"> + <column label="åå‰" name="name"/> + <column label="コンテンツ" name="content"/> + <column label="日付" name="date"/> + </scroll_list> + </layout_panel> </layout_stack> </panel> diff --git a/indra/newview/skins/default/xui/ja/panel_online_status.xml b/indra/newview/skins/default/xui/ja/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml index a9897c7ae4..5506373eb0 100644 --- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml @@ -7,9 +7,9 @@ 0.2 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="ãƒãƒ¼ãƒ‡ã‚£ãƒ³ã‚°"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml deleted file mode 100644 index 188a60eb60..0000000000 --- a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="リージョン(地域)" name="General"> - <text name="region_text_lbl"> - 地域: - </text> - <text left_delta="70" name="region_text"> - ä¸æ˜Ž - </text> - <text name="version_channel_text_lbl"> - ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š - </text> - <text left_delta="70" name="version_channel_text"> - ä¸æ˜Ž - </text> - <text name="region_type_lbl"> - 種類: - </text> - <text left_delta="70" name="region_type"> - ä¸æ˜Ž - </text> - <check_box label="地形編集をブãƒãƒƒã‚¯" name="block_terraform_check"/> - <check_box label="飛行をブãƒãƒƒã‚¯" name="block_fly_check"/> - <check_box label="ダメージを許å¯" name="allow_damage_check"/> - <check_box label="プッシュを制é™" name="restrict_pushobject"/> - <check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/> - <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/> - <check_box label="土地ã®æ¤œç´¢è¡¨ç¤ºã‚’ブãƒãƒƒã‚¯" name="block_parcel_search_check" tool_tip="検索çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨å®šã§ã™"/> - <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" label_width="110" name="agent_limit_spin" width="190"/> - <spinner label="物体ボーナス" label_width="110" name="object_bonus_spin" width="190"/> - <text label="レーティング区分" name="access_text"> - レーティング区分: - </text> - <combo_box label="Moderate" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Moderate" name="Mature"/> - <combo_box.item label="General" name="PG"/> - </combo_box> - <button label="é©ç”¨" name="apply_btn"/> - <button label="ä½äºº 1 åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/> - <button label="ä½äººå…¨å“¡ã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/> - <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/> - <button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 072ae6c630..187f21257a 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -798,7 +798,7 @@ <string name="xml_file"> XML ファイル </string> - <string name="dot_raw_file"> + <string name="raw_file"> RAW ファイル </string> <string name="compressed_image_files"> @@ -3574,7 +3574,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンãƒãƒ¼ãƒ‰ã—ã¦ãã ã ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚ </string> <string name="offline_message"> - [FIRST] [LAST] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ + [NAME] ã¯ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã§ã™ã€‚ </string> <string name="invite_message"> ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。 diff --git a/indra/newview/skins/default/xui/nl/floater_bumps.xml b/indra/newview/skins/default/xui/nl/floater_bumps.xml index df9a99d62e..516b59658d 100644 --- a/indra/newview/skins/default/xui/nl/floater_bumps.xml +++ b/indra/newview/skins/default/xui/nl/floater_bumps.xml @@ -4,18 +4,18 @@ Geen gedetecteerd </string> <string name="bump"> - [TIME] [FIRST] [LAST] botste tegen u aan + [TIME] [NAME] botste tegen u aan </string> <string name="llpushobject"> - [TIME] [FIRST] [LAST] duwde u met een script + [TIME] [NAME] duwde u met een script </string> <string name="selected_object_collide"> - [TIME] [FIRST] [LAST] raakte u met een object + [TIME] [NAME] raakte u met een object </string> <string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] raakte u met een gescript object + [TIME] [NAME] raakte u met een gescript object </string> <string name="physical_object_collide"> - [TIME] [FIRST] [LAST] raakte u met een fysiek object + [TIME] [NAME] raakte u met een fysiek object </string> </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml deleted file mode 100644 index e6a4ed7a27..0000000000 --- a/indra/newview/skins/default/xui/nl/floater_customize.xml +++ /dev/null @@ -1,469 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="UITERLIJK"> - <tab_container name="customize tab container" tab_min_width="120"> - <placeholder label="Lichaamsdelen" name="body_parts_placeholder"/> - <panel label="Postuur" name="Shape" left="124" width="389"> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - <button label="Lichaam" label_selected="Lichaam" name="Body"/> - <button label="Hoofd" label_selected="Hoofd" name="Head"/> - <button label="Ogen" label_selected="Ogen" name="Eyes"/> - <button label="Oren" label_selected="Oren" name="Ears"/> - <button label="Neus" label_selected="Neus" name="Nose"/> - <button label="Mond" label_selected="Mond" name="Mouth"/> - <button label="Kin" label_selected="Kin" name="Chin"/> - <button label="Torso" label_selected="Torso" name="Torso"/> - <button label="Benen" label_selected="Benen" name="Legs"/> - <radio_group name="sex radio"> - <radio_item name="radio" label="Vrouw" /> - <radio_item name="radio2" label="Man" /> - </radio_group> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuwe postuur door hem vanuit uw inventaris naar uw avatar -te slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Postuur: - </text> - <button label="Nieuw postuur maken" label_selected="Nieuw postuur maken" name="Create New"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - </panel> - <panel label="Huid" name="Skin"> - <button width="104" label="Huidskleur" label_selected="Huidskleur" name="Skin Color"/> - <button width="104" label="Gezichtsdetail" label_selected="Gezichtsdetail" name="Face Detail"/> - <button width="104" label="Make-up" label_selected="Make-up" name="Makeup"/> - <button width="104" label="Lichaam detail" label_selected="Lichaam detail" name="Body Detail"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuwe huid door haar vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Huid: - </text> - <texture_picker width="104" label="Hoofd tatoeages" name="Head Tattoos" tool_tip="Klik om een afbeelding te kiezen"/> - <texture_picker width="104" label="Bovenste tatoeage" name="Upper Tattoos" tool_tip="Klik om een afbeelding te kiezen"/> - <texture_picker width="104" label="Onderste tatoeages" name="Lower Tattoos" tool_tip="Klik om een afbeelding te kiezen"/> - <button label="Nieuwe huid maken" label_selected="Nieuwe huid maken" name="Create New"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Haar" name="Hair"> - <button label="Kleur" label_selected="Kleur" name="Color"/> - <button label="Stijl" label_selected="Stijl" name="Style"/> - <button label="Wenkbrauwen" label_selected="Wenkbrauwen" name="Eyebrows"/> - <button label="Aangezicht" label_selected="Aangezicht" name="Facial"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag nieuw haar door het vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan nieuw creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Haar: - </text> - <texture_picker label="Textuur" name="Texture" tool_tip="Klik om een afbeelding te kiezen"/> - <button label="Nieuw haar maken" label_selected="Nieuw haar maken" name="Create New"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Ogen" name="Eyes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag nieuwe ogen door ze vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Ogen: - </text> - <texture_picker label="Iris" name="Iris" tool_tip="Klik om een afbeelding te kiezen"/> - <button label="Nieuwe ogen maken" label_selected="Nieuwe ogen maken" name="Create New"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Kleding" name="clothes_placeholder"/> - <panel label="Hemd" name="Shirt"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuw hemd maken" label_selected="Nieuw hemd maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuw hemd door hem vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Hemd: - </text> - </panel> - <panel label="Broek" name="Pants"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe broek maken" label_selected="Nieuwe broek maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuwe broek door hem vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Broek: - </text> - </panel> - <panel label="Schoenen" name="Shoes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag nieuwe schoenen door ze vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Schoenen: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe schoenen maken" label_selected="Nieuwe schoenen maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Sokken" name="Socks"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag nieuwe sokken door ze vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Sokken: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe sokken maken" label_selected="Nieuwe sokken maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Jas" name="Jacket"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuwe jas door hem vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Jas: - </text> - <texture_picker width="78" label="Bovenste stof" name="Upper Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <texture_picker width="78" label="Onderste stof" name="Lower Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch width="78" label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe jas maken" label_selected="Nieuwe jas maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Handschoenen" name="Gloves"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag nieuwe handschoenen door ze vanuit uw inventaris naar uw avatar -te slepen. Ook kunt u zelf van begin af aan nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Handschoenen: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe handschoenen maken" label_selected="Nieuwe handschoenen maken" name="Create New" width="190"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Onderhemd" name="Undershirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuw onderhemd door hem vanuit uw inventaris naar uw avatar -te slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Onderhemd: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuw onderhemd maken" label_selected="Nieuw onderhemd maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Onderbroek" name="Underpants"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuwe onderbroek door hem vanuit uw inventaris naar uw -avatar te slepen. Ook kunt u zelf van begin af aan een nieuwe creëren -en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Onderbroek: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe onderbroek maken" label_selected="Nieuwe onderbroek maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - <panel label="Rok" name="Skirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: Kan niet wijzigen - </text> - <text name="title_loading"> - [DESC]: laden... - </text> - <text name="title_not_worn"> - [DESC]: niet gedragen - </text> - <text name="path"> - Gelegen in [PATH] - </text> - <text name="not worn instructions"> - Draag een nieuwe rok door hem vanuit uw inventaris naar uw avatar te -slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen. - </text> - <text name="no modify instructions"> - U heeft geen permissie om dit draagbare item te wijzigen. - </text> - <text name="Item Action Label"> - Rok: - </text> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik om een afbeelding te kiezen"/> - <color_swatch label="Kleur/tint" name="Color/Tint" tool_tip="Klik om de kleurkiezer te openen"/> - <button label="Nieuwe rok maken" label_selected="Nieuwe rok maken" name="Create New"/> - <button label="Uitdoen" label_selected="Uitdoen" name="Take Off"/> - <button label="Opslaan" label_selected="Opslaan" name="Save"/> - <button label="Opslaan als..." label_selected="Opslaan als..." name="Save As"/> - <button label="Herstel" label_selected="Herstel" name="Revert"/> - </panel> - </tab_container> - <scroll_container name="panel_container"/> - <button label="Annuleren" label_selected="Annuleren" name="Cancel"/> - <button label="OK" label_selected="OK" name="Ok"/> - <button label="Maak kleding..." label_selected="Maak kleding..." name="Make Outfit" left="110"/> -</floater> diff --git a/indra/newview/skins/default/xui/nl/floater_event.xml b/indra/newview/skins/default/xui/nl/floater_event.xml new file mode 100644 index 0000000000..45ec58abdf --- /dev/null +++ b/indra/newview/skins/default/xui/nl/floater_event.xml @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + follows="all" + height="400" + can_resize="true" + help_topic="event_details" + label="Event" + layout="topleft" + name="Event" + save_rect="true" + save_visibility="false" + title="EVENT DETAILS" + width="600"> + <floater.string + name="loading_text"> + Laden... + </floater.string> + <floater.string + name="done_text"> + Done + </floater.string> + <web_browser + trusted_content="true" + follows="left|right|top|bottom" + layout="topleft" + left="10" + name="browser" + height="365" + width="580" + top="0"/> + <text + follows="bottom|left" + height="16" + layout="topleft" + left_delta="0" + name="status_text" + top_pad="10" + width="150" /> +</floater> + diff --git a/indra/newview/skins/default/xui/nl/floater_im.xml b/indra/newview/skins/default/xui/nl/floater_im.xml deleted file mode 100644 index 3167af5321..0000000000 --- a/indra/newview/skins/default/xui/nl/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Instant Message"> - <string name="only_user_message"> - U bent de enige gebruiker in deze sessie. - </string> - <string name="offline_message"> - [FIRST] [LAST] is offline. - </string> - <string name="invite_message"> - Klik de [BUTTON NAME] knop om deze voicechat te accepteren/verbinden. - </string> - <string name="muted_message"> - U heeft deze inwoner genegeerd. Door het sturen van een bericht zal deze automatisch van de negeerlijst verwijderd worden. - </string> - <string name="generic_request_error"> - Fout tijdens het maken van het verzoek, probeer het later nog een keer. - </string> - <string name="insufficient_perms_error"> - U heeft niet voldoende permissies. - </string> - <string name="session_does_not_exist_error"> - De sessie bestaat niet meer - </string> - <string name="no_ability_error"> - U beschikt niet over die mogelijkheid. - </string> - <string name="not_a_mod_error"> - U bent geen sessie moderateur - </string> - <string name="muted_error"> - Een groepsmoderator heeft uw textchat uitgeschakeld. - </string> - <string name="add_session_event"> - Kan geen gebruikers toevoegen aan chatsessie met [RECIPIENT]. - </string> - <string name="message_session_event"> - Kan uw bericht niet versturen naar de chatsessie met [RECIPIENT]. - </string> - <string name="removed_from_group"> - U bent verwijderd uit de groep. - </string> - <string name="close_on_no_ability"> - U heeft niet langer de mogelijkheid om in deze chatsessie te zijn. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/nl/floater_my_friends.xml b/indra/newview/skins/default/xui/nl/floater_my_friends.xml deleted file mode 100644 index 8d709d3c00..0000000000 --- a/indra/newview/skins/default/xui/nl/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="CONTACTEN"> - <tab_container name="friends_and_groups"> - <panel label="Vrienden" name="friends_panel"/> - <panel label="Groepen" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/nl/floater_pay.xml b/indra/newview/skins/default/xui/nl/floater_pay.xml index 4018ebdc93..f2b34d78d7 100644 --- a/indra/newview/skins/default/xui/nl/floater_pay.xml +++ b/indra/newview/skins/default/xui/nl/floater_pay.xml @@ -10,7 +10,7 @@ Betaal inwoner: </text> <text name="payee_name" left="110"> - [FIRST] [LAST] + Test Name That Is Extremely Long To Check Clipping </text> <text name="fastpay text"> Snel betalen: diff --git a/indra/newview/skins/default/xui/nl/floater_pay_object.xml b/indra/newview/skins/default/xui/nl/floater_pay_object.xml index d3826648f2..11fa6d4a44 100644 --- a/indra/newview/skins/default/xui/nl/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/nl/floater_pay_object.xml @@ -7,7 +7,7 @@ Betaal inwoner: </text> <text name="payee_name" left="100" width="200"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text name="object_name_label" left="5" width="90" halign="left"> Via object: diff --git a/indra/newview/skins/default/xui/nl/floater_statistics.xml b/indra/newview/skins/default/xui/nl/floater_statistics.xml deleted file mode 100644 index 7684a73663..0000000000 --- a/indra/newview/skins/default/xui/nl/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATISTIEKEN"/> diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml index 212cac0a5b..4ffe675831 100644 --- a/indra/newview/skins/default/xui/nl/floater_tools.xml +++ b/indra/newview/skins/default/xui/nl/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" title="" short_title="BOUWEN" width="288"> +<floater name="toolbox floater" title="" short_title="BOUWEN" height="592"> <button label="" label_selected="" name="button focus" tool_tip="Focus"/> <button label="" label_selected="" name="button move" tool_tip="Verplaats"/> <button label="" label_selected="" name="button edit" tool_tip="Bewerk"/> @@ -25,7 +25,7 @@ <text name="text ruler mode"> Liniaal: </text> - <combo_box name="combobox grid mode" width="78" left_delta="38"> + <combo_box name="combobox grid mode"> <combo_box.item name="World" label="Wereld" /> <combo_box.item name="Local" label="Lokaal" @@ -81,13 +81,13 @@ <text name="Strength:"> Sterkte </text> - <text name="obj_count" left="134"> + <text name="obj_count" top_pad="20"> Geselecteerde objecten: [COUNT] </text> - <text name="prim_count" left="134"> + <text name="prim_count"> primitieven: [COUNT] </text> - <tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288"> + <tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" top="185"> <panel label="Algemeen" name="General"> <text name="Name:"> Naam: @@ -144,7 +144,7 @@ <text name="label click action"> Wanneer links-geklikt: </text> - <combo_box name="clickaction" width="178"> + <combo_box name="clickaction"> <combo_box.item name="Touch/grab(default)" label="Aanraken/pakken (standaard)" /> <combo_box.item name="Sitonobject" label="Zit op object" @@ -406,7 +406,7 @@ <text name="glow label"> Gloed </text> - <check_box label="Volledige helderheid" name="checkbox fullbright"/> + <check_box label="Volledige helderheid" name="checkbox fullbright" left_delta="-10"/> <text name="tex gen"> Mapping </text> diff --git a/indra/newview/skins/default/xui/nl/notifications.xml b/indra/newview/skins/default/xui/nl/notifications.xml index a282c267a1..be0c17d2ff 100644 --- a/indra/newview/skins/default/xui/nl/notifications.xml +++ b/indra/newview/skins/default/xui/nl/notifications.xml @@ -2409,10 +2409,10 @@ Wilt u de [SECOND_LIFE] website bezoeken om dit in te stellen? Onderwerp: [SUBJECT], Bericht: [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] is Online + [NAME] is Online </notification> <notification name="FriendOffline"> - [FIRST] [LAST] is Offline + [NAME] is Offline </notification> <notification name="AddSelfFriend"> U kunt uzelf niet als vriend toevoegen. @@ -2478,9 +2478,6 @@ Wilt u de [SECOND_LIFE] website bezoeken om dit in te stellen? <notification name="CannotRemoveProtectedCategories"> U kunt geen beschermde categorieën verwijderen. </notification> - <notification name="OfferedCard"> - U heeft een visitekaartje aangeboden aan [FIRST] [LAST] - </notification> <notification name="UnableToBuyWhileDownloading"> Niet mogelijk te kopen terwijl objectdata wordt gedownload. Probeer het alstublieft opnieuw. </notification> @@ -2550,8 +2547,7 @@ Probeer een kleiner stuk land te selecteren. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teleport"/> - <button name="Description" text="Omschrijving"/> + <button name="Details" text="Omschrijving"/> <button name="Cancel" text="Annuleren"/> </form> </notification> @@ -2575,7 +2571,7 @@ Indien u streaming media wilt zien op percelen die dit ondersteunen, dient u naa De objecten die uw eigendom zijn op het geselecteerde perceel zijn geretourneerd naar uw inventaris. </notification> <notification name="OtherObjectsReturned"> - De objecten op het geselecteerde perceel dat het eigendom is van [FIRST] [LAST], zijn geretourneerd naar zijn of haar inventaris. + De objecten op het geselecteerde perceel dat het eigendom is van [NAME], zijn geretourneerd naar zijn of haar inventaris. </notification> <notification name="OtherObjectsReturned2"> De objecten op het geselecteerde perceel dat het eigendom is van inwoner '[NAME]', zijn geretourneerd naar hun eigenaar. @@ -2702,7 +2698,7 @@ Probeer het alstublieft opnieuw over enkele ogenblikken. Geen geldig perceel kon gevonden worden. </notification> <notification name="ObjectGiveItem"> - Een object genaamd [OBJECTFROMNAME], eigendom van [FIRST] [LAST], heeft u een [OBJECTTYPE] genaamd [OBJECTNAME] gegeven. + Een object genaamd <nolink>[OBJECTFROMNAME]</nolink>, eigendom van [NAME_SLURL], heeft u een [OBJECTTYPE] genaamd [ITEM_SLURL] gegeven. <form name="form"> <button name="Keep" text="Behouden"/> <button name="Discard" text="Afwijzen"/> @@ -2781,7 +2777,7 @@ Probeer het alstublieft opnieuw over enkele ogenblikken. [NAME] heeft uw vriendschapsaanbod afgewezen. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] biedt zijn/haar visitekaartje aan. + [NAME] biedt zijn/haar visitekaartje aan. Dit zal een bladwijzer in uw inventaris toevoegen zodat u deze inwoner snel kunt een IM kunt sturen. <form name="form"> <button name="Accept" text="Accepteren"/> @@ -2841,7 +2837,7 @@ Dit verzoek inwilligen? </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST]'s '[TITLE]' + [NAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button name="Ignore" text="Negeren"/> @@ -2942,13 +2938,13 @@ Klik Accepteren om deel te nemen aan dit gesprek of Afwijzen om de uitnodiging a </form> </notification> <notification name="AutoUnmuteByIM"> - Er is een instant message naar [FIRST] [LAST] gestuurd, waardoor deze automatisch van de negeerlijst is gehaald. + Er is een instant message naar [NAME] gestuurd, waardoor deze automatisch van de negeerlijst is gehaald. </notification> <notification name="AutoUnmuteByMoney"> - Er is geld gegeven aan [FIRST] [LAST], waardoor deze automatisch van de negeerlijst is gehaald. + Er is geld gegeven aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald. </notification> <notification name="AutoUnmuteByInventory"> - Er is inventaris aangeboden aan [FIRST] [LAST], waardoor deze automatisch van de negeerlijst is gehaald. + Er is inventaris aangeboden aan [NAME], waardoor deze automatisch van de negeerlijst is gehaald. </notification> <notification name="VoiceInviteGroup"> [NAME] doet nu mee met een Voice chat gesprek binnen de groep [GROUP]. diff --git a/indra/newview/skins/default/xui/nl/panel_audio_device.xml b/indra/newview/skins/default/xui/nl/panel_audio_device.xml deleted file mode 100644 index fd5dda799f..0000000000 --- a/indra/newview/skins/default/xui/nl/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="device_settings"> - <text name="Audio Devices"> - Audioapparaten - </text> - <text name="Input device (microphone):"> - Invoerapparaat (microfoon): - </text> - <text name="Output device (speakers):"> - Uitvoerapparaat (luidsprekers) - </text> - <text name="Input level:"> - Invoerniveau - </text> - <text_editor name="voice_intro_text1"> - Wijzig de schuifbalk om in te stellen hoe luid u klinkt voor andere inwoners. Spreek gewoon in uw microfoon om het invoerniveau te testen. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Wijzig het volume met deze schuifknop"/> - <text name="wait_text"> - Wacht u alstublieft - </text> - <string name="default_text"> - Standaard - </string> -</panel> diff --git a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml index 172395e20a..fffdb9e8df 100644 --- a/indra/newview/skins/default/xui/nl/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/nl/panel_edit_profile.xml @@ -35,7 +35,7 @@ </panel> <text name="title_partner_text" value="Partner:"/> <panel name="partner_data_panel"> - <text name="partner_text" value="[FIRST] [LAST]"/> + <text name="partner_text"/> </panel> <text name="text_box3"> Antwoord bij Niet Storen: diff --git a/indra/newview/skins/default/xui/nl/panel_friends.xml b/indra/newview/skins/default/xui/nl/panel_friends.xml deleted file mode 100644 index eaf6e5d55b..0000000000 --- a/indra/newview/skins/default/xui/nl/panel_friends.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="friends"> - <string name="Multiple"> - Meerdere vrienden... - </string> - <scroll_list name="friend_list" tool_tip="Houd shift of control ingedrukt terwijl u meerdere vrienden klikt"> - <column name="icon_online_status" tool_tip="Online status"/> - <column label="Naam" name="friend_name" tool_tip="Naam"/> - <column name="icon_visible_online" tool_tip="Vriend kan zien wanneer u online bent"/> - <column name="icon_visible_map" tool_tip="Vriend kan u op de kaart lokaliseren"/> - <column name="icon_edit_mine" tool_tip="Vriend kan objecten wijzigen, verwijderen of oppakken"/> - <column name="icon_edit_theirs" tool_tip="U kunt de objecten van deze vriend bewerken"/> - </scroll_list> - <button label="IM/Oproepen" name="im_btn" tool_tip="Open Instant Message sessie" width="86"/> - <button label="Profiel" name="profile_btn" tool_tip="Toon afbeelding, groepen en andere informatie" width="86"/> - <button label="Teleport..." name="offer_teleport_btn" tool_tip="Bied deze vriend een teleport naar uw huidige locatie aan" width="86"/> - <button label="Betaal..." name="pay_btn" tool_tip="Geef Linden dollars (L$) aan deze vriend" width="86"/> - <button label="Verwijderen..." name="remove_btn" tool_tip="Verwijder deze persoon van uw vriendenlijst" width="86"/> - <button label="Toevoegen..." name="add_btn" tool_tip="Bied vriendschap aan een inwoner aan" width="86"/> -</panel> diff --git a/indra/newview/skins/default/xui/nl/panel_groups.xml b/indra/newview/skins/default/xui/nl/panel_groups.xml deleted file mode 100644 index a0c77b83ff..0000000000 --- a/indra/newview/skins/default/xui/nl/panel_groups.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="groups"> - <text name="groupdesc"> - Uw huidige actieve groep wordt vet getoond. - </text> - <text name="groupcount" width="300"> - U behoort tot [COUNT] groepen (maximaal [MAX]). - </text> - <button label="IM/Oproepen" name="IM" tool_tip="Open Instant Message sessie" width="86"/> - <button label="Info" name="Info" width="86"/> - <button label="Activeren" name="Activate" width="86"/> - <button label="Verlaten" name="Leave" width="86"/> - <button label="Maak…" name="Create" width="86"/> - <button label="Zoeken…" name="Search..." width="86"/> -</panel> diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index 1ee26c3f24..07265d2716 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -665,7 +665,7 @@ <string name="xml_file"> XML bestand </string> - <string name="dot_raw_file"> + <string name="raw_file"> RAW bestand </string> <string name="compressed_image_files"> @@ -3211,7 +3211,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. U bent de enige gebruiker in deze sessie. </string> <string name="offline_message"> - [FIRST] [LAST] is offline. + [NAME] is offline. </string> <string name="invite_message"> Klik de [BUTTON NAME] knop om deze voicechat te accepteren/verbinden. diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml index 0897f59570..da0e947683 100644 --- a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml @@ -24,6 +24,10 @@ Wpisz fragment imienia: </text> <button label="Szukaj" label_selected="Szukaj" name="Find"/> + <scroll_list name="SearchResults"> + <columns label="ImiÄ™" name="name"/> + <columns label="Nazwa użytkownika" name="username"/> + </scroll_list> </panel> <panel label="Znajomi" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -39,6 +43,10 @@ Metry </text> <button label="OdÅ›wież" label_selected="OdÅ›wież" name="Refresh"/> + <scroll_list name="NearMe"> + <columns label="ImiÄ™" name="name"/> + <columns label="Nazwa użytkownika" name="username"/> + </scroll_list> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/pl/floater_bumps.xml b/indra/newview/skins/default/xui/pl/floater_bumps.xml index 1f1b29a83e..c1045ece9a 100644 --- a/indra/newview/skins/default/xui/pl/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pl/floater_bumps.xml @@ -4,19 +4,19 @@ Brak </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] awatar zderzyÅ‚ siÄ™ z TobÄ… + [TIME] [NAME] awatar zderzyÅ‚ siÄ™ z TobÄ… </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] awatar popchnÄ…Å‚ CiÄ™ swoim skryptem + [TIME] [NAME] awatar popchnÄ…Å‚ CiÄ™ swoim skryptem </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] awatar uderzyÅ‚ CiÄ™ swoim obiektem + [TIME] [NAME] awatar uderzyÅ‚ CiÄ™ obiektem </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] awatar uderzyÅ‚ CiÄ™ swoim skryptowanym obiektem + [TIME] [NAME] watar uderzyÅ‚ CiÄ™ skryptowanym obiektem </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] awatar uderzyÅ‚ CiÄ™ swoim fizycznym obiektem + [TIME] [NAME] awatar uderzyÅ‚ CiÄ™ fizycznym obiektem </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/pl/floater_buy_object.xml b/indra/newview/skins/default/xui/pl/floater_buy_object.xml index 7958ed76a1..85861d9e76 100644 --- a/indra/newview/skins/default/xui/pl/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_object.xml @@ -1,26 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="KUP KOPIĘ"> + <floater.string name="title_buy_text"> + Kup + </floater.string> + <floater.string name="title_buy_copy_text"> + Kup kopiÄ™ + </floater.string> + <floater.string name="no_copy_text"> + (bez prawa kopiowania) + </floater.string> + <floater.string name="no_modify_text"> + (bez prawa modyfikacji) + </floater.string> + <floater.string name="no_transfer_text"> + (bez prawa transferu) + </floater.string> <text name="contents_text"> i jej zawartość </text> <text name="buy_text"> - Kupić za [AMOUNT]L$ od [NAME]? + Kup za L$[AMOUNT] od: + </text> + <text name="buy_name_text"> + [NAME]? </text> - <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> <button label="Kup" label_selected="Kup" name="buy_btn"/> - <string name="title_buy_text"> - Kup - </string> - <string name="title_buy_copy_text"> - Kup kopiÄ™ - </string> - <string name="no_copy_text"> - (bez prawa kopiowania) - </string> - <string name="no_modify_text"> - (bez prawa modyfikacji) - </string> - <string name="no_transfer_text"> - (bez prawa transferu) - </string> + <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_customize.xml b/indra/newview/skins/default/xui/pl/floater_customize.xml deleted file mode 100644 index 373e74ffe0..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_customize.xml +++ /dev/null @@ -1,529 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater customize" title="WYGLÄ„D"> - <tab_container name="customize tab container"> - <text label="Części ciaÅ‚a" name="body_parts_placeholder"> - Części ciaÅ‚a - </text> - <panel label="KsztaÅ‚t" name="Shape"> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - <button label="CiaÅ‚o" label_selected="CiaÅ‚o" name="Body"/> - <button label="GÅ‚owa" label_selected="GÅ‚owa" name="Head"/> - <button label="Oczy" label_selected="Oczy" name="Eyes"/> - <button label="Uszy" label_selected="Uszy" name="Ears"/> - <button label="Nos" label_selected="Nos" name="Nose"/> - <button label="Usta" label_selected="Usta" name="Mouth"/> - <button label="Broda " label_selected="Broda" name="Chin"/> - <button label="Tułów" label_selected="Tułów" name="Torso"/> - <button label="Nogi" label_selected="Nogi" name="Legs"/> - <radio_group name="sex radio"> - <radio_item label="Kobieta" name="radio" value="0"/> - <radio_item label="Mężczyzna" name="radio2" value="1"/> - </radio_group> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: zabroniona modyfikacja - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowy ksztaÅ‚t poprzez przeciÄ…gniÄ™cie go ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny ksztaÅ‚t z plików roboczych. - </text> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tego ksztaÅ‚tu. - </text> - <text name="Item Action Label"> - KsztaÅ‚t: - </text> - <button label="Nowy ksztaÅ‚t" label_selected="Nowy ksztaÅ‚t" name="Create New"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - </panel> - <panel label="Skórka" name="Skin"> - <button label="Kolor skórki" label_selected="Kolor skórki" name="Skin Color"/> - <button label="Detale twarzy" label_selected="Detale twarzy" name="Face Detail"/> - <button label="Makijaż" label_selected="Makijaż" name="Makeup"/> - <button label="Detale ciaÅ‚a" label_selected="Detale ciaÅ‚a" name="Body Detail"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowÄ… skórkÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… skórkÄ™ z plików roboczych. - </text> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tej skórki. - </text> - <text name="Item Action Label"> - Skórka: - </text> - <texture_picker label="Tatuaże gÅ‚owy" name="Head Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> - <texture_picker label="Tatuaże górne" name="Upper Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> - <texture_picker label="Tatuaże dolne" name="Lower Tattoos" tool_tip="Kliknij by wybrać teksturÄ™"/> - <button label="Nowa skórka" label_selected="Nowa skórka" name="Create New"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="WÅ‚osy" name="Hair"> - <button label="Kolor" label_selected="Kolor" name="Color"/> - <button label="Styl" label_selected="Styl" name="Style"/> - <button label="Brwi" label_selected="Brwi" name="Eyebrows"/> - <button label="Twarzy" label_selected="Twarzy" name="Facial"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowe wÅ‚osy poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne wÅ‚osy z plików roboczych. - </text> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tych wÅ‚osów. - </text> - <text name="Item Action Label"> - WÅ‚osy: - </text> - <texture_picker label="Tekstura" name="Texture" tool_tip="Kliknij by wybrać teksturÄ™"/> - <button label="Nowe wÅ‚osy" label_selected="Nowe wÅ‚osy" name="Create New"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Oczy" name="Eyes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowe oczy poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne oczy z plików roboczych. - </text> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tych oczów. - </text> - <text name="Item Action Label"> - Oczy: - </text> - <texture_picker label="TÄ™czówka" name="Iris" tool_tip="Kliknij by wybrać teksturÄ™"/> - <button label="Nowe oczy" label_selected="Nowe oczy" name="Create New"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <text label="Ubrania" name="clothes_placeholder"> - Ubrania - </text> - <panel label="Koszula" name="Shirt"> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Nowa koszula" label_selected="Nowa Koszula" name="Create New"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikowanie zabronione - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowÄ… koszulÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… koszulÄ™ z plików roboczych. - </text> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tej koszuli. - </text> - <text name="Item Action Label"> - Koszula: - </text> - </panel> - <panel label="Spodnie" name="Pants"> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij tutaj by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Nowe spodnie" label_selected="Nowe spodnie" name="Create New"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikcja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowe spodnie poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne spodnie z plików roboczych. - </text> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tych spodni. - </text> - <text name="Item Action Label"> - Spodnie: - </text> - </panel> - <panel label="Buty" name="Shoes"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adwanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowe buty poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne buty z plików roboczych. - </text> - <button label="Nowe Buty" label_selected="Nowe Buty" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tych butów. - </text> - <text name="Item Action Label"> - Buty: - </text> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Skarpety" name="Socks"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowe skarpety poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne skarpety z plików roboczych. - </text> - <button label="Nowe Skarpety" label_selected="Nowe Skarpety" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tych skarpet. - </text> - <text name="Item Action Label"> - Skarpetki: - </text> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Kurtka" name="Jacket"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowÄ… kurtkÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… kurtkÄ™ z plików roboczych. - </text> - <button label="Nowa Kurtka" label_selected="Nowa Kurtka" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tej kurtki. - </text> - <text name="Item Action Label"> - Kurtka: - </text> - <texture_picker label="Górny materiaÅ‚" name="Upper Fabric" tool_tip="Kliknij by wybrać teksturÄ™" width="76"/> - <texture_picker label="Dolny materiaÅ‚" name="Lower Fabric" tool_tip="Kliknij by wybrać kolor" width="76"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor" width="76"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="RÄ™kawiczki" name="Gloves"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowe rÄ™kawiczki poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asne rÄ™kawiczki z plików roboczych. - </text> - <button label="Nowe RÄ™kawiczki" label_selected="Nowe RÄ™kawiczki" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tych rÄ™kawiczek - </text> - <text name="Item Action Label"> - RÄ™kawiczki: - </text> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Podkoszulek" name="Undershirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowy podkoszulek poprzez przeciÄ…gniÄ™cie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny podkoszulek z plików roboczych. - </text> - <button label="Nowy Podkoszulek" label_selected="Nowy Podkoszulek" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tego podkoszulka. - </text> - <text name="Item Action Label"> - Podkoszulka: - </text> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Bielizna" name="Underpants"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowÄ… bieliznÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… bieliznÄ™ z plików roboczych. - </text> - <button label="Nowa Bielizna" label_selected="Nowa Bielizna" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tej bielizny. - </text> - <text name="Item Action Label"> - Bielizna: - </text> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Spódnica" name="Skirt"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: modyfikacja zabroniona - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: niezaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowÄ… spódnicÄ™ poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… spódnicÄ™ z plików roboczych. - </text> - <button label="Nowa Spódnica" label_selected="Nowa Spódnica" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz prawa do modyfikowania tej spódnicy. - </text> - <text name="Item Action Label"> - Spódnica: - </text> - <texture_picker label="MateriaÅ‚" name="Fabric" tool_tip="Kliknij by wybrać teksturÄ™"/> - <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Tatuaż" name="Tattoo"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: nie można modyfikować - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: nienaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowy tatuaż poprzez przeciÄ…gniÄ™cie go ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asny tatuaż z plików roboczych. - </text> - <button label="Utwórz Nowy Tatuaż" label_selected="Stwórz Nowy Tatuaż" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz uprawnieÅ„ do modyfikowania tych ubraÅ„/części ciaÅ‚a. - </text> - <text name="Item Action Label"> - Tatuaż: - </text> - <texture_picker label="Tatuaż gÅ‚owy" name="Head Tattoo" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <texture_picker label="Górny tatuaż" name="Upper Tattoo" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <texture_picker label="Tatuaż dolnej części ciaÅ‚a" name="Lower Tattoo" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - <panel label="Alpha" name="Alpha"> - <text name="title"> - [DESC] - </text> - <text name="title_no_modify"> - [DESC]: nie można modyfikować - </text> - <text name="title_loading"> - [DESC]: Å‚adowanie... - </text> - <text name="title_not_worn"> - [DESC]: nienaÅ‚ożone - </text> - <text name="path"> - Zapisane w [PATH] - </text> - <text name="not worn instructions"> - Załóż nowÄ… maskÄ™ alpha poprzez przeciÄ…gniÄ™cie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć wÅ‚asnÄ… z plików roboczych. - </text> - <button label="Stwórz nowÄ… Alpha" label_selected="Utwórz nowÄ… Alpha" name="Create New"/> - <text name="no modify instructions"> - Nie posiadasz uprawnieÅ„ do modyfikowania tych ubraÅ„/części ciaÅ‚a. - </text> - <text name="Item Action Label"> - Alpha: - </text> - <texture_picker label="Dolna Alpha" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <texture_picker label="Alpha górnej części ciaÅ‚a" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <texture_picker label="Alpha gÅ‚owy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <texture_picker label="Alpha oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <texture_picker label="Alpha wÅ‚osów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturÄ™"/> - <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/> - <button label="Wróć" label_selected="Wróć" name="Revert"/> - </panel> - </tab_container> - <button label="Info o skrypcie" label_selected="Info o skrypcie" name="script_info" tool_tip="Pokaż skrypty przyÅ‚Ä…czone do Twojego awatara"/> - <button label="Stwórz ubranie" label_selected="Stwórz Ubranie" name="make_outfit_btn"/> - <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> - <button label="OK" label_selected="OK" name="Ok"/> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_device_settings.xml b/indra/newview/skins/default/xui/pl/floater_device_settings.xml deleted file mode 100644 index c485fb2e29..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_device_settings.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_device_settings" title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ"/> diff --git a/indra/newview/skins/default/xui/pl/floater_display_name.xml b/indra/newview/skins/default/xui/pl/floater_display_name.xml new file mode 100644 index 0000000000..ea28e65728 --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_display_name.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Display Name" title="ZMIEŃ WYÅšWIETLANÄ„ NAZWĘ"> + <text name="info_text"> + Nazwa, którÄ… nadaÅ‚aÅ›/nadaÅ‚eÅ› Twojemu awatarowi jest okreÅ›lana jako wyÅ›wietlana nazwa. Możesz jÄ… zmieniać raz w tygodniu. + </text> + <text name="lockout_text"> + Nie możesz zmienić swojej wyÅ›wietlanej nazwy do: [TIME]. + </text> + <text name="set_name_label"> + Nowa wyÅ›wietlana nazwa: + </text> + <text name="name_confirm_label"> + Wpisz TwojÄ… nowÄ… nazwÄ™ aby potwierdzić: + </text> + <button label="Zapisz" name="save_btn" tool_tip="Zapisz swojÄ… nowÄ… wyÅ›wietlanÄ… nazwÄ™"/> + <button label="Resetuj" name="reset_btn" tool_tip="UczyÅ„ wyÅ›wietlanÄ… nazwÄ™ takÄ… samÄ… jak nazwa użytkownika"/> + <button label="Cofnij" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_event.xml b/indra/newview/skins/default/xui/pl/floater_event.xml index 80862bfd2f..d278114969 100644 --- a/indra/newview/skins/default/xui/pl/floater_event.xml +++ b/indra/newview/skins/default/xui/pl/floater_event.xml @@ -1,72 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="IMPREZA" name="Event" title="IMPREZA"> - <floater.string name="none"> - żadne +<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600"> + <floater.string name="loading_text"> + Åadowanie... </floater.string> - <floater.string name="notify"> - Zawiadom + <floater.string name="done_text"> + ZakoÅ„czono </floater.string> - <floater.string name="dont_notify"> - Nie zawiadamiaj - </floater.string> - <floater.string name="moderate"> - Mature - </floater.string> - <floater.string name="adult"> - Adult - </floater.string> - <floater.string name="general"> - General - </floater.string> - <floater.string name="unknown"> - Nieznana - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Brak nazwy dla wydarzenia. - </text> - <text name="event_category"> - (bez kategorii) - </text> - <text name="event_runby_label"> - Prowadzona przez: - </text> - <text initial_value="(przetwarzanie)" name="event_runby"/> - <text name="event_date_label"> - Data: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - DÅ‚ugość: - </text> - <text name="event_duration"> - 1 godzina - </text> - <text name="event_covercharge_label"> - OpÅ‚ata: - </text> - <text name="event_cover"> - Bez opÅ‚aty - </text> - <text name="event_location_label"> - Lokalizacja: - </text> - <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/> - <text name="rating_label" value="Rodzaj:"/> - <text name="rating_value" value="nieznane"/> - <expandable_text name="event_desc"> - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - </expandable_text> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Stwórz imprezÄ™"/> - <button name="god_delete_event_btn" tool_tip="Skasuj imprezÄ™"/> - <button label="Zawiadom mnie" name="notify_btn"/> - <button label="Teleportuj" name="teleport_btn"/> - <button label="Mapa" name="map_btn"/> - </layout_panel> - </layout_stack> + <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/> + <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_im.xml b/indra/newview/skins/default/xui/pl/floater_im.xml deleted file mode 100644 index e40935ccb7..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Wiadomość (IM)"> - <string name="only_user_message"> - JesteÅ› jedynym uczestnikiem tej konferencji. - </string> - <string name="offline_message"> - [FIRST] [LAST] - ta osoba jest obecnie niedostÄ™pna. - </string> - <string name="invite_message"> - Kliknij na [BUTTON NAME] przycisk by zaakceptować/doÅ‚Ä…czyć do tej rozmowy. - </string> - <string name="muted_message"> - ZablokowaÅ‚eÅ› tego Rezydenta. WysÅ‚anie wiadomoÅ›ci automatycznie odblokuje go. - </string> - <string name="generic_request_error"> - BÅ‚Ä…d. Spróbuj ponownie za kilka minut. - </string> - <string name="insufficient_perms_error"> - Nie posiadasz praw do kontynuacji. - </string> - <string name="session_does_not_exist_error"> - Ta konferencja jest już zakoÅ„czona. - </string> - <string name="no_ability_error"> - Nie posiadesz tego przywileju. - </string> - <string name="not_a_mod_error"> - Nie jesteÅ› moderatorem konferencji. - </string> - <string name="muted_error"> - Moderator wyciszyÅ‚ CiÄ™. - </string> - <string name="add_session_event"> - Niemożliwość dodania Rezydentów do tej konferencji z [RECIPIENT]. - </string> - <string name="message_session_event"> - Nie można wysÅ‚ać Twojej wiadomoÅ›ci do sesji czatu z [RECIPIENT]. - </string> - <string name="removed_from_group"> - UsuniÄ™to CiÄ™ z grupy. - </string> - <string name="close_on_no_ability"> - Nie posiadasz praw by uczestniczyć w tej konferencji. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/pl/floater_im_session.xml b/indra/newview/skins/default/xui/pl/floater_im_session.xml index db513f787c..9041ff7416 100644 --- a/indra/newview/skins/default/xui/pl/floater_im_session.xml +++ b/indra/newview/skins/default/xui/pl/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="Panel kontroli wiadomoÅ›ci prywatnej (IM)" name="panel_im_control_panel"/> <layout_panel> <line_editor label="Do" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/pl/floater_incoming_call.xml b/indra/newview/skins/default/xui/pl/floater_incoming_call.xml index 8de60095df..b06b6d713d 100644 --- a/indra/newview/skins/default/xui/pl/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/pl/floater_incoming_call.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="DZWONI NIEZNANA OSOBA"> +<floater name="incoming call" title="Rozmowa gÅ‚osowa"> <floater.string name="lifetime"> 5 </floater.string> diff --git a/indra/newview/skins/default/xui/pl/floater_my_friends.xml b/indra/newview/skins/default/xui/pl/floater_my_friends.xml deleted file mode 100644 index 847c93f891..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="KONTAKTY"> - <tab_container name="friends_and_groups"> - <panel label="Znajomi" name="friends_panel"/> - <panel label="Grupy" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml deleted file mode 100644 index a8d2e10c5f..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Stwórz ubranie"> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> - <text name="Save item as:"> - Zapisz to co mam w tej chwili zaÅ‚ożone -jako nowy komplet ubrania: - </text> - <line_editor name="name ed"> - [DESC] (nowy) - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_pay.xml b/indra/newview/skins/default/xui/pl/floater_pay.xml index c9243fda65..38fe5286a4 100644 --- a/indra/newview/skins/default/xui/pl/floater_pay.xml +++ b/indra/newview/skins/default/xui/pl/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Osoba"/> <text name="payee_name"> - [FIRST] [LAST] + Przetestuj nazwÄ™, która jest bardzo dÅ‚uga aby sprawdzić skracanie. </text> <button label="L$1" label_selected="L$1" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/pl/floater_pay_object.xml b/indra/newview/skins/default/xui/pl/floater_pay_object.xml index 19032b3e5d..bf88348c87 100644 --- a/indra/newview/skins/default/xui/pl/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/pl/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Osoba"/> <text left="125" name="payee_name"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text halign="left" left="5" name="object_name_label" width="95"> Poprzez obiekt: diff --git a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml deleted file mode 100644 index d3d6588397..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="classified_preview" title="INFO O REKLAMIE"> - <floater.string name="Title"> - Reklama: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml deleted file mode 100644 index 5d9e47bc00..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_preview_event.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="event_preview" title="INFO O IMPREZIE"> - <floater.string name="Title"> - Impreza: [NAME] - </floater.string> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml deleted file mode 100644 index a041472f68..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTURKI"/> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml deleted file mode 100644 index 9692fca9cd..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTURKI"> - <text name="trigger_label"> - Czat: - </text> - <text name="key_label"> - Klawiatura: - </text> - <combo_box label="Å»aden" name="modifier_combo"/> - <combo_box label="Å»aden" name="key_combo"/> - <text name="replace_text" tool_tip="ZmieÅ„ wÅ‚Ä…czajÄ…cÄ… frazÄ™ na innÄ…. Na przykÅ‚ad zmiana 'witam' na 'cześć' zmieni czat 'ChciaÅ‚em powiedzieć witam' na 'ChciaÅ‚em powiedzieć cześć' i pokaże animacjÄ™!"> - ZamieÅ„ na: - </text> - <line_editor name="replace_editor" tool_tip="ZmieÅ„ wÅ‚Ä…czajÄ…cÄ… frazÄ™ na innÄ…. Na przykÅ‚ad zmiana 'witam' na 'cześć' zmieni czat 'ChciaÅ‚em powiedzieć witam' na 'ChciaÅ‚em powiedzieć cześć' i pokaże animacjÄ™"/> -</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml deleted file mode 100644 index a041472f68..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="GESTURKI"/> diff --git a/indra/newview/skins/default/xui/pl/floater_statistics.xml b/indra/newview/skins/default/xui/pl/floater_statistics.xml deleted file mode 100644 index b7025e484d..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_statistics.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="stats floater" title="STATYSTYKI"/> diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml index 6efef4161e..7c1ced0eae 100644 --- a/indra/newview/skins/default/xui/pl/floater_tools.xml +++ b/indra/newview/skins/default/xui/pl/floater_tools.xml @@ -174,13 +174,13 @@ Twórca: </text> <text name="Creator Name"> - Thrax Linden + Pani Esbee Linden (esbee.linden) </text> <text name="Owner:"> WÅ‚aÅ›ciciel: </text> <text name="Owner Name"> - Thrax Linden + Pani Erica "Moose" Linden (erica.linden) </text> <text name="Group:"> Grupa: @@ -307,7 +307,7 @@ <combo_box.item label="Kwadrat" name="Square"/> <combo_box.item label="TrójkÄ…t" name="Triangle"/> </combo_box> - <text name="text twist"> + <text name="text twist" left_delta="-5" width="160"> SkrÄ™cenie (poczÄ…tek/koniec) </text> <spinner label="P" name="Twist Begin"/> diff --git a/indra/newview/skins/default/xui/pl/floater_voice_controls.xml b/indra/newview/skins/default/xui/pl/floater_voice_controls.xml index c222e4edbb..2155d56f27 100644 --- a/indra/newview/skins/default/xui/pl/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/pl/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mój awatar:"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="ZakoÅ„cz rozmowÄ™" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="ZakoÅ„cz rozmowÄ™" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml deleted file mode 100644 index 925295102e..0000000000 --- a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title=""> - <button label="Zapisz" label_selected="Zapisz" name="Save"/> - <button label="Anuluj" label_selected="Anuluj" name="Cancel"/> - <text name="Save item as:"> - Zapisz obiekt w mojej Szafie jako: - </text> - <line_editor name="name ed"> - Nowe [DESC] - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/pl/inspect_avatar.xml b/indra/newview/skins/default/xui/pl/inspect_avatar.xml index 778e500bc0..1db3339352 100644 --- a/indra/newview/skins/default/xui/pl/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/pl/inspect_avatar.xml @@ -10,6 +10,11 @@ <string name="Details"> [SL_PROFILE] </string> + <text name="user_name_small" value="Grumpity ProductEngine with a long name"/> + <text name="user_slid" value="james.linden"/> + <text name="user_details"> + To jest mój opis w Second Life. + </text> <slider name="volume_slider" tool_tip="Poziom gÅ‚oÅ›noÅ›ci" value="0.5"/> <button label="Dodaj znajomość" name="add_friend_btn"/> <button label="IM" name="im_btn"/> diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml index 2210b1e483..a359180ffb 100644 --- a/indra/newview/skins/default/xui/pl/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml @@ -83,6 +83,7 @@ <menu_item_call label="Weź kopiÄ™" name="Take Copy"/> <menu_item_call label="Zapisz obiekt do Szafy" name="Save Object Back to My Inventory"/> <menu_item_call label="Zapisz do treÅ›ci obiektu" name="Save Object Back to Object Contents"/> + <menu_item_call label="Zwróć obiekt" name="Return Object back to Owner"/> </menu> <menu label="Skrypty" name="Scripts"> <menu_item_call label="Zrekompiluj skrypt w selekcji (Mono)" name="Mono"/> @@ -96,6 +97,7 @@ <menu_item_check label="Wybierz tylko moje obiekty" name="Select Only My Objects"/> <menu_item_check label="Wybierz tylko obiekty przesuwalne" name="Select Only Movable Objects"/> <menu_item_check label="Wybierz przez otoczenie" name="Select By Surrounding"/> + <menu_item_check label="Pokaż wytyczne selekcji" name="Show Selection Outlines"/> <menu_item_check label="Zobacz ukrytÄ… selekcjÄ™" name="Show Hidden Selection"/> <menu_item_check label="Pokaż promieÅ„ emitera dla selekcji" name="Show Light Radius for Selection"/> <menu_item_check label="Pokaż emiter selekcji" name="Show Selection Beam"/> @@ -116,6 +118,7 @@ <menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/> <menu_item_call label="ZgÅ‚oÅ› bÅ‚Ä™dy klienta" name="Report Bug"/> <menu_item_call label="O [APP_NAME]" name="About Second Life"/> + <menu_item_check label="WÅ‚Ä…cz podpowiedzi" name="Enable Hints"/> </menu> <menu label="Zaawansowane" name="Advanced"> <menu_item_call label="Zatrzymaj wszystkie animacje" name="Stop Animating My Avatar"/> @@ -262,7 +265,7 @@ <menu_item_call label="Test przeglÄ…darki internetowej" name="Web Browser Test"/> <menu_item_call label="Drukuj zaznaczone informacje o obiekcie" name="Print Selected Object Info"/> <menu_item_call label="Statystyki pamiÄ™ci" name="Memory Stats"/> - <menu_item_check label="Podwójne klikniÄ™cie - Auto-Pilot" name="Double-Click Auto-Pilot"/> + <menu_item_check label="Auto-pilot na podwójne klikniÄ™cie" name="Double-ClickAuto-Pilot"/> <menu_item_check label="Podwójne klikniÄ™cie - Teleportuj" name="DoubleClick Teleport"/> <menu_item_check label="Debugowanie zdarzeÅ„ klikania" name="Debug Clicks"/> <menu_item_check label="Debugowanie zdarzeÅ„ myszy" name="Debug Mouse Events"/> @@ -274,6 +277,7 @@ <menu_item_call label="Zapisz jako XML" name="Save to XML"/> <menu_item_check label="Pokaż nazwy XUI" name="Show XUI Names"/> <menu_item_call label="WyÅ›lij wiadomość (IM) testowÄ…" name="Send Test IMs"/> + <menu_item_call label="Wyczyść bufor pamiÄ™ci nazw" name="Flush Names Caches"/> </menu> <menu label="Awatar" name="Character"> <menu label="PrzesuÅ„ bakowanÄ… teksturÄ™" name="Grab Baked Texture"> diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml index 7fda575c29..8151c7eb93 100644 --- a/indra/newview/skins/default/xui/pl/notifications.xml +++ b/indra/newview/skins/default/xui/pl/notifications.xml @@ -111,7 +111,7 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz. </notification> <notification name="GrantModifyRights"> Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikacjÄ™, usuwanie lub wziÄ™cie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagÄ…! -Czy chcesz dać prawa modyfikacji osobie [FIRST_NAME] [LAST_NAME]? +Czy chcesz udzielić prawa do modyfikacji [NAME]? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> <notification name="GrantModifyRightsMultiple"> @@ -120,7 +120,7 @@ Czy chcesz dać prawa modyfikacji wybranym osobom? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> <notification name="RevokeModifyRights"> - Czy chcesz odebrać prawa modyfikacji Rezydentowi [FIRST_NAME] [LAST_NAME]? + Czy chcesz odebrać prawa do modyfikacji [NAME]? <usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -318,12 +318,14 @@ Limit [MAX_ATTACHMENTS] zaÅ‚Ä…czników zostaÅ‚ przekroczony. ProszÄ™ najpierw od Nie możesz zaÅ‚ożyć tego artkuÅ‚u ponieważ nie zaÅ‚adowaÅ‚ siÄ™ poprawnie. Spróbuj ponownie za kilka minut. </notification> <notification name="MustHaveAccountToLogIn"> - Musisz mieć konto by móc zalogować siÄ™ do [SECOND_LIFE]. -Czy chcesz przejść na stronÄ™ www.secondlife.com by zaÅ‚ożyć konto? + Oops! Brakuje czegoÅ›. +Należy wprowadzić nazwÄ™ użytkownika. + +Potrzebujesz konta aby siÄ™ zalogować do [SECOND_LIFE]. Czy chcesz utworzyć je teraz? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="InvalidCredentialFormat"> - Wpisz imiÄ™ i nazwisko Twojego awatara w pole Użytkownika a nastÄ™pnie zaloguj siÄ™ ponownie. + Należy wprowadzić nazwÄ™ użytkownika lub imiÄ™ oraz nazwisko Twojego awatara w pole nazwy użytkownika a nastÄ™pnie ponownie siÄ™ zalogować. </notification> <notification name="AddClassified"> OgÅ‚oszenia reklamowe ukazujÄ… siÄ™ w zakÅ‚adce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzieÅ„. @@ -897,12 +899,6 @@ Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisaÄ Nie możesz kupić posiadÅ‚oÅ›ci dla grupy. Nie masz praw kupowania posiadÅ‚oÅ›ci dla Twojej aktywnej grupy. </notification> - <notification label="Dodaj Znajomość" name="AddFriend"> - Znajomi mogÄ… pozwalać na odnajdywanie siÄ™ wzajemnie na mapie i na otrzymywanie notyfikacji o logowaniu do [SECOND_LIFE]. - -Zaproponować znajomość [NAME]? - <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> - </notification> <notification label="Add Friend" name="AddFriendWithMessage"> Znajomi mogÄ… pozwalać na odnajdywanie siÄ™ wzajemnie na mapie i na otrzymywanie notyfikacji o logowaniu do [SECOND_LIFE]. @@ -946,7 +942,7 @@ Zaproponować znajomość [NAME]? </form> </notification> <notification name="RemoveFromFriends"> - Chcesz usunąć [FIRST_NAME] [LAST_NAME] z listy Twoich znajomych? + Czy chcesz usunąć [NAME] z listy znajomych? <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="RemoveMultipleFromFriends"> @@ -1065,7 +1061,8 @@ Przekazać tÄ… posiadÅ‚ość o powierzchni [AREA] m² grupie '[GROUP_NAME]& <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/> </notification> <notification name="DeedLandToGroupWithContribution"> - Po przekazaniu tej posiadÅ‚oÅ›ci grupa bÄ™dzia musiaÅ‚a mieć i utrzymywać wystarczajÄ…cy kredyt na używanie posiadÅ‚oÅ›ci. Przekazanie bÄ™dzie zawierać równoczesne przypisanie posiadÅ‚oÅ›ci do grupy od '[FIRST_NAME] [LAST_NAME]'. + Po przekazaniu tej posiadÅ‚oÅ›ci grupa bÄ™dzia musiaÅ‚a mieć i utrzymywać wystarczajÄ…cy kredyt na używanie posiadÅ‚oÅ›ci. +Przekazanie bÄ™dzie zawierać równoczesne przypisanie posiadÅ‚oÅ›ci do grupy od '[NAME]'. Cena zakupu posiadÅ‚oÅ›ci nie jest zwracana wÅ‚aÅ›cicielowi. Jeżeli przekazana posiadÅ‚ość zostanie sprzedana, cana sprzedaży zostanie podzielona pomiÄ™dzy czÅ‚onków grupy. Przekazać tÄ… posiadÅ‚ość o powierzchni [AREA] m² grupie '[GROUP_NAME]'? @@ -1436,6 +1433,46 @@ Dodatkowo, wszystkie podarowane dla Ciebie obiekty bÄ™dÄ… automatycznie zapisywa <button name="Cancel" text="Anuluj"/> </form> </notification> + <notification name="SetDisplayNameSuccess"> + Witaj [DISPLAY_NAME]! + +Podobnie jak w realnym życiu potrzeba trochÄ™ czasu zanim wszyscy dowiedzÄ… siÄ™ o nowej nazwie. Kolejne kilka dni zajmie [http://wiki.secondlife.com/wiki/Setting_your_display_name aktualizacja nazwy] w obiektach, skryptach, wyszukiwarce, etc. + </notification> + <notification name="SetDisplayNameBlocked"> + Przepraszamy, nie można zmienić Twojej wyÅ›wietlanej nazwy. JeÅ›li uważasz ze jest to spowodowane bÅ‚Ä™dem skontaktuj siÄ™ z obsÅ‚ugÄ… klienta. + </notification> + <notification name="SetDisplayNameFailedLength"> + Przepraszamy, ta nazwa jest zbyt dÅ‚uga. WyÅ›wietlana nazwa może mieć maksymalnie [LENGTH] znaków. + +ProszÄ™ wprowadzić krótszÄ… nazwÄ™. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Przepraszamy, nie można ustawić Twojej wyÅ›wietlanej nazwy. Spróbuj ponownie później. + </notification> + <notification name="SetDisplayNameMismatch"> + Podana wyÅ›wietlana nazwa nie pasuje. ProszÄ™ wprowadzić jÄ… ponownie. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Przepraszamy, musisz jeszcze poczekać zanim bÄ™dzie można zmienić TwojÄ… wyÅ›wietlanÄ… nazwÄ™. + +Zobacz http://wiki.secondlife.com/wiki/Setting_your_display_name + +ProszÄ™ spróbować ponownie później. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Przepraszamy, nie można ustawić wskazanej nazwy, ponieważ zawiera zabronione sÅ‚owa. + + ProszÄ™ spróbować wprowadzić innÄ… nazwÄ™. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + WyÅ›wietlana nazwa, którÄ… chcesz ustawić zawiera niepoprawne znaki. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Twoje wyÅ›wietlane imiÄ™ musi zawierać litery inne niż znaki interpunkcyjne. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) jest od tej pory znana/znany jako [NEW_NAME]. + </notification> <notification name="OfferTeleport"> Zaproponować teleportacjÄ™ do miejsca Twojego pobytu z tÄ… wiadomoÅ›ciÄ…? <form name="form"> @@ -2003,10 +2040,10 @@ Zamieść go na stronie internetowej żeby umożliwić innym Å‚atwy dostÄ™p do t Temat: [SUBJECT], Treść: [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] jest w [SECOND_LIFE] + [NAME] jest w Second Life </notification> <notification name="FriendOffline"> - [FIRST] [LAST] opuszcza [SECOND_LIFE] + [NAME] opuszcza Second Life </notification> <notification name="AddSelfFriend"> Nie możesz dodać siebie do listy znajomych. @@ -2075,9 +2112,6 @@ Spróbuj jeszcze raz. <notification name="CannotRemoveProtectedCategories"> Nie możesz usunąć chronionych kategorii. </notification> - <notification name="OfferedCard"> - [FIRST] [LAST] daje Ci swojÄ… wizytówkÄ™ - </notification> <notification name="UnableToBuyWhileDownloading"> Nie można kupować w trakcie Å‚adowania danych obiektu. Spróbuj jeszcze raz. @@ -2148,7 +2182,10 @@ Spróbuj wybrać mniejszy obszar. <notification name="SystemMessage"> [MESSAGE] </notification> - <notification name="PaymentRecived"> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> [MESSAGE] </notification> <notification name="EventNotification"> @@ -2157,8 +2194,7 @@ Spróbuj wybrać mniejszy obszar. [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teleportuj"/> - <button name="Description" text="Opis"/> + <button name="Details" text="Szczegóły"/> <button name="Cancel" text="Anuluj"/> </form> </notification> @@ -2194,7 +2230,7 @@ Zainstaluj proszÄ™ wtyczki ponownie lub skontaktuj siÄ™ z dostawcÄ… jeÅ›li nadal Twoje obiekty z wybranej posiadÅ‚oÅ›ci zostaÅ‚y zwrócone do Twojej Szafy. </notification> <notification name="OtherObjectsReturned"> - Obiekty należące do [FIRST] [LAST] na wybranej posiadÅ‚oÅ›ci zostaÅ‚y zwrócone do szafy tej osoby. + Obiekty należące do [NAME] na wybranej posiadÅ‚oÅ›ci zostaÅ‚y zwrócone do Szafy tej osoby. </notification> <notification name="OtherObjectsReturned2"> Obiekty z posiadÅ‚oÅ›ci należącej do Rezydenta'[NAME]' zostaÅ‚y zwrócone do wÅ‚aÅ›ciciela. @@ -2318,7 +2354,7 @@ Spróbuj ponowanie za kilka minut. Nieważana posiadÅ‚ość. </notification> <notification name="ObjectGiveItem"> - Obiekt [OBJECTFROMNAME] należący do [NAME_SLURL] daÅ‚ Ci [OBJECTTYPE]: + Obiekt o nazwie <nolink>[OBJECTFROMNAME]</nolink>, należący do [NAME_SLURL] daÅ‚ Tobie [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Zachowaj"/> @@ -2383,7 +2419,7 @@ Spróbuj ponowanie za kilka minut. Oferta znajomoÅ›ci dla [TO_NAME] </notification> <notification name="OfferFriendshipNoMessage"> - [NAME] proponuje Ci znajomość. + [NAME_SLURL] proponuje Ci znajomość. (Z zalożenia bÄ™dzie widzić swój status online.) <form name="form"> @@ -2404,7 +2440,7 @@ Spróbuj ponowanie za kilka minut. Propozycja znajomoÅ›ci zostaÅ‚a odrzucona. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] daje Tobie swojÄ… wizytówkÄ™. + [NAME] daje Tobie swojÄ… wizytówkÄ™. Wizytówka bÄ™dzie znajdowaÅ‚a siÄ™ w Szafie i umożliwi szybkie wysÅ‚anie IM do tego Rezydenta. <form name="form"> <button name="Accept" text="Zaakceptuj"/> @@ -2424,7 +2460,7 @@ NastÄ…pi wylogowanie jeżeli zostaniesz w tym regionie. [MESSAGE] -Obiekt: [OBJECTNAME], wÅ‚aÅ›ciciel: [NAME]? +Od obiektu: <nolink>[OBJECTNAME]</nolink>, wÅ‚aÅ›ciciel wÅ‚aÅ›ciciel: [NAME]? <form name="form"> <button name="Gotopage" text="ZaÅ‚aduj"/> <button name="Cancel" text="Anuluj"/> @@ -2440,10 +2476,10 @@ Obiekt: [OBJECTNAME], wÅ‚aÅ›ciciel: [NAME]? Obiekt, który chcesz zaÅ‚ożyć używa narzÄ™dzia nieobecnego w wersji klienta, którÄ… używasz. By go zaÅ‚ożyć Å›ciÄ…gnij najnowszÄ… wersjÄ™ [APP_NAME]. </notification> <notification name="ScriptQuestion"> - '[OBJECTNAME]', wÅ‚aÅ›ciciel: '[NAME]', chciaÅ‚ by: + Obiekt '<nolink>[OBJECTNAME]</nolink>', którego wÅ‚aÅ›cicielem jest '[NAME]', chciaÅ‚by: [QUESTIONS] -Zgadzasz siÄ™? +Czy siÄ™ zgadzasz? <form name="form"> <button name="Yes" text="Tak"/> <button name="No" text="Nie"/> @@ -2451,12 +2487,12 @@ Zgadzasz siÄ™? </form> </notification> <notification name="ScriptQuestionCaution"> - Obiekt '[OBJECTNAME]', należący do '[NAME]' proponuje Ci: + Obiekt '<nolink>[OBJECTNAME]</nolink>', którego wÅ‚aÅ›cicielem jest '[NAME]' chciaÅ‚by: [QUESTIONS] -Jeżeli nie znasz tego obiektu lub kreatora, odmów. +JeÅ›li nie ufasz temu obiektowi i jego kreatorowi, odmów. -Zgadzasz siÄ™? +Czy siÄ™ zgadzasz? <form name="form"> <button name="Grant" text="Zaakceptuj"/> <button name="Deny" text="Odmów"/> @@ -2464,14 +2500,14 @@ Zgadzasz siÄ™? </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST]'s '[TITLE]' + [NAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button name="Ignore" text="Zignoruj"/> </form> </notification> <notification name="ScriptDialogGroup"> - [GROUPNAME]'s '[TITLE]' + [GROUPNAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button name="Ignore" text="Zignoruj"/> @@ -2510,13 +2546,13 @@ Wybierz Zablokuj żeby wyciszyć dzwoniÄ…cÄ… osób </form> </notification> <notification name="AutoUnmuteByIM"> - Wiadomość (IM) zostaÅ‚a wysÅ‚ana do [FIRST] [LAST] i blokada zostaÅ‚a automatycznie usuniÄ™ta. + WysÅ‚ano [NAME] prywatnÄ… wiadomość i ta osoba zostaÅ‚a automatycznie odblokowana. </notification> <notification name="AutoUnmuteByMoney"> - PieniÄ…dze zostaÅ‚y przekazane do [FIRST] [LAST] i blokada zostaÅ‚a automatycznie usuniÄ™ta. + Przekazano [NAME] pieniÄ…dze i ta osoba zostaÅ‚a automatycznie odblokowana. </notification> <notification name="AutoUnmuteByInventory"> - Oferta z szafy dla [FIRST] [LAST] i blokada zostaÅ‚a automatycznie usuniÄ™ta. + Zaoferowno [NAME] obiekty i ta osoba zostaÅ‚a automatycznie odblokowana. </notification> <notification name="VoiceInviteGroup"> [NAME] zaczyna rozmowÄ™ z grupÄ… [GROUP]. @@ -2742,6 +2778,37 @@ To spowoduje również wyciszenie wszystkich Rezydentów, którzy doÅ‚Ä…czÄ… pó Wyciszyć wszystkich? <usetemplate ignoretext="Potwierdź zanim zostanÄ… wyciszeni wszyscy uczestnicy rozmowy gÅ‚osowej w grupie" name="okcancelignore" notext="Anuluj" yestext="Ok"/> </notification> + <notification label="Czat" name="HintChat"> + W celu przylÄ…czenia siÄ™ do rozmowy zacznij pisać w poniższym polu czatu. + </notification> + <notification label="WstaÅ„" name="HintSit"> + Aby wstać i opuÅ›cić pozycjÄ™ siedzÄ…cÄ…, kliknij przycisk WstaÅ„. + </notification> + <notification label="Odkrywaj Åšwiat" name="HintDestinationGuide"> + Destination Guide zawiera tysiÄ…ce nowych miejsc do odkrycia. Wybierz lokalizacjÄ™ i teleportuj siÄ™ aby rozpocząć zwiedzanie. + </notification> + <notification label="Schowek" name="HintSidePanel"> + Schowek umożliwia szybki dostÄ™p do Twojej Szafy, ubraÅ„, profili i innych w panelu bocznym. + </notification> + <notification label="Ruch" name="HintMove"> + Aby chodzić lub biegać, otwórz panel ruchu i użyj strzaÅ‚ek do nawigacji. Możesz także używać strzaÅ‚ek z klawiatury. + </notification> + <notification label="WyÅ›wietlana nazwa" name="HintDisplayName"> + Ustaw wyÅ›wietlanÄ… nazwÄ™, którÄ… możesz zmieniać tutaj. Jest ona dodatkiem do unikatowej nazwy użytkownika, która nie może być zmieniona. Możesz zmienić sposób w jaki widzisz nazwy innych osób w Twoich Ustawieniach. + </notification> + <notification label="Szafa" name="HintInventory"> + Sprawdź swojÄ… SzafÄ™ aby znaleźć obiekty. Najnowsze obiekty mogÄ… być Å‚atwo odnalezione w zakÅ‚adce Nowe obiekty. + </notification> + <notification label="Otrzymano L$!" name="HintLindenDollar"> + Tutaj znajduje siÄ™ Twoj bieżący bilans L$. Kliknij Kup aby kupić wiÄ™cej L$. + </notification> + <notification name="PopupAttempt"> + WyskakujÄ…ce okienko zostaÅ‚o zablokowane. + <form name="form"> + <ignore name="ignore" text="Zezwól na wyskakujÄ…ce okienka"/> + <button name="open" text="Otwórz wyskakujÄ…ce okno."/> + </form> + </notification> <global name="UnsupportedCPU"> - PrÄ™dkość Twojego CPU nie speÅ‚nia minimalnych wymagaÅ„. </global> diff --git a/indra/newview/skins/default/xui/pl/panel_audio_device.xml b/indra/newview/skins/default/xui/pl/panel_audio_device.xml deleted file mode 100644 index 9074296bd5..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_audio_device.xml +++ /dev/null @@ -1,26 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="device_settings"> - <text name="Audio Devices"> - UrzÄ…dzenia audio - </text> - <text name="Input device (microphone):"> - UrzÄ…dzenia wejÅ›ciowe (mikrofon): - </text> - <text name="Output device (speakers):"> - UrzÄ…dzenia wyjÅ›ciowe (gÅ‚oÅ›niki): - </text> - <text name="Input level:"> - Poziom wejÅ›cia - </text> - <text_editor name="voice_intro_text1"> - Za pomocÄ… suwaka ustaw poziom gÅ‚oÅ›noÅ›ci Twojego mówienia dla innych Rezydentów. W celu przetestowania poziomu wejÅ›cia, zacznij mówić do mikrofonu. - </text_editor> - <volume_slider name="mic_volume_slider" - tool_tip="By zmienić poziom gÅ‚oÅ›noÅ›ci użyj suwaka" /> - <text name="wait_text"> - ProszÄ™ poczekać - </text> - <string name="default_text"> - DomyÅ›lne - </string> -</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml index fdc691cbb9..c409666ec9 100644 --- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml @@ -22,6 +22,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="data_panel"> + <text name="display_name_label" value="WyÅ›wietlana nazwa:"/> + <text name="solo_username_label" value="Nazwa użytkownika:"/> + <button name="set_name" tool_tip="Ustaw wyÅ›wietlaniÄ… nazwÄ™."/> + <text name="solo_user_name" value="Hamilton Hitchings"/> + <text name="user_name" value="Hamilton Hitchings"/> + <text name="user_name_small" value="Hamilton Hitchings"/> + <text name="user_label" value="Nazwa użytkownika:"/> + <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij aby wybrać teksturÄ™"/> </panel> @@ -38,7 +46,7 @@ <text name="my_account_link" value="[[URL] idź do dashboard]"/> <text name="title_partner_text" value="Partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(wyszukiwanie)" name="partner_text" value="[FIRST] [LAST]"/> + <text initial_value="(wyszukiwanie)" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] Edytuj]"/> </panel> diff --git a/indra/newview/skins/default/xui/pl/panel_friends.xml b/indra/newview/skins/default/xui/pl/panel_friends.xml deleted file mode 100644 index 9d8dc69a35..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_friends.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="friends"> - <string name="Multiple"> - Znajomi - </string> - <scroll_list name="friend_list" tool_tip="Aby wybrać wielu znajomych za jednym razem przetrzymaj klawisz Shift lub Control"> - <column name="icon_online_status" tool_tip="Status dostÄ™pnoÅ›ci"/> - <column label="ImiÄ™" name="friend_name" tool_tip="ImiÄ™"/> - <column name="icon_visible_online" tool_tip="Ta osoba może widzieć czy jesteÅ› w Second Life"/> - <column name="icon_visible_map" tool_tip="Ta osoba może zlokalizować Ciebie na mapie"/> - <column name="icon_edit_mine" tool_tip="Ta osoba może edytować, usunąć lub wziąć Twoje obiekty"/> - <column name="icon_edit_theirs" tool_tip="Możesz edytować obiekty tej osoby"/> - </scroll_list> - <button label="Czat/IM" name="im_btn" tool_tip="Rozpocznij sesjÄ™ czatu/IM"/> - <button label="Profil" name="profile_btn" tool_tip="Pokaż zdjÄ™cia, grupy i inne informacje"/> - <button label="Teleportuj" name="offer_teleport_btn" tool_tip="Zaoferuj teleportacjÄ™ do siebie"/> - <button label="ZapÅ‚ać" name="pay_btn" tool_tip="ZapÅ‚ać L$ tej osobie"/> - <button label="UsuÅ„" name="remove_btn" tool_tip="UsuÅ„ tÄ™ osobÄ™ z listy znajomych"/> - <button label="Dodaj" name="add_btn" tool_tip="Zaoferuj znajomość"/> -</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml index d29393de2d..aea4e50fd5 100644 --- a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml @@ -24,6 +24,7 @@ <scroll_list.columns label="Region" name="location"/> <scroll_list.columns label="Typ" name="type"/> <scroll_list.columns label="Obszar" name="area"/> + <scroll_list.columns label="Ukryte" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Kontrybucje: diff --git a/indra/newview/skins/default/xui/pl/panel_groups.xml b/indra/newview/skins/default/xui/pl/panel_groups.xml deleted file mode 100644 index 671d8fd2f0..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_groups.xml +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<panel name="groups"> - <scroll_list name="group list"> - <column label="" name="name" /> - </scroll_list> - <text name="groupdesc"> - Twoja aktywna grupa jest pogrubiona. - </text> - <text name="groupcount"> - Należysz do [COUNT] grup (maksimum to [MAX]). - </text> - <button label="Czat/IM" name="IM" tool_tip="Rozpocznij sesjÄ™ czatu (IM)" /> - <button label="O grupie" name="Info" /> - <button label="Wybierz" name="Activate" /> - <button label="Opuść" name="Leave" /> - <button label="Stwórz..." name="Create" /> - <button label="Szukaj..." name="Search..." /> -</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml index b5899f1009..30432c509d 100644 --- a/indra/newview/skins/default/xui/pl/panel_login.xml +++ b/indra/newview/skins/default/xui/pl/panel_login.xml @@ -11,7 +11,7 @@ <text name="username_text"> Użytkownik: </text> - <line_editor label="Użytkownik" name="username_edit" tool_tip="[SECOND_LIFE] Użytkownik"/> + <line_editor label="bobsmith12 lub Steller Sunshine" name="username_edit" tool_tip="NazwÄ™ użytkownika wybierasz podczas rejestracji, np: like bobsmith12 lub Steller Sunshine"/> <text name="password_text"> HasÅ‚o: </text> @@ -31,7 +31,7 @@ Utwórz nowe konto </text> <text name="forgot_password_text"> - Nie pamiÄ™tasz hasÅ‚a? + ZapomniaÅ‚eÅ› swojej nazwy użytkownika lub hasÅ‚a? </text> <text name="login_help"> Potrzebujesz pomocy z logowaniem siÄ™? diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml deleted file mode 100644 index bcecaeabb3..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name"> - CZAT LOKALNY - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/pl/panel_online_status.xml b/indra/newview/skins/default/xui/pl/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/pl/panel_place_profile.xml b/indra/newview/skins/default/xui/pl/panel_place_profile.xml index 7a71a10034..2a4ffab36c 100644 --- a/indra/newview/skins/default/xui/pl/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_place_profile.xml @@ -76,7 +76,7 @@ <text name="region_rating_label" value="Rodzaj:"/> <text name="region_rating" value="Adult"/> <text name="region_owner_label" value="WÅ‚aÅ›ciciel:"/> - <text name="region_owner" value="moose Van Moose"/> + <text name="region_owner" value="moose Van Moose extra long name moose"/> <text name="region_group_label" value="Grupa:"/> <text name="region_group"> The Mighty Moose of mooseville soundvillemoose @@ -89,6 +89,7 @@ <text name="estate_name_label" value="MajÄ…tek:"/> <text name="estate_rating_label" value="Rodzaj:"/> <text name="estate_owner_label" value="WÅ‚aÅ›ciciel:"/> + <text name="estate_owner" value="Testing owner name length with long name"/> <text name="covenant_label" value="Umowa:"/> </panel> </accordion_tab> 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 65ea349aec..00dc84dd7a 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml @@ -44,9 +44,10 @@ <radio_item label="WÅ‚Ä…cz" name="radio2" value="1"/> <radio_item label="Pokaż w skrócie" name="radio3" value="2"/> </radio_group> - <check_box label="WyÅ›wietl moje imiÄ™:" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Używaj maÅ‚ych imion awatarów" name="small_avatar_names_checkbox"/> - <check_box label="WyÅ›wietl tytuÅ‚ grupowy" name="show_all_title_checkbox1"/> + <check_box label="WyÅ›wietl moje imiÄ™" name="show_my_name_checkbox1"/> + <check_box label="Nazwy użytkowników" name="show_slids" tool_tip="Pokaż nazwy użytkowników, np. bobsmith123"/> + <check_box label="WyÅ›wietl tytuÅ‚ grupowy" name="show_all_title_checkbox1" tool_tip="WyÅ›wietl tytuÅ‚ grupowy np. oficer"/> + <check_box label="Zaznacz znajomych" name="show_friends" tool_tip="Zaznacz imiona swoich znajomych"/> <text name="effects_color_textbox"> Kolor moich efektów: </text> @@ -61,6 +62,7 @@ <combo_box.item label="30 minut" name="item3"/> <combo_box.item label="nigdy" name="item4"/> </combo_box> + <check_box label="Pokaż wyÅ›wietlane nazwy" name="display_names_check" tool_tip="Pokaż wyÅ›wietlane nazwy w czacie, IM, imionach, etc."/> <text name="text_box3"> Odpowiedź w trybie pracy: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml index b6578d21ca..24e5c2b824 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Ustawienia" name="Input panel"> - <button label="Ustawienia joysticka" name="joystick_setup_button"/> <text name="Mouselook:"> Widok panoramiczny: </text> @@ -38,10 +37,11 @@ <radio_item label="Użyj zewnÄ™trznej przeglÄ…darki (IE, Firefox, Safari)" name="external" tool_tip="Używaj zewnÄ™trznej przeglÄ…darki. Nie jest to rekomendowane w trybie peÅ‚noekranowym." value="1"/> <radio_item label="Używaj wbudowanej przeglÄ…darki." name="internal" tool_tip="Używaj wbudowanej przeglÄ…darki. Ta przeglÄ…darka otworzy nowe okno w [APP_NAME]." value=""/> </radio_group> - <check_box label="Zezwalaj na wtyczki" name="browser_plugins_enabled"/> - <check_box label="Akceptuj ciasteczka z Internetu" name="cookies_enabled"/> - <check_box label="Zezwalaj na Javascript" name="browser_javascript_enabled"/> - <check_box label="Używaj serwera proxy" name="web_proxy_enabled"/> + <check_box initial_value="true" label="Zezwalaj na wtyczki" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Akceptuj ciasteczka z Internetu" name="cookies_enabled"/> + <check_box initial_value="true" label="Zezwalaj na Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="nieprawda" label="Zezwól na wyskakujÄ…ce okienka przeglÄ…darki mediów" name="media_popup_enabled"/> + <check_box initial_value="false" label="Używaj serwera proxy" name="web_proxy_enabled"/> <text name="Proxy location"> Lokalizacja proxy: </text> diff --git a/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml index a1a9be9242..b5763e1291 100644 --- a/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml @@ -13,9 +13,9 @@ 50 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="Wczytywanie mediów"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/pl/panel_profile_view.xml b/indra/newview/skins/default/xui/pl/panel_profile_view.xml index 637b278ef2..3590e9222e 100644 --- a/indra/newview/skins/default/xui/pl/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/pl/panel_profile_view.xml @@ -6,8 +6,14 @@ <string name="status_offline"> Nieaktywny </string> - <text_editor name="user_name" value="(Åadowanie...)"/> + <text name="display_name_label" value="WyÅ›wietlana nazwa:"/> + <text name="solo_username_label" value="Nazwa użytkownika:"/> <text name="status" value="Obecnie w SL"/> + <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> + <text name="user_name" value="Jack Linden"/> + <button name="copy_to_clipboard" tool_tip="Kopiuj do schowka"/> + <text name="user_label" value="Nazwa użytkownika:"/> + <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PROFIL" name="panel_profile"/> <panel label="ULUBIONE" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml b/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml deleted file mode 100644 index 84d7d7ab62..0000000000 --- a/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Region" name="General"> - <text name="region_text_lbl"> - Region: - </text> - <text name="region_text"> - nieznany - </text> - <text name="version_channel_text_lbl"> - Wersja: - </text> - <text name="version_channel_text"> - nieznany - </text> - <text name="region_type_lbl"> - Typ: - </text> - <text name="region_type"> - nieznany - </text> - <check_box label="Zablokuj zmiany terenu" name="block_terraform_check"/> - <check_box label="Zablokuj latanie" name="block_fly_check"/> - <check_box label="Uszkodzenia dozwolone" name="allow_damage_check"/> - <check_box label="Zablokuj popychanie" name="restrict_pushobject"/> - <check_box label="Odsprzedaż dozwolona" name="allow_land_resell_check"/> - <check_box label="ÅÄ…czenie/Dzielenie dozwolone" name="allow_parcel_changes_check"/> - <check_box label="Zablokuj wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyÅ›wietlanie nazwy Regionu i PosiadÅ‚oÅ›ci w wynikach wyszukiwania"/> - <spinner label="Limit goÅ›ci" name="agent_limit_spin"/> - <spinner label="Ekstra obiekty" name="object_bonus_spin"/> - <text label="Restrykcje wieku" name="access_text"> - Rodzaj: - </text> - <combo_box label="Moderuj" name="access_combo"> - <combo_box.item label="Adult" name="Adult"/> - <combo_box.item label="Moderate" name="Mature"/> - <combo_box.item label="General" name="PG"/> - </combo_box> - <button label="Zastosuj" name="apply_btn"/> - <button label="Teleportuj do Miejsca Startu jednego Rezydenta..." name="kick_btn"/> - <button label="Teleportuj do Miejsca Startu wszystkich Rezydentów..." name="kick_all_btn"/> - <button label="WyÅ›lij wiadomość do Regionu..." name="im_btn"/> - <button label="ObsÅ‚uga teleportera..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/pl/role_actions.xml b/indra/newview/skins/default/xui/pl/role_actions.xml index 53530fff5e..57df2bc70f 100644 --- a/indra/newview/skins/default/xui/pl/role_actions.xml +++ b/indra/newview/skins/default/xui/pl/role_actions.xml @@ -1,76 +1,73 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> <action_set description="Przywileje pozwajajÄ…ce na dodawanie i usuwanie czÅ‚onków oraz pozwalajÄ… nowym czÅ‚onkom na dodawanie siÄ™ bez zaproszenia." name="Membership"> - <action description="Zapraszanie do grupy" longdescription="Zapraszanie nowych ludzi do grupy używajÄ…c przycisku 'ZaproÅ›' w sekcji Ról > CzÅ‚onkowie" name="member invite"/> - <action description="Usuwanie z grupy" longdescription="Usuwanie czÅ‚onków z grupy używajÄ…c 'UsuÅ„ z Grupy'; pod CzÅ‚onkowie > CzÅ‚onkowie. WÅ‚aÅ›ciciel może usunąć każdego za wyjÄ…tkiem innego WÅ‚aÅ›ciciela. Jeżeli nie jesteÅ› WÅ‚aÅ›cicielem możesz tylko usuwać CzÅ‚onków w Funkcji Każdy i tylko wtedy kiedy nie majÄ… żadnej innej Funkcji. Aby odebrać CzÅ‚onkowi FunkcjÄ™ musisz mieć Przywilej 'Odbieranie Funkcji'." name="member eject"/> - <action description="Selekcja opcji 'Wolne Zapisy' i wybór 'OpÅ‚aty WstÄ™pnej'" longdescription="Selekcja opcji 'Wolne Zapisy' (pozwala nowym CzÅ‚onkom na dodawanie siÄ™ bez zaproszenia) i wybór 'OpÅ‚aty WstÄ™pnej' w Ustawieniach Grupy w sekcji Ogólne." name="member options"/> + <action description="Zapraszanie do grupy" longdescription="Zapraszanie nowych ludzi do grupy używajÄ…c przycisku 'ZaproÅ›' w sekcji Ról > CzÅ‚onkowie" name="member invite" value="1"/> + <action description="Usuwanie z grupy" longdescription="Usuwanie czÅ‚onków z grupy używajÄ…c 'UsuÅ„ z Grupy'; pod CzÅ‚onkowie > CzÅ‚onkowie. WÅ‚aÅ›ciciel może usunąć każdego za wyjÄ…tkiem innego WÅ‚aÅ›ciciela. Jeżeli nie jesteÅ› WÅ‚aÅ›cicielem możesz tylko usuwać CzÅ‚onków w Funkcji Każdy i tylko wtedy kiedy nie majÄ… żadnej innej Funkcji. Aby odebrać CzÅ‚onkowi FunkcjÄ™ musisz mieć Przywilej 'Odbieranie Funkcji'." name="member eject" value="2"/> + <action description="Selekcja opcji 'Wolne Zapisy' i wybór 'OpÅ‚aty WstÄ™pnej'" longdescription="Selekcja opcji 'Wolne Zapisy' (pozwala nowym CzÅ‚onkom na dodawanie siÄ™ bez zaproszenia) i wybór 'OpÅ‚aty WstÄ™pnej' w Ustawieniach Grupy w sekcji Ogólne." name="member options" value="3"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na dodawanie, usuwanie i edycjÄ™ funkcji w grupie, oraz na nadawanie i odbieranie funkcji, oraz na przypisywanie Przywilejów do Funkcji." name="Roles"> - <action description="Dodawanie funkcji" longdescription="Dodawanie nowych funkcji pod CzÅ‚onkowie > Funkcje." name="role create"/> - <action description="Usuwanie funkcji" longdescription="UsuÅ„ Funkcje w zakÅ‚adce Funkcje > Funkcje" name="role delete"/> - <action description="Zmiany nazw funkcji, tytułów i opisów i widoczność czÅ‚onków w informacjach o grupie" longdescription="Zmiany nazw Funkcji, Tytułów i Opisów i wybór czy CzÅ‚onkowie z danÄ… RolÄ… sÄ… widoczni Informacji o Grupie w dolnej części sekcji Funkcji > Funkcje po wybraniu Funkcje." name="role properties"/> - <action description="Przypisywanie czÅ‚onków do posiadanych funkcji" longdescription="Przypisywanie CzÅ‚onków do Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. CzÅ‚onek z tym Przywilejem może dodawać CzÅ‚onków do Funkcji które sam już posiada." name="role assign member limited"/> - <action description="Przypisywanie czÅ‚onków do wszystkich funkcji" longdescription="Przypisywanie CzÅ‚onków do wszystkich Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać siebie i innych CzÅ‚onków nie bÄ™dÄ…cych WÅ‚aÅ›cicielami do Funkcji dajÄ…cych wiÄ™cej Przywilejów niż posiadane obecnie potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." name="role assign member"/> - <action description="Odbieranie funkcji" longdescription="Odbieranie Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. Funkcja WÅ‚aÅ›ciciela nie może być odebrana." name="role remove member"/> - <action description="Dodawanie i usuwanie przywilejów z funkcji" longdescription="Dodawanie i Usuwanie Przywilejów z Funkcji w sekcji Przwileje pod CzÅ‚onkowie > Funkcje. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać sobie i innym CzÅ‚onkom nie bÄ™dÄ…cym WÅ‚aÅ›cicielami wszystkie Przywileje potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." name="role change actions"/> + <action description="Dodawanie funkcji" longdescription="Dodawanie nowych funkcji pod CzÅ‚onkowie > Funkcje." name="role create" value="4"/> + <action description="Usuwanie funkcji" longdescription="UsuÅ„ Funkcje w zakÅ‚adce Funkcje > Funkcje" name="role delete" value="5"/> + <action description="Zmiany nazw funkcji, tytułów i opisów i widoczność czÅ‚onków w informacjach o grupie" longdescription="Zmiany nazw Funkcji, Tytułów i Opisów i wybór czy CzÅ‚onkowie z danÄ… RolÄ… sÄ… widoczni Informacji o Grupie w dolnej części sekcji Funkcji > Funkcje po wybraniu Funkcje." name="role properties" value="6"/> + <action description="Przypisywanie czÅ‚onków do posiadanych funkcji" longdescription="Przypisywanie CzÅ‚onków do Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. CzÅ‚onek z tym Przywilejem może dodawać CzÅ‚onków do Funkcji które sam już posiada." name="role assign member limited" value="7"/> + <action description="Przypisywanie czÅ‚onków do wszystkich funkcji" longdescription="Przypisywanie CzÅ‚onków do wszystkich Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać siebie i innych CzÅ‚onków nie bÄ™dÄ…cych WÅ‚aÅ›cicielami do Funkcji dajÄ…cych wiÄ™cej Przywilejów niż posiadane obecnie potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." name="role assign member" value="8"/> + <action description="Odbieranie funkcji" longdescription="Odbieranie Funkcji w sekcji Przypisane Funkcje pod CzÅ‚onkowie > CzÅ‚onkowie. Funkcja WÅ‚aÅ›ciciela nie może być odebrana." name="role remove member" value="9"/> + <action description="Dodawanie i usuwanie przywilejów z funkcji" longdescription="Dodawanie i Usuwanie Przywilejów z Funkcji w sekcji Przwileje pod CzÅ‚onkowie > Funkcje. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może przypisać sobie i innym CzÅ‚onkom nie bÄ™dÄ…cym WÅ‚aÅ›cicielami wszystkie Przywileje potencjalnie dajÄ…ce możliwoÅ›ci zbliżone do możliwoÅ›ci WÅ‚aÅ›ciciela. Udzielaj tego Przywileju z rozwagÄ…." name="role change actions" value="10"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na edycjÄ™ atrybutów Grupy takich jak widoczność w wyszukiwarce, status i insygnia." name="Group Identity"> - <action description="Zmiany statusu grupy, insygniów, 'Widoczność w Wyszukiwarce' i widoczność CzÅ‚onków w Informacjach o Grupie." longdescription="Zmiany Statusu Grupy, Insygniów, i Widoczność w Wyszukiwarce. DostÄ™p poprzez ustawienia Ogólne." name="group change identity"/> + <action description="Zmiany statusu grupy, insygniów, 'Widoczność w Wyszukiwarce' i widoczność CzÅ‚onków w Informacjach o Grupie." longdescription="Zmiany Statusu Grupy, Insygniów, i Widoczność w Wyszukiwarce. DostÄ™p poprzez ustawienia Ogólne." name="group change identity" value="11"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na przypisywanie, modyfikacje i sprzedaż posiadÅ‚oÅ›ci grupy. Aby zobaczyć okno O PosiadÅ‚oÅ›ci wybierz grunt prawym klawiszem myszki i wybierz 'O PosiadÅ‚oÅ›ci' albo wybierz ikonÄ™ 'i' w głównym menu." name="Parcel Management"> - <action description="Przypisywanie i kupowanie posiadÅ‚oÅ›ci dla grupy" longdescription="Przypisywanie i kupowanie PosiadÅ‚oÅ›ci dla Grupy. DostÄ™p poprzez O PosiadloÅ›ci > ustawienia Ogólne." name="land deed"/> - <action description="Oddawanie posiadÅ‚oÅ›ci do Linden Lab" longdescription="Oddawanie PosiadÅ‚oÅ›ci do Linden Lab. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może porzucać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne oddajÄ…c PosiadÅ‚oÅ›ci za darmo do Linden Labs! Udzielaj tego Przywileju z rozwagÄ…." name="land release"/> - <action description="Sprzedaż posiadÅ‚oÅ›ci" longdescription="Sprzedaż PosiadÅ‚oÅ›ci. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może sprzedawać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne! Udzielaj tego Przywileju z rozwagÄ…." name="land set sale info"/> - <action description="PodziaÅ‚ i Å‚Ä…czenie posiadÅ‚oÅ›ci" longdescription="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci. DostÄ™p poprzez wybranie gruntu prawym klawiszem myszki, 'Edycja Terenu', i przesuwanie myszkÄ… po gruncie wybierajÄ…c obszar. Aby podzielić wybierz obszar i naciÅ›nij 'Podziel'. Aby poÅ‚Ä…czyć wybierz dwie albo wiÄ™cej sÄ…siadujÄ…ce PosiadÅ‚oÅ›ci i naciÅ›nij 'PoÅ‚Ä…cz'." name="land divide join"/> + <action description="Przypisywanie i kupowanie posiadÅ‚oÅ›ci dla grupy" longdescription="Przypisywanie i kupowanie PosiadÅ‚oÅ›ci dla Grupy. DostÄ™p poprzez O PosiadloÅ›ci > ustawienia Ogólne." name="land deed" value="12"/> + <action description="Oddawanie posiadÅ‚oÅ›ci do Linden Lab" longdescription="Oddawanie PosiadÅ‚oÅ›ci do Linden Lab. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może porzucać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne oddajÄ…c PosiadÅ‚oÅ›ci za darmo do Linden Labs! Udzielaj tego Przywileju z rozwagÄ…." name="land release" value="13"/> + <action description="Sprzedaż posiadÅ‚oÅ›ci" longdescription="Sprzedaż PosiadÅ‚oÅ›ci. *UWAGA* CzÅ‚onek w Funkcji z tym Przywilejem może sprzedawać PosiadloÅ›ci Grupy poprzez O PosiadloÅ›ci > ustawienia Ogólne! Udzielaj tego Przywileju z rozwagÄ…." name="land set sale info" value="14"/> + <action description="PodziaÅ‚ i Å‚Ä…czenie posiadÅ‚oÅ›ci" longdescription="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci. DostÄ™p poprzez wybranie gruntu prawym klawiszem myszki, 'Edycja Terenu', i przesuwanie myszkÄ… po gruncie wybierajÄ…c obszar. Aby podzielić wybierz obszar i naciÅ›nij 'Podziel'. Aby poÅ‚Ä…czyć wybierz dwie albo wiÄ™cej sÄ…siadujÄ…ce PosiadÅ‚oÅ›ci i naciÅ›nij 'PoÅ‚Ä…cz'." name="land divide join" value="15"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na zmianÄ™ nazwy PosiadÅ‚oÅ›ci, widoczność w wyszukiwarce, widoczność w wyszukiwarce, wybór miejsce lÄ…dowania i zmianÄ™ ustawieÅ„ teleportacji (TP)." name="Parcel Identity"> - <action description="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii" longdescription="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > Opcje." name="land find places"/> - <action description="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'" longdescription="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'. DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land change identity"/> - <action description="Wybór miejsca lÄ…dowania i ustawienia teleportacji (TP)" longdescription="Na PosiadÅ‚oÅ›ci Grupy CzÅ‚onek w Funkcji z tym Przywilejem może wybrać miejsce gdzie teleportujÄ…ce siÄ™ osoby bÄ™dÄ… ladować oraz może ustalić dodatkowe parametry teleportacji (TP). DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land set landing point"/> + <action description="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii" longdescription="Selekcja opcji 'Pokazuj w szukaniu miejsc' i wybór kategorii PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > Opcje." name="land find places" value="17"/> + <action description="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'" longdescription="Zmiany nazwy PosiadÅ‚oÅ›ci, opisu i selekcja 'Widoczność w Wyszukiwarce'. DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land change identity" value="18"/> + <action description="Wybór miejsca lÄ…dowania i ustawienia teleportacji (TP)" longdescription="Na PosiadÅ‚oÅ›ci Grupy CzÅ‚onek w Funkcji z tym Przywilejem może wybrać miejsce gdzie teleportujÄ…ce siÄ™ osoby bÄ™dÄ… ladować oraz może ustalić dodatkowe parametry teleportacji (TP). DostÄ™p poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land set landing point" value="19"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na zmianÄ™ opcji PosiadÅ‚oÅ›ci takich jak 'Tworzenie Obiektów', 'Edycja Terenu' i zmianÄ™ ustawieÅ„ muzyki & mediów." name="Parcel Settings"> - <action description="Zmiany ustawieÅ„ muzyki & mediów" longdescription="Zmiany ustawieÅ„ muzyki & mediów pod O PosiadÅ‚oÅ›ci > Media." name="land change media"/> - <action description="Selekcja opcji 'Edycja Terenu'" longdescription="Selekcja opcji 'Edycja Terenu'. *UWAGA* O PosiadÅ‚oÅ›ci > Opcje > Edycja Terenu pozwala każdemu na formowanie gruntów Twojej PosiadÅ‚oÅ›ci oraz na przemieszczanie roÅ›lin z Linden Labs. Udzielaj tego Przywileju z rozwagÄ…. Selekcja opcji Edycji Terenu jest dostÄ™pna poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land edit"/> - <action description="Dodatkowe ustawienia O PosiadÅ‚oÅ›ci > Opcje" longdescription="Selekcja opcji 'BezpieczeÅ„stwo (brak uszkodzeÅ„)' 'Latanie', opcje dla innych Rezydentów: 'Tworzenie Obiektów'; 'Edycja Terenu', 'ZapamiÄ™tywanie Miejsca (LM)', i 'Skrypty' na PosiadÅ‚oÅ›ciach Grupy pod O PosiadÅ‚oÅ›ci > Opcje." name="land options"/> + <action description="Zmiany ustawieÅ„ muzyki & mediów" longdescription="Zmiany ustawieÅ„ muzyki & mediów pod O PosiadÅ‚oÅ›ci > Media." name="land change media" value="20"/> + <action description="Selekcja opcji 'Edycja Terenu'" longdescription="Selekcja opcji 'Edycja Terenu'. *UWAGA* O PosiadÅ‚oÅ›ci > Opcje > Edycja Terenu pozwala każdemu na formowanie gruntów Twojej PosiadÅ‚oÅ›ci oraz na przemieszczanie roÅ›lin z Linden Labs. Udzielaj tego Przywileju z rozwagÄ…. Selekcja opcji Edycji Terenu jest dostÄ™pna poprzez O PosiadÅ‚oÅ›ci > Opcje." name="land edit" value="21"/> + <action description="Dodatkowe ustawienia O PosiadÅ‚oÅ›ci > Opcje" longdescription="Selekcja opcji 'BezpieczeÅ„stwo (brak uszkodzeÅ„)' 'Latanie', opcje dla innych Rezydentów: 'Tworzenie Obiektów'; 'Edycja Terenu', 'ZapamiÄ™tywanie Miejsca (LM)', i 'Skrypty' na PosiadÅ‚oÅ›ciach Grupy pod O PosiadÅ‚oÅ›ci > Opcje." name="land options" value="22"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce czÅ‚onkom na omijanie ograniczeÅ„ na PosiadÅ‚oÅ›ciach Grupy." name="Parcel Powers"> - <action description="Pozwól na edycjÄ™ terenu" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze edytować teren na PosiadÅ‚oÅ›ciach Grupy." name="land allow edit land"/> - <action description="Pozwól na latanie" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze latać na PosiadÅ‚oÅ›ciach Grupy." name="land allow fly"/> - <action description="Pozwól na tworzenie obiektów" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze tworzyć obiekty na PosiadÅ‚oÅ›ciach Grupy." name="land allow create"/> - <action description="Pozwól na zapamiÄ™tywanie miejsc (LM)" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze zapamiÄ™tywać miejsca (LM) na PosiadÅ‚oÅ›ciach Grupy." name="land allow landmark"/> - <action description="Pozwól na wybór Miejsca Startu na posiadÅ‚oÅ›ciach grupy" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… używać menu Åšwiat > ZapamiÄ™taj Miejsce > Miejsce Startu na PosiadÅ‚oÅ›ci przypisanej Grupie." name="land allow set home"/> + <action description="Pozwól na edycjÄ™ terenu" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze edytować teren na PosiadÅ‚oÅ›ciach Grupy." name="land allow edit land" value="23"/> + <action description="Pozwól na latanie" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze latać na PosiadÅ‚oÅ›ciach Grupy." name="land allow fly" value="24"/> + <action description="Pozwól na tworzenie obiektów" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze tworzyć obiekty na PosiadÅ‚oÅ›ciach Grupy." name="land allow create" value="25"/> + <action description="Pozwól na zapamiÄ™tywanie miejsc (LM)" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zawsze zapamiÄ™tywać miejsca (LM) na PosiadÅ‚oÅ›ciach Grupy." name="land allow landmark" value="26"/> + <action description="Pozwól na wybór Miejsca Startu na posiadÅ‚oÅ›ciach grupy" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… używać menu Åšwiat > ZapamiÄ™taj Miejsce > Miejsce Startu na PosiadÅ‚oÅ›ci przypisanej Grupie." name="land allow set home" value="28"/> + <action description="Pozwól na "ImprezÄ™" na posiadÅ‚oÅ›ci grupy." longdescription="CzÅ‚onkowie w funkcji z tym przywilejem mogÄ… wskazać posiadÅ‚ość grupy jako miejsce imprezy." name="land allow host event" value="41"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na dawanie i odbieranie dostÄ™pu do PosiadÅ‚oÅ›ci Grupy zawierajÄ…ce możliwoÅ›ci unieruchomiania i wyrzucania Rezydentów." name="Parcel Access"> - <action description="ZarzÄ…dzanie listÄ… dostÄ™pu do posiadÅ‚oÅ›ci" longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage allowed"/> - <action description="ZarzÄ…dzanie listÄ… usuniÄ™tych z posiadÅ‚oÅ›ci (Bany)" longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage banned"/> - <action description="Selekcja opcji 'WstÄ™p PÅ‚atny'" longdescription="Selekcja opcji 'WstÄ™p PÅ‚atny'; pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage passes"/> - <action description="Wyrzucanie i unieruchamianie Rezydentów na posiadÅ‚oÅ›ciach" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wpÅ‚ywać na niepożądanych na PosiadÅ‚oÅ›ciach Grupy Rezydentów wybierajÄ…c ich prawym klawiszem myszki i wybierajÄ…c ';Wyrzuć' albo 'Unieruchom'." name="land admin"/> + <action description="ZarzÄ…dzanie listÄ… dostÄ™pu do posiadÅ‚oÅ›ci" longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage allowed" value="29"/> + <action description="ZarzÄ…dzanie listÄ… usuniÄ™tych z posiadÅ‚oÅ›ci (Bany)" longdescription="ZarzÄ…dzanie ListÄ… DostÄ™pu do PosiadÅ‚oÅ›ci pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage banned" value="30"/> + <action description="Selekcja opcji 'WstÄ™p PÅ‚atny'" longdescription="Selekcja opcji 'WstÄ™p PÅ‚atny'; pod O PosiadÅ‚oÅ›ci > DostÄ™p." name="land manage passes" value="31"/> + <action description="Wyrzucanie i unieruchamianie Rezydentów na posiadÅ‚oÅ›ciach" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wpÅ‚ywać na niepożądanych na PosiadÅ‚oÅ›ciach Grupy Rezydentów wybierajÄ…c ich prawym klawiszem myszki i wybierajÄ…c ';Wyrzuć' albo 'Unieruchom'." name="land admin" value="32"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na odsyÅ‚anie obiektów i przemieszczanie roÅ›lin z Linden Lab. Użyteczne przy porzÄ…dkowaniu i przemieszczaniu roÅ›linnoÅ›ci. *UWAGA* OdsyÅ‚anie obiektów jest nieodwracalne." name="Parcel Content"> - <action description="OdsyÅ‚anie obiektów należących do grupy" longdescription="OdsyÅ‚anie obiektów należących do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return group owned"/> - <action description="OdsyÅ‚anie obiektów przypisanych do grupy" longdescription="OdsyÅ‚anie obiektów przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return group set"/> - <action description="OdsyÅ‚anie obiektów nie przypisanych do grupy" longdescription="OdsyÅ‚anie obiektów nie przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return non group"/> - <action description="Ogrodnictwo używajÄ…c roÅ›lin z Linden Lab" longdescription="Możliwość przemieszczenia roÅ›lin z Linden Lab. Obiekty te mogÄ… zostać odnalezione w Twojej Szafie, w folderze Biblioteka > Folderze Obiektów lub mogÄ… zostać stworzone dziÄ™ki aktywacji NarzÄ™dzi Edycji." name="land gardening"/> + <action description="OdsyÅ‚anie obiektów należących do grupy" longdescription="OdsyÅ‚anie obiektów należących do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return group owned" value="48"/> + <action description="OdsyÅ‚anie obiektów przypisanych do grupy" longdescription="OdsyÅ‚anie obiektów przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return group set" value="33"/> + <action description="OdsyÅ‚anie obiektów nie przypisanych do grupy" longdescription="OdsyÅ‚anie obiektów nie przypisanych do Grupy pod O PosiadÅ‚oÅ›ci > Obiekty." name="land return non group" value="34"/> + <action description="Ogrodnictwo używajÄ…c roÅ›lin z Linden Lab" longdescription="Możliwość przemieszczenia roÅ›lin z Linden Lab. Obiekty te mogÄ… zostać odnalezione w Twojej Szafie, w folderze Biblioteka > Folderze Obiektów lub mogÄ… zostać stworzone dziÄ™ki aktywacji NarzÄ™dzi Edycji." name="land gardening" value="35"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na odsyÅ‚anie obiektów i przemieszczenia roÅ›lin z Linden Lab. Użyteczne przy porzÄ…dkowaniu i przemieszczenia roÅ›linnoÅ›ci. *UWAGA* OdsyÅ‚anie obiektów jest nieodwracalne." name="Object Management"> - <action description="Przypisywanie obiektów do grupy" longdescription="Przypisywanie obiektów do Grupy w NarzÄ™dziach Edycji > Ogólne" name="object deed"/> - <action description="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy" longdescription="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy w NarzÄ™dziach Edycji > Ogólne" name="object manipulate"/> - <action description="Sprzedaż obiektów należących do grupy" longdescription="Sprzedaż obiektów należących do Grupy pod NarzÄ™dzia Edycji > Ogólne." name="object set sale"/> + <action description="Przypisywanie obiektów do grupy" longdescription="Przypisywanie obiektów do Grupy w NarzÄ™dziach Edycji > Ogólne" name="object deed" value="36"/> + <action description="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy" longdescription="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy w NarzÄ™dziach Edycji > Ogólne" name="object manipulate" value="38"/> + <action description="Sprzedaż obiektów należących do grupy" longdescription="Sprzedaż obiektów należących do Grupy pod NarzÄ™dzia Edycji > Ogólne." name="object set sale" value="39"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na wybór opÅ‚at grupowych, otrzymywanie dochodu i ograniczanie dostÄ™pu do historii konta grupy." name="Accounting"> - <action description="OpÅ‚aty grupowe i dochód grupowy" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem bÄ™dÄ… automatycznie wnosić opÅ‚aty grupowe i bÄ™dÄ… otrzymywać dochód grupowy. Tzn. bÄ™dÄ… codziennie otrzymywać część dochodu ze sprzedaży PosiadÅ‚oÅ›ci Grupy oraz bÄ™dÄ… partycypować w kosztach ogÅ‚oszeÅ„ itp." name="accounting accountable"/> + <action description="OpÅ‚aty grupowe i dochód grupowy" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem bÄ™dÄ… automatycznie wnosić opÅ‚aty grupowe i bÄ™dÄ… otrzymywać dochód grupowy. Tzn. bÄ™dÄ… codziennie otrzymywać część dochodu ze sprzedaży PosiadÅ‚oÅ›ci Grupy oraz bÄ™dÄ… partycypować w kosztach ogÅ‚oszeÅ„ itp." name="accounting accountable" value="40"/> </action_set> <action_set description="Przywileje pozwalajÄ…ce na wysyÅ‚anie, odbieranie i czytanie Notek Grupy." name="Notices"> - <action description="WysyÅ‚anie notek" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wysyÅ‚ać Notki wybierajÄ…c O Grupie > Notek." name="notices send"/> - <action description="Odbieranie notek i dostÄ™p do dawniejszych notek" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… odbierać nowe i czytać dawniejsze Notki wybierajÄ…c O Grupie > Notki." name="notices receive"/> - </action_set> - <action_set description="Przywileje pozwalajÄ…ce na zgÅ‚aszanie Propozycji, gÅ‚osowanie nad Propozycjami i Å›ledzenie historii gÅ‚osowania." name="Proposals"> - <action description="ZgÅ‚aszanie propozycji" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… zgÅ‚aszać Propozycje do gÅ‚osowania wybierajÄ…c O Grupie > Propozycje." name="proposal start"/> - <action description="GÅ‚osowanie nad propozycjami" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… gÅ‚osować nad Propozycjami zgÅ‚oszonymi do gÅ‚osowania wybierajÄ…c O Grupie > Propozycje." name="proposal vote"/> + <action description="WysyÅ‚anie notek" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… wysyÅ‚ać Notki wybierajÄ…c O Grupie > Notek." name="notices send" value="42"/> + <action description="Odbieranie notek i dostÄ™p do dawniejszych notek" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… odbierać nowe i czytać dawniejsze Notki wybierajÄ…c O Grupie > Notki." name="notices receive" value="43"/> </action_set> <action_set description="Przywileje kontrolujÄ…ce czat i rozmowy grupowe." name="Chat"> - <action description="DostÄ™p do czatu grupowego" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w czacie i rozmowach grupowych." name="join group chat"/> - <action description="DostÄ™p do rozmów grupowych" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w rozmowach grupowych. UWAGA: DostÄ™p do Czatu Grupowego jest wymagany dla rozmów grupowych." name="join voice chat"/> - <action description="Moderator czatu grupowego" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… kontrolować dostÄ™p do czatu i rozmów grupowych." name="moderate group chat"/> + <action description="DostÄ™p do czatu grupowego" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w czacie i rozmowach grupowych." name="join group chat" value="16"/> + <action description="DostÄ™p do rozmów grupowych" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… uczestniczyć w rozmowach grupowych. UWAGA: DostÄ™p do Czatu Grupowego jest wymagany dla rozmów grupowych." name="join voice chat" value="27"/> + <action description="Moderator czatu grupowego" longdescription="CzÅ‚onkowie w Funkcji z tym Przywilejem mogÄ… kontrolować dostÄ™p do czatu i rozmów grupowych." name="moderate group chat" value="37"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml index c9fe22f3c8..59daa26bf0 100644 --- a/indra/newview/skins/default/xui/pl/strings.xml +++ b/indra/newview/skins/default/xui/pl/strings.xml @@ -191,6 +191,9 @@ <string name="TooltipAgentUrl"> Kliknij aby zobaczyc profil Rezydenta </string> + <string name="TooltipAgentInspect"> + Dowiedz siÄ™ wiÄ™cej o tym Rezydencie + </string> <string name="TooltipAgentMute"> Kliknij aby wyciszyc tego Rezydenta </string> @@ -738,6 +741,12 @@ <string name="Estate / Full Region"> MajÄ…tek / Region </string> + <string name="Estate / Homestead"> + Estate / Homestead + </string> + <string name="Mainland / Homestead"> + Mainland / Homestead + </string> <string name="Mainland / Full Region"> Mainland / Region </string> @@ -774,7 +783,7 @@ <string name="xml_file"> Plik XML </string> - <string name="dot_raw_file"> + <string name="raw_file"> Plik RAW </string> <string name="compressed_image_files"> @@ -3469,7 +3478,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. JesteÅ› jedynÄ… osobÄ… w tej konferencji. </string> <string name="offline_message"> - [FIRST] [LAST] - ta osoba jest obecnie niedostÄ™pna. + [NAME] opuszcza Second Life. </string> <string name="invite_message"> Kliknij na [BUTTON NAME] przycisk by zaakceptować/doÅ‚Ä…czyć do tej rozmowy. @@ -3538,7 +3547,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. http://secondlife.com/landing/voicemorphing </string> <string name="paid_you_ldollars"> - [NAME] zapÅ‚aciÅ‚ Ci L$[AMOUNT] + [NAME] zapÅ‚aciÅ‚a/zapÅ‚aciÅ‚ Tobie [AMOUNT]L$ [REASON]. + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] zapÅ‚aciÅ‚/zapÅ‚aciÅ‚a Tobie L$[AMOUNT]. </string> <string name="you_paid_ldollars"> ZapÅ‚acono [NAME] [AMOUNT]L$ [REASON]. @@ -3552,6 +3564,9 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="you_paid_ldollars_no_name"> ZapÅ‚acono [AMOUNT]L$ [REASON]. </string> + <string name="for item"> + dla [ITEM] + </string> <string name="for a parcel of land"> za PosiadÅ‚ość </string> @@ -3570,6 +3585,9 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. <string name="to upload"> aby pobrać </string> + <string name="to publish a classified ad"> + publikacja reklamy + </string> <string name="giving"> Dajesz L$ [AMOUNT] </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 a6b255d432..3fb4bc272e 100644 --- a/indra/newview/skins/default/xui/pt/floater_about_land.xml +++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml @@ -470,7 +470,20 @@ MÃdia: <spinner label="Preço em L$:" name="PriceSpin"/> <spinner label="Horas de acesso:" name="HoursSpin"/> <panel name="Allowed_layout_panel"> + <text label="Always Allow" name="AllowedText"> + Residentes permitidos + </text> <name_list name="AccessList" tool_tip="(Total [LISTED], máx de [MAX])"/> + <button label="Adicionar" name="add_allowed"/> + <button label="Tirar" label_selected="Tirar" name="remove_allowed"/> + </panel> + <panel name="Banned_layout_panel"> + <text label="Ban" name="BanCheck"> + Residentes banidos + </text> + <name_list name="BannedList" tool_tip="(Total [LISTED], máx de [MAX])"/> + <button label="Adicionar" name="add_banned"/> + <button label="Tirar" label_selected="Tirar" name="remove_banned"/> </panel> </panel> </tab_container> diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml index a2e6f7945a..2b65952676 100644 --- a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml @@ -24,6 +24,10 @@ Digite parte do nome de alguém: </text> <button label="OK" label_selected="OK" name="Find"/> + <scroll_list name="SearchResults"> + <columns label="Nome" name="name"/> + <columns label="Nome de usuário" name="username"/> + </scroll_list> </panel> <panel label="Amigos" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -39,7 +43,10 @@ Metros </text> <button font="SansSerifSmall" label="Atualizar Lista" label_selected="Atualizar Lista" left_delta="1" name="Refresh" width="115"/> - <scroll_list bottom_delta="-169" height="159" name="NearMe"/> + <scroll_list bottom_delta="-169" height="159" name="NearMe"> + <columns label="Nome" name="name"/> + <columns label="Nome de usuário" name="username"/> + </scroll_list> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/pt/floater_bumps.xml b/indra/newview/skins/default/xui/pt/floater_bumps.xml index 5e656f4730..475d36c119 100644 --- a/indra/newview/skins/default/xui/pt/floater_bumps.xml +++ b/indra/newview/skins/default/xui/pt/floater_bumps.xml @@ -4,19 +4,19 @@ Nada detectado </floater.string> <floater.string name="bump"> - [TIME] [FIRST] [LAST] conflitou com você + [TIME] [NAME] empurrou você </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] empurrou você com um script + [TIME] [NAME] empurrou você usando um script </floater.string> <floater.string name="selected_object_collide"> - [TIME] [FIRST] [LAST] o atingiu com um objeto + [TIME] [NAME] empurrou você com um objeto </floater.string> <floater.string name="scripted_object_collide"> - [TIME] [FIRST] [LAST] o atingiu com um objeto programado + [TIME] [NAME] empurrou você com um objeto com script </floater.string> <floater.string name="physical_object_collide"> - [TIME] [FIRST] [LAST] o atingiu com um objeto fÃsico + [TIME] [NAME] empurrou você com um objeto 3D </floater.string> <floater.string name="timeStr"> [[hour,datetime,slt]:[min,datetime,slt]] diff --git a/indra/newview/skins/default/xui/pt/floater_buy_object.xml b/indra/newview/skins/default/xui/pt/floater_buy_object.xml index d71eb04cc4..c465197c9a 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_object.xml @@ -1,26 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="COMPRAR CÓPIA DO OBJETO"> + <floater.string name="title_buy_text"> + Comprar + </floater.string> + <floater.string name="title_buy_copy_text"> + Comprar uma cópia de + </floater.string> + <floater.string name="no_copy_text"> + (sem copiar) + </floater.string> + <floater.string name="no_modify_text"> + (sem modificar) + </floater.string> + <floater.string name="no_transfer_text"> + (sem transferir) + </floater.string> <text name="contents_text"> Contém: </text> <text name="buy_text"> - Comprar por L$[AMOUNT] de(a) [NAME]? + Comprar por L$[AMOUNT] de: + </text> + <text name="buy_name_text"> + [NAME]? </text> - <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> <button label="Comprar" label_selected="Comprar" name="buy_btn"/> - <string name="title_buy_text"> - Comprar - </string> - <string name="title_buy_copy_text"> - Comprar uma cópia de - </string> - <string name="no_copy_text"> - (sem copiar) - </string> - <string name="no_modify_text"> - (sem modificar) - </string> - <string name="no_transfer_text"> - (sem transferir) - </string> + <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_display_name.xml b/indra/newview/skins/default/xui/pt/floater_display_name.xml new file mode 100644 index 0000000000..8daa40cc23 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_display_name.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Display Name" title="MUDAR NOME DE TELA"> + <text name="info_text"> + O nome que você selecionou para o seu avatar é denominado nome de tela. Você pode mudar seu nome de tela uma vez por semana. + </text> + <text name="lockout_text"> + Você poderá mudar seu nome de tela depois de: [TIME]. + </text> + <text name="set_name_label"> + Novo nome de tela: + </text> + <text name="name_confirm_label"> + Digite seu novo nome novamente para confirmá-lo: + </text> + <button label="Salvar" name="save_btn" tool_tip="Salvar o novo nome de tela"/> + <button label="Redefinir" name="reset_btn" tool_tip="Usar o mesmo nome como nome de tela e de usuário"/> + <button label="Cancelar" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_event.xml b/indra/newview/skins/default/xui/pt/floater_event.xml index 1cd4dcbda4..a8dc3f96d7 100644 --- a/indra/newview/skins/default/xui/pt/floater_event.xml +++ b/indra/newview/skins/default/xui/pt/floater_event.xml @@ -1,72 +1,11 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater label="Evento" name="Event" title="DETALHES DO EVENTO"> - <floater.string name="none"> - nenhum +<floater can_resize="true" follows="all" height="400" help_topic="event_details" label="Event" layout="topleft" name="Event" save_rect="true" save_visibility="false" title="EVENT DETAILS" width="600"> + <floater.string name="loading_text"> + Carregando... </floater.string> - <floater.string name="notify"> - Avisar + <floater.string name="done_text"> + Pronto </floater.string> - <floater.string name="dont_notify"> - Não avisar - </floater.string> - <floater.string name="moderate"> - Moderado - </floater.string> - <floater.string name="adult"> - Adulto - </floater.string> - <floater.string name="general"> - Público geral - </floater.string> - <floater.string name="unknown"> - Desconhecido - </floater.string> - <layout_stack name="layout"> - <layout_panel name="profile_stack"> - <text name="event_name"> - Evento sem nome... Terror! Terror Aterrorizante. - </text> - <text name="event_category"> - (não categorizado) - </text> - <text name="event_runby_label"> - Organização: - </text> - <text initial_value="(pesquisando)" name="event_runby"/> - <text name="event_date_label"> - Data: - </text> - <text name="event_date"> - 10/10/2010 - </text> - <text name="event_duration_label"> - Duração: - </text> - <text name="event_duration"> - 1 hora - </text> - <text name="event_covercharge_label"> - Cover: - </text> - <text name="event_cover"> - Grátis - </text> - <text name="event_location_label"> - Localização: - </text> - <text name="event_location" value="LoteExemplo, Nome extenso (145, 228, 26)"/> - <text name="rating_label" value="Classificação:"/> - <text name="rating_value" value="(Desconhecido)"/> - <expandable_text name="event_desc"> - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. - </expandable_text> - </layout_panel> - <layout_panel name="button_panel"> - <button name="create_event_btn" tool_tip="Criar evento"/> - <button name="god_delete_event_btn" tool_tip="Excluir evento"/> - <button label="Avise-me" name="notify_btn"/> - <button label="Teletransportar" name="teleport_btn"/> - <button label="Mapa" name="map_btn"/> - </layout_panel> - </layout_stack> + <web_browser follows="left|right|top|bottom" height="365" layout="topleft" left="10" name="browser" top="0" trusted_content="true" width="580"/> + <text follows="bottom|left" height="16" layout="topleft" left_delta="0" name="status_text" top_pad="10" width="150"/> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im.xml b/indra/newview/skins/default/xui/pt/floater_im.xml deleted file mode 100644 index c81d0dd7ef..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_im.xml +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<multi_floater name="im_floater" title="Mensagem Instantânea"> - <string name="only_user_message"> - Você é o único residente nesta sessão - </string> - <string name="offline_message"> - [FIRST] [LAST] está offline. - </string> - <string name="invite_message"> - Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. - </string> - <string name="muted_message"> - Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem. - </string> - <string name="generic_request_error"> - Erro na requisição, por favor, tente novamente. - </string> - <string name="insufficient_perms_error"> - Você não tem permissões suficientes. - </string> - <string name="session_does_not_exist_error"> - A sessão deixou de existir - </string> - <string name="no_ability_error"> - Você não possui esta habilidade. - </string> - <string name="not_a_mod_error"> - Você não é um moderador de sessão. - </string> - <string name="muted_error"> - Um moderador do grupo desabilitou seu bate-papo em texto. - </string> - <string name="add_session_event"> - Não foi possÃvel adicionar residentes ao bate-papo com [RECIPIENT]. - </string> - <string name="message_session_event"> - Não foi possÃvel enviar sua mensagem na sessão de bate- papo com [RECIPIENT]. - </string> - <string name="removed_from_group"> - Você foi removido do grupo. - </string> - <string name="close_on_no_ability"> - Você não possui mais a habilidade de estar na sessão de bate-papo. - </string> -</multi_floater> diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml index 39dde3408b..5543ffa41d 100644 --- a/indra/newview/skins/default/xui/pt/floater_im_session.xml +++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml @@ -1,7 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="panel_im"> <layout_stack name="im_panels"> - <layout_panel label="Painel de controle de MI" name="panel_im_control_panel"/> <layout_panel> <line_editor label="Para" name="chat_editor"/> </layout_panel> diff --git a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml index 4b9553adfe..6344258fa0 100644 --- a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="LIGAÇÃO DE DESCONHECIDO"> +<floater name="incoming call" title="Ligação para você"> <floater.string name="lifetime"> 5 </floater.string> diff --git a/indra/newview/skins/default/xui/pt/floater_my_friends.xml b/indra/newview/skins/default/xui/pt/floater_my_friends.xml deleted file mode 100644 index 68f2a19998..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_my_friends.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="floater_my_friends" title="CONTATOS"> - <tab_container name="friends_and_groups"> - <panel label="Amigos" name="friends_panel"/> - <panel label="Grupos" name="groups_panel"/> - </tab_container> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml deleted file mode 100644 index dec8a7676a..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title="Salvar este look"> - <button label="Salvar" label_selected="Salvar" name="Save"/> - <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <text name="Save item as:"> - Veja o meu novo visual: - </text> - <line_editor name="name ed"> - [DESC] (new) - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml index 81c861687f..26d5710c4a 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay.xml @@ -11,7 +11,7 @@ </text> <icon name="icon_person" tool_tip="Pessoa"/> <text left="115" name="payee_name"> - [FIRST] [LAST] + Test Name That Is Extremely Long To Check Clipping </text> <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/> <button label="L$5" label_selected="L$5" name="fastpay 5"/> diff --git a/indra/newview/skins/default/xui/pt/floater_pay_object.xml b/indra/newview/skins/default/xui/pt/floater_pay_object.xml index 464afd7f18..a5579f03bf 100644 --- a/indra/newview/skins/default/xui/pt/floater_pay_object.xml +++ b/indra/newview/skins/default/xui/pt/floater_pay_object.xml @@ -8,7 +8,7 @@ </string> <icon name="icon_person" tool_tip="Pessoa"/> <text left="105" name="payee_name"> - [FIRST] [LAST] + Ericacita Moostopolison </text> <text halign="left" left="5" name="object_name_label" width="95"> Via objeto: diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml deleted file mode 100644 index aabcff70d3..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ATALHO DE GESTO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml deleted file mode 100644 index 64bb7785f6..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ATALHO DE GESTO"> - <text name="trigger_label"> - Bate-papo: - </text> - <text name="key_label"> - Tecla: - </text> - <combo_box label="Nenhum" name="modifier_combo"/> - <combo_box label="Nenhum" name="key_combo"/> - <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando 'olá' por 'oi' para trocar 'Olá, tudo bem' por 'Oi tudo bem'. O gesto também será executado."> - Trocar: - </text> - <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando 'olá' por 'oi' para trocar 'Olá, tudo bem' por 'Oi tudo bem'. O gesto também será executado."/> -</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml deleted file mode 100644 index aabcff70d3..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="Gesture" title="ATALHO DE GESTO"/> diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml index 14e00fa7ae..bd5fbf80d1 100644 --- a/indra/newview/skins/default/xui/pt/floater_tools.xml +++ b/indra/newview/skins/default/xui/pt/floater_tools.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="toolbox floater" short_title="BUILD TOOLS" title="" width="288"> +<floater name="toolbox floater" short_title="BUILD TOOLS" title=""> <floater.string name="status_rotate"> Arrastar as faixas coloridas para girar o objeto </floater.string> @@ -171,13 +171,13 @@ Criador: </text> <text name="Creator Name"> - Thrax Linden + Mrs. Esbee Linden (esbee.linden) </text> <text name="Owner:"> Proprietário: </text> <text name="Owner Name"> - Thrax Linden + Mrs. Erica "Moose" Linden (erica.linden) </text> <text name="Group:"> Grupo: diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml index 44f08b76b5..fed60c9afa 100644 --- a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml +++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml @@ -19,10 +19,12 @@ <layout_panel name="my_panel"> <text name="user_text" value="Meu avatar:"/> </layout_panel> - <layout_stack name="voice_effect_and_leave_call_stack"> - <layout_panel name="leave_call_btn_panel"> - <button label="Desligar" name="leave_call_btn"/> - </layout_panel> - </layout_stack> + <layout_panel name="leave_call_panel"> + <layout_stack name="voice_effect_and_leave_call_stack"> + <layout_panel name="leave_call_btn_panel"> + <button label="Desligar" name="leave_call_btn"/> + </layout_panel> + </layout_stack> + </layout_panel> </layout_stack> </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml deleted file mode 100644 index 282bf0e268..0000000000 --- a/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml +++ /dev/null @@ -1,11 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="modal container" title=" "> - <button label="Salvar" label_selected="Salvar" name="Save"/> - <button label="Cancelar" label_selected="Cancelar" name="Cancel"/> - <text name="Save item as:"> - Salvar item no inventário como: - </text> - <line_editor name="name ed"> - Novo [DESC] - </line_editor> -</floater> diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml index a74ea15be0..a95d5ff31a 100644 --- a/indra/newview/skins/default/xui/pt/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml @@ -10,6 +10,11 @@ <string name="Details"> [PERFIL_SL] </string> + <text name="user_name_small" value="Grumpity ProductEngine with a long name"/> + <text name="user_slid" value="james.linden"/> + <text name="user_details"> + This is my second life description and I really think it is great. But for some reason my description is super extra long because I like to talk a whole lot + </text> <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/> <button label="Adicionar amigo" name="add_friend_btn"/> <button label="MI" name="im_btn"/> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 90adb3fdb5..dc0e2ffb64 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -85,6 +85,7 @@ <menu_item_call label="Pegar uma cópia" name="Take Copy"/> <menu_item_call label="Salvar no meu inventário" name="Save Object Back to My Inventory"/> <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/> + <menu_item_call label="Devolver objeto" name="Return Object back to Owner"/> </menu> <menu label="Scripts" name="Scripts"> <menu_item_call label="Recompilar scripts (LSL)" name="Mono"/> @@ -98,6 +99,7 @@ <menu_item_check label="Só selecionar meus objetos" name="Select Only My Objects"/> <menu_item_check label="Só selecionar objetos móveis" name="Select Only Movable Objects"/> <menu_item_check label="Selecionar contornando" name="Select By Surrounding"/> + <menu_item_check label="Mostrar contornos da seleção" name="Show Selection Outlines"/> <menu_item_check label="Mostrar seleção oculta" name="Show Hidden Selection"/> <menu_item_check label="Mostrar alcance de luz da seleção" name="Show Light Radius for Selection"/> <menu_item_check label="Mostrar raio de seleção" name="Show Selection Beam"/> @@ -118,6 +120,7 @@ <menu_item_call label="Denunciar abuso" name="Report Abuse"/> <menu_item_call label="Relatar bug" name="Report Bug"/> <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/> + <menu_item_check label="Ativar dicas" name="Enable Hints"/> </menu> <menu label="Avançado" name="Advanced"> <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> @@ -264,7 +267,7 @@ <menu_item_call label="Teste de navegador web" name="Web Browser Test"/> <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/> <menu_item_call label="Dados de memória" name="Memory Stats"/> - <menu_item_check label="Trajeto c/ dois cliques" name="Double-Click Auto-Pilot"/> + <menu_item_check label="Trajeto c/ dois cliques" name="Double-ClickAuto-Pilot"/> <menu_item_check label="Teletransportar c/ dois cliques" name="DoubleClick Teleport"/> <menu_item_check label="Debug Clicks" name="Debug Clicks"/> <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> @@ -276,6 +279,7 @@ <menu_item_call label="Salvar para XML" name="Save to XML"/> <menu_item_check label="Mostrar nomes XUI" name="Show XUI Names"/> <menu_item_call label="Enviar MIs de teste" name="Send Test IMs"/> + <menu_item_call label="Limpar cache de nomes" name="Flush Names Caches"/> </menu> <menu label="Avatar" name="Character"> <menu label="Grab Baked Texture" name="Grab Baked Texture"> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index ec0ea9efff..76399e966c 100644 --- a/indra/newview/skins/default/xui/pt/notifications.xml +++ b/indra/newview/skins/default/xui/pt/notifications.xml @@ -109,8 +109,8 @@ Por favor, selecione apenas um objeto e tente novamente. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="GrantModifyRights"> - Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização. -Deseja modificar os direitos de modificação de [FIRST_NAME] [LAST_NAME]? + Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização. +Deseja dar direitos de modificação a [NAME]? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="GrantModifyRightsMultiple"> @@ -119,7 +119,7 @@ Deseja conceder direitos de modificação para os residentes selecionados? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="RevokeModifyRights"> - Você deseja cancelar os direitos de edição de [FIRST_NAME] [LAST_NAME]? + Deseja revogar os direitos de modificação de [NAME]? <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -314,17 +314,17 @@ Ele ultrapassa o limite de anexos, de [MAX_ATTACHMENTS] objetos. Remova um objet Você não pode vestir este item porque ele ainda não carregou. Tente novamente em um minuto. </notification> <notification name="MustHaveAccountToLogIn"> - Oops! Alguma coisa foi deixada em branco. -Você precisa entrar com ambos os Nome e Sobrenome do seu avatar. + Opa! Alguma coisa ficou em branco. +Digite o nome de usuário de seu avatar. -Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de abrir uma conta agora? +É preciso ter uma conta para entrar no [SECOND_LIFE]. Deseja criar uma conta agora? <url name="url"> https://join.secondlife.com/index.php?lang=pt-BR </url> <usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Abrir conta"/> </notification> <notification name="InvalidCredentialFormat"> - Digite o nome e sobrenome do seu avatar no campo Nome de usuário, depois faça o login novamente. + Digite o nome de usuário ou o nome e sobrenome do seu avatar no campo Nome de usuário, depois entre em sua conta novamente. </notification> <notification name="AddClassified"> Os anúncios serão publicados na seção 'Classificados' das buscas e em [http://secondlife.com/community/classifieds secondlife.com] durante uma semana. @@ -913,12 +913,6 @@ Em geral, essa é uma falha técnica temporária. Personalize e volte a salvar Não é possÃvel comprar o terreno para o grupo: Você não tem permissão para comprar o terreno para o seu grupo ativado. </notification> - <notification label="Adicionar amigo" name="AddFriend"> - Amigos podem dar permissões de rastrear um ao outro pelo mapa e receber atualizações de status online. - -Oferecer amizade para [NAME]? - <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Oferecer"/> - </notification> <notification label="Adicionar amigo" name="AddFriendWithMessage"> Amigos podem dar permissões de rastrear um ao outro pelo mapa e receber atualizações de status online. @@ -962,7 +956,7 @@ Oferecer amizade para [NAME]? </form> </notification> <notification name="RemoveFromFriends"> - Você quer remover [FIRST_NAME] [LAST_NAME] da sua lista de amigos? + Remover [NAME] da sua lista de amigos? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Remover"/> </notification> <notification name="RemoveMultipleFromFriends"> @@ -1078,10 +1072,11 @@ Doar [AREA] m² ao grupo '[GROUP_NAME]'? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DeedLandToGroupWithContribution"> - No ato da doação deste lote, o grupo deverá ter e manter créditos suficientes para ter o terreno. A doação inclui uma contribuição simultânea para o grupo de '[FIRST_NAME] [LAST_NAME]'. -O preço de aquisição dos terrenos não é restituÃdo ao proprietário. Se uma parcela doada for vendida, o preço de venda é dividido igualmente entre os membros do grupo. + Ao transferir este terreno, o grupo precisa ter e manter créditos de uso de terrenos suficientes. +A doação inclui uma contribuição de terreno ao grupo de parte de '[NAME]'. +O preço pago pelo terreno não será reembolsado ao proprietário. Se um terreno doado for vendido, a receita da venda será dividida igualmente entre os membros do grupo. -Doar [AREA] m² para o grupo '[GROUP_NAME]'? +Doar este terreno de [AREA] m² para o grupo '[GROUP_NAME]'? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/> </notification> <notification name="DisplaySetToSafe"> @@ -1450,6 +1445,46 @@ O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua <button name="Cancel" text="Cancelar"/> </form> </notification> + <notification name="SetDisplayNameSuccess"> + Olá, [DISPLAY_NAME]! + +Assim como na vida real, leva um tempo para todos aprenderem um novo nome. Aguarde alguns dias para [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] aparecer em objetos, scripts, nos resultados de buscas, etc. + </notification> + <notification name="SetDisplayNameBlocked"> + Infelizmente não é possÃvel modificar seu nome de tela. Se você acredita que houve algum equÃvoco, entre em contato com o suporte. + </notification> + <notification name="SetDisplayNameFailedLength"> + Desculpe, este nome é longo demais. O limite de caracteres para nomes de tela é [LENGTH]. + +Selecione um nome mais curto. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Infelizmente não foi possÃvel definir seu nome de tela. Por favor volte mais tarde. + </notification> + <notification name="SetDisplayNameMismatch"> + Os nomes de tela fornecidos não são iguais. Digite novamente. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Falta mais um tempinho para você poder mudar seu nome de tela. + +Consulte a página http://wiki.secondlife.com/wiki/Setting_your_display_name + +Por favor volte mais tarde. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Infelizmente não foi possÃvel definir o nome solicitado. Ele contém uma palavra banida. + + Selecione um nome diferente. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + O nome de tela desejado contém caracteres inválidos. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Seu nome de tela não pode ser formado exclusivamente de caracteres de pontuação. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) adotou o nome [NEW_NAME]. + </notification> <notification name="OfferTeleport"> Oferecer um teletransporte para sua localização com qual mensagem? <form name="form"> @@ -2018,10 +2053,10 @@ Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de Assunto: [SUBJECT], Mensagem: [MESSAGE] </notification> <notification name="FriendOnline"> - [FIRST] [LAST] está Online + [NAME] está online </notification> <notification name="FriendOffline"> - [FIRST] [LAST] está Offline + [NAME] está offline </notification> <notification name="AddSelfFriend"> Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a). @@ -2088,9 +2123,6 @@ Ela pode afetar a digitação da senha. <notification name="CannotRemoveProtectedCategories"> Você não pode remover categorias protegidas. </notification> - <notification name="OfferedCard"> - Você ofereceu um cartão de visita a [FIRST] [LAST] - </notification> <notification name="UnableToBuyWhileDownloading"> ImpossÃvel comprar o objeto enquanto ele está sendo carregado. Por favor, tente novamente. @@ -2160,7 +2192,10 @@ Selecione o residente da lista e clique em 'MI' na parte de baixo do p <notification name="SystemMessage"> [MESSAGE] </notification> - <notification name="PaymentRecived"> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> [MESSAGE] </notification> <notification name="EventNotification"> @@ -2169,8 +2204,7 @@ Selecione o residente da lista e clique em 'MI' na parte de baixo do p [NAME] [DATE] <form name="form"> - <button name="Teleport" text="Teletransporte"/> - <button name="Description" text="Descrição"/> + <button name="Details" text="Detalhes"/> <button name="Cancel" text="Cancelar"/> </form> </notification> @@ -2204,7 +2238,7 @@ Instale o plugin novamente ou contate o fabricante se o problema persistir. Os objetos que lhe pertencem no lote selecionado do terreno, voltaram ao seu inventário. </notification> <notification name="OtherObjectsReturned"> - Os objetos no lote selecionado de terra que pertence a [FIRST] [LAST], voltaram ao seu inventário. + Os objetos no terreno selecionado, do residente [NAME], foram devolvidos ao inventário dele(a). </notification> <notification name="OtherObjectsReturned2"> Os objetos no lote selecionado, do residente [NAME], foram devolidos ao proprietãrio. @@ -2328,7 +2362,7 @@ Por favor, tente novamente em alguns instantes. Nenhum lote válido foi encontrado. </notification> <notification name="ObjectGiveItem"> - Um objeto chamado [OBJECTFROMNAME] de [NAME_SLURL] lhe deu [OBJECTTYPE]: + Um objeto chamado <nolink>[OBJECTFROMNAME]</nolink>, de [NAME_SLURL], lhe deu este(a) [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Segure"/> @@ -2393,9 +2427,9 @@ Cada um pode ver o status do outro (definição padrão). Você convidou [TO_NAME] para ser seu amigo(a) </notification> <notification name="OfferFriendshipNoMessage"> - [NAME] está lhe oferecendo sua amizade. + [NAME_SLURL] quer a sua amizade. -(Por definição vocês serão capazes de ver um ao outro online) +Cada um pode ver o status do outro (definição padrão). <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> @@ -2414,7 +2448,7 @@ Cada um pode ver o status do outro (definição padrão). Oferta de amizada aceita. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] estão te oferecendo um cartão de visita. + [NAME] estão te oferecendo um cartão de visita. Ele colocará um item de inventário, para você possa contatá-lo facilmente. <form name="form"> <button name="Accept" text="Aceitar"/> @@ -2430,11 +2464,11 @@ Se permanecer aqui, você será desconectado. Se permanecer aqui, você será desconectado. </notification> <notification name="LoadWebPage"> - Carregar página da web [URL]? + Carregar a página [URL]? [MESSAGE] -Do objeto: [OBJECTNAME], dono: [NAME]? +Do objeto: <nolink>[OBJECTNAME]</nolink>, de: [NAME]? <form name="form"> <button name="Gotopage" text="Carregar"/> <button name="Cancel" text="Cancelar"/> @@ -2450,10 +2484,10 @@ Do objeto: [OBJECTNAME], dono: [NAME]? O item que você está tentando usar tem um recurso que seu Visualizador não consegue ler. Atualize o [APP_NAME] para poder vestir esse item. </notification> <notification name="ScriptQuestion"> - '[OBJECTNAME]', um objeto pertencente a '[NAME]', gostaria de: + '<nolink>[OBJECTNAME]</nolink>', pertencente a '[NAME]', gostaria de: [QUESTIONS] -Está OK? +OK? <form name="form"> <button name="Yes" text="Sim"/> <button name="No" text="Não"/> @@ -2461,12 +2495,12 @@ Está OK? </form> </notification> <notification name="ScriptQuestionCaution"> - Um objeto chamado '[OBJECTNAME]', de '[NAME]' gostaria de: + Um objeto chamado '<nolink>[OBJECTNAME]</nolink>'', de '[NAME]', gostaria de: [QUESTIONS] -Se você não confia nos objetos deste autor, recuse-o. +Se você não confia nos objetos deste autor, recuse-o. -Deixar? +Deseja aceitar? <form name="form"> <button name="Grant" text="Autorizar"/> <button name="Deny" text="Negar"/> @@ -2474,14 +2508,14 @@ Deixar? </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST]'s '[TITLE]' + '<nolink>[TITLE]</nolink>' de [NAME] [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorar"/> </form> </notification> <notification name="ScriptDialogGroup"> - [GROUPNAME]'s '[TITLE]' + <nolink>[TITLE]</nolink>' de [GROUPNAME]' [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorar"/> @@ -2518,13 +2552,13 @@ Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique </form> </notification> <notification name="AutoUnmuteByIM"> - [FIRST] [LAST] recebeu uma MI e foi desbloqueado(a) automaticamente. + [NAME] recebeu uma MI e foi desbloqueado(a) automaticamente. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente. + [NAME] recebeu dinheiro e foi desbloqueado(a) automaticamente. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente. + [NAME] recebeu dinheiro e foi desbloqueado(a) automaticamente. </notification> <notification name="VoiceInviteGroup"> [NAME] atendeu uma ligação de bate-papo de voz com o grupo [GROUP]. @@ -2751,6 +2785,37 @@ Todos os demais residentes que entrarem na ligação mais tarde também serão s Silenciar todos? <usetemplate ignoretext="Confirmar antes de silenciar todos os participantes em ligações de grupo." name="okcancelignore" notext="Cancelar" yestext="OK"/> </notification> + <notification label="Bate-papo" name="HintChat"> + Para entrar em uma conversa, comece a escrever no campo de bate-papo abaixo. + </notification> + <notification label="Levantar-se" name="HintSit"> + Para se levantar quando estiver sentado, clique em Levantar-se + </notification> + <notification label="Explore o mundo" name="HintDestinationGuide"> + O Guia de Destinos traz milhares de lugares novos para você explorar e conhecer. Selecione um lugar, clique em Teletransportar e comece suas descobertas. + </notification> + <notification label="Painel lateral" name="HintSidePanel"> + Acesse rapidamente seu inventário, roupas, looks, perfis e mais no painel lateral. + </notification> + <notification label="Movimentar" name="HintMove"> + Para andar ou correr, clique no botão Movimentar e use as setas para controlar a direção. Ou use as setas do teclado. + </notification> + <notification label="Nome de tela" name="HintDisplayName"> + Defina seu nome de tela personalizável. O nome de tele é separado do seu nome de usuário, que não pode ser modificado. Você pode mudar a visualização dos nomes de outras pessoas nas suas preferências. + </notification> + <notification label="Inventário" name="HintInventory"> + Você encontrará seus pertences no inventário. Os itens mais novos também ficam na guia Itens recentes. + </notification> + <notification label="Você tem dólares Linden!" name="HintLindenDollar"> + Seu saldo de L$ está aqui. Clique em Comprar L$ para trocar mais dólares Linden. + </notification> + <notification name="PopupAttempt"> + Um pop-up foi bloqueado. + <form name="form"> + <ignore name="ignore" text="Ativar todos os pop-ups"/> + <button name="open" text="Abrir pop-up"/> + </form> + </notification> <global name="UnsupportedCPU"> - A velocidade da sua CPU não suporta os requisitos mÃnimos exigidos. </global> diff --git a/indra/newview/skins/default/xui/pt/panel_audio_device.xml b/indra/newview/skins/default/xui/pt/panel_audio_device.xml deleted file mode 100644 index 967dc27070..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_audio_device.xml +++ /dev/null @@ -1,25 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="device_settings"> - <text name="Audio Devices"> - Dispositivos de Ãudio - </text> - <text name="Input device (microphone):"> - Dispositivo de entrada (microfone): - </text> - <text name="Output device (speakers):"> - Dispositivo de saÃda (falantes): - </text> - <text name="Input level:"> - NÃvel de Entrada - </text> - <text_editor name="voice_intro_text1"> - Ajuste a barra para controlar o volume de som para os outros residentes. Para testar o nÃvel de entrada, basta falar em seu microfone. - </text_editor> - <volume_slider name="mic_volume_slider" tool_tip="Altere o volume usando este controle gradual"/> - <text name="wait_text"> - Por Favor aguarde - </text> - <string name="default_text"> - Padrão - </string> -</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml index e82c03845b..4066842b25 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml @@ -22,6 +22,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="data_panel"> + <text name="display_name_label" value="Nome de tela:"/> + <text name="solo_username_label" value="Nome de usuário:"/> + <button name="set_name" tool_tip="Definir nome de tela"/> + <text name="solo_user_name" value="Hamilton Hitchings"/> + <text name="user_name" value="Hamilton Hitchings"/> + <text name="user_name_small" value="Hamilton Hitchings"/> + <text name="user_label" value="Nome de usuário:"/> + <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Selecione uma imagem"/> </panel> @@ -38,7 +46,7 @@ <text name="my_account_link" value="[[URL] Abrir meu painel]"/> <text name="title_partner_text" value="Parceiro(a):"/> <panel name="partner_data_panel"> - <name_box initial_value="(pesquisando)" name="partner_text"/> + <text initial_value="(pesquisando)" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] Editar]"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml index e57a85a726..2346fe7f4f 100644 --- a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml @@ -24,6 +24,7 @@ <scroll_list.columns label="Região" name="location"/> <scroll_list.columns label="Tipo" name="type"/> <scroll_list.columns label="Ãrea:" name="area"/> + <scroll_list.columns label="Oculto" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Total contribuÃdo: diff --git a/indra/newview/skins/default/xui/pt/panel_groups.xml b/indra/newview/skins/default/xui/pt/panel_groups.xml deleted file mode 100644 index 0aea0d53dd..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_groups.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel name="groups"> - <text name="groupdesc" width="268"> - Seu grupo ativo atual está em negrito. - </text> - <text name="groupcount" width="300"> - Você pertence a [COUNT] grupos (máximo [MAX]). - </text> - <button width="86" label="MI/Ligação" name="IM" tool_tip="Abrir sessão de Mensagem Instantânea"/> - <button width="86" label="Informações" name="Info"/> - <button width="86" label="Ativar" name="Activate"/> - <button width="86" label="Sair" name="Leave"/> - <button width="86" label="Criar..." name="Create"/> - <button width="86" label="Buscar..." name="Search..."/> -</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml index 94a885960a..9c8650e75e 100644 --- a/indra/newview/skins/default/xui/pt/panel_login.xml +++ b/indra/newview/skins/default/xui/pt/panel_login.xml @@ -11,7 +11,7 @@ <text name="username_text"> Nome de usuário: </text> - <line_editor label="Nome de usuário" name="username_edit" tool_tip="[SECOND_LIFE] Nome de usuário"/> + <line_editor label="zecazc12 or Magia Solar" name="username_edit" tool_tip="O nome de usuário que você escolheu ao fazer seu cadastro, como zecazc12 or Magia Solar"/> <text name="password_text"> Senha: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml deleted file mode 100644 index bdbf29e70b..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml +++ /dev/null @@ -1,9 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<!-- All our XML is utf-8 encoded. --> -<panel name="nearby_chat"> - <panel name="chat_caption"> - <text name="sender_name"> - Bate-papo local - </text> - </panel> -</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_online_status.xml b/indra/newview/skins/default/xui/pt/panel_online_status.xml deleted file mode 100644 index fdc489f375..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_online_status.xml +++ /dev/null @@ -1,2 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="friend_online_status" name="friend_online_status"/> diff --git a/indra/newview/skins/default/xui/pt/panel_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml index af6c9ea346..7fc07483c0 100644 --- a/indra/newview/skins/default/xui/pt/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml @@ -76,7 +76,7 @@ <text name="region_rating_label" value="Classificação:"/> <text name="region_rating" value="Adulto"/> <text name="region_owner_label" value="Proprietário:"/> - <text name="region_owner" value="moose Van Moose"/> + <text name="region_owner" value="moose Van Moose extra long name moose"/> <text name="region_group_label" value="Grupo:"/> <text name="region_group"> The Mighty Moose of mooseville soundvillemoose @@ -89,6 +89,7 @@ <text name="estate_name_label" value="Propriedade:"/> <text name="estate_rating_label" value="Classificação:"/> <text name="estate_owner_label" value="Proprietário:"/> + <text name="estate_owner" value="Testing owner name length with long name"/> <text name="covenant_label" value="Contrato:"/> </panel> </accordion_tab> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index aefee32d44..ea618d097d 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -44,9 +44,10 @@ <radio_item label="Ligar" name="radio2" value="1"/> <radio_item label="Brevemente" name="radio3" value="2"/> </radio_group> - <check_box label="Mostrar meu nome" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Nome curto" name="small_avatar_names_checkbox"/> - <check_box label="Mostrar cargo" name="show_all_title_checkbox1"/> + <check_box label="Meu nome" name="show_my_name_checkbox1"/> + <check_box label="Nomes de usuário" name="show_slids" tool_tip="Mostrar nome de usuário, como zecazc123"/> + <check_box label="Cargos do grupo" name="show_all_title_checkbox1" tool_tip="Mostrar os tÃtulos de cargos, como membro ou diretor"/> + <check_box label="Realçar amigos" name="show_friends" tool_tip="Realçar nomes de tela de amigos"/> <text name="effects_color_textbox"> Meus efeitos: </text> @@ -61,6 +62,7 @@ <combo_box.item label="30 minutos" name="item3"/> <combo_box.item label="(nunca)" name="item4"/> </combo_box> + <check_box label="Ver nomes de tela" name="display_names_check" tool_tip="Usar nome de tela no bate-papo, MI, etc."/> <text name="text_box3"> Mensagem do modo ocupado: </text> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml index 5266f646b7..deb8573ba3 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml @@ -1,6 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Configurações" name="Input panel"> - <button bottom_delta="-40" label="Outros dispositivos" name="joystick_setup_button" width="165"/> <text name="Mouselook:"> Visão subjetiva: </text> @@ -40,6 +39,7 @@ <check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/> <check_box initial_value="true" label="Aceitar cookies" name="cookies_enabled"/> <check_box initial_value="true" label="Habilitar Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="falso" label="Ativar pop-ups no navegador de mÃdia" name="media_popup_enabled"/> <check_box initial_value="false" label="Ativar web proxy" name="web_proxy_enabled"/> <text name="Proxy location"> Localização do proxy: diff --git a/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml index a1254b4da0..9e07b6772f 100644 --- a/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml @@ -13,9 +13,9 @@ 50 </string> <layout_stack name="progress_indicator_area"> - <panel name="media_progress_indicator"> + <layout_panel name="media_progress_indicator"> <progress_bar name="media_progress_bar" tool_tip="Carregando mÃdia"/> - </panel> + </layout_panel> </layout_stack> <layout_stack name="media_controls"> <layout_panel name="back"> diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml index 62a16c6fbe..d3ec9b82bc 100644 --- a/indra/newview/skins/default/xui/pt/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/pt/panel_profile_view.xml @@ -6,8 +6,14 @@ <string name="status_offline"> Desconectado </string> - <text_editor name="user_name" value="Carregando..."/> + <text name="display_name_label" value="Nome de tela:"/> + <text name="solo_username_label" value="Nome de usuário:"/> <text name="status" value="Conectado"/> + <text name="user_name_small" value="Jack oh look at me this is a super duper long name"/> + <text name="user_name" value="Jack Linden"/> + <button name="copy_to_clipboard" tool_tip="Copiar para área de transferência"/> + <text name="user_label" value="Nome de usuário:"/> + <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PERFIL" name="panel_profile"/> <panel label="DESTAQUES" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml b/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml deleted file mode 100644 index 534b2826af..0000000000 --- a/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes"?> -<panel label="Região" name="General"> - <text name="region_text_lbl"> - Região: - </text> - <text name="region_text"> - (Desconhecido) - </text> - <text name="version_channel_text_lbl"> - Versão: - </text> - <text name="version_channel_text"> - (Desconhecido) - </text> - <text name="region_type_lbl"> - Tipo: - </text> - <text name="region_type"> - (Desconhecido) - </text> - <check_box label="Bloquear terraplanagens" name="block_terraform_check"/> - <check_box label="Bloquear voos" name="block_fly_check"/> - <check_box label="Permitir danos" name="allow_damage_check"/> - <check_box label="Limitar empurrões" name="restrict_pushobject"/> - <check_box label="Permitir revenda de terrenos" name="allow_land_resell_check"/> - <check_box label="Permitir união e divisão de terrenos" name="allow_parcel_changes_check"/> - <check_box label="Não mostrar nos resultados de pesquisa" name="block_parcel_search_check" tool_tip="Mostrar esta região e lotes nos resultados de pesquisa"/> - <spinner label="Limite do agente" name="agent_limit_spin"/> - <spinner label="Bônus do objeto" name="object_bonus_spin"/> - <text label="NÃvel de maturidade" name="access_text"> - Classificação: - </text> - <combo_box label="Moderado" name="access_combo"> - <combo_box.item label="Público adulto" name="Adult"/> - <combo_box.item label="Moderado" name="Mature"/> - <combo_box.item label="Geral" name="PG"/> - </combo_box> - <button label="Aplicar" name="apply_btn"/> - <button label="Teletransportar um residente para inÃcio..." name="kick_btn"/> - <button label="Teletransportar todos para inÃcio..." name="kick_all_btn"/> - <button label="Enviar mensagem para região..." name="im_btn"/> - <button label="Gerenciar telehub..." name="manage_telehub_btn"/> -</panel> diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml index 88fd4b3ca8..21b085431e 100644 --- a/indra/newview/skins/default/xui/pt/role_actions.xml +++ b/indra/newview/skins/default/xui/pt/role_actions.xml @@ -1,71 +1,68 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> <action_set description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite." name="Membership"> - <action description="Convidar pessoas para este grupo" longdescription="Em Membros > Cargos, use o botão 'Convidar' para convidar pessoas para entrar no grupo." name="member invite"/> - <action description="Expulsar membros deste grupo" longdescription="Em Membros > Cargos, use o botão 'Ejetar' para tirar pessoas do grupo. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo 'Todos' e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função 'Destituir membro com cargo'." name="member eject"/> - <action description="Alterna entre 'Inscrições abertas' e 'Taxa de associação'." longdescription="Ative 'Inscrições abertas' para que novos membros entrem no grupo sem convite, mude a 'Taxa de associação' na seção Geral." name="member options"/> + <action description="Convidar pessoas para este grupo" longdescription="Em Membros > Cargos, use o botão 'Convidar' para convidar pessoas para entrar no grupo." name="member invite" value="1"/> + <action description="Expulsar membros deste grupo" longdescription="Em Membros > Cargos, use o botão 'Ejetar' para tirar pessoas do grupo. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo 'Todos' e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função 'Destituir membro com cargo'." name="member eject" value="2"/> + <action description="Alterna entre 'Inscrições abertas' e 'Taxa de associação'." longdescription="Ative 'Inscrições abertas' para que novos membros entrem no grupo sem convite, mude a 'Taxa de associação' na seção Geral." name="member options" value="3"/> </action_set> <action_set description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções." name="Roles"> - <action description="Criar novas funções" longdescription="Crie novos cargos na guia Cargos." name="role create"/> - <action description="Apagar funções" longdescription="Exclua cargos na guia Cargos." name="role delete"/> - <action description="Modificar o nome, tÃtulo e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, tÃtulo e a descrição de cargos, e se o acesso a essas informações é público ou não. Essas configurações ficam na guia Cargos, depois da seleção do cargo." name="role properties"/> - <action description="Designar membros para a função do designador" longdescription="Na lista Cargos desempenhados, distribua os cargos aos membros (em Cargos > guia Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited"/> - <action description="Designar membros para qualquer função" longdescription="Designe cargos aos membros na lista Cargos desempenhados (Cargos > guia Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode se designar -- ou designar outros membros não-proprietários -- a cargos com mais poder do que têm. Ou seja, membros com essa função podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member"/> - <action description="Remover membros das funções" longdescription="Use a lista Cargos desempenhados para destituir membros de seus cargos (Cargos > guia Membros). Proprietários não podem ser destituÃdos." name="role remove member"/> - <action description="Determinar e remover habilidades em funções" longdescription="Use a lista Funções autorizadas para adicionar e tirar as funções de cada cargo (Cargos > guia Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções. Membros excercendo todas as funções podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions"/> + <action description="Criar novas funções" longdescription="Crie novos cargos na guia Cargos." name="role create" value="4"/> + <action description="Apagar funções" longdescription="Exclua cargos na guia Cargos." name="role delete" value="5"/> + <action description="Modificar o nome, tÃtulo e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, tÃtulo e a descrição de cargos, e se o acesso a essas informações é público ou não. Essas configurações ficam na guia Cargos, depois da seleção do cargo." name="role properties" value="6"/> + <action description="Designar membros para a função do designador" longdescription="Na lista Cargos desempenhados, distribua os cargos aos membros (em Cargos > guia Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited" value="7"/> + <action description="Designar membros para qualquer função" longdescription="Designe cargos aos membros na lista Cargos desempenhados (Cargos > guia Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode se designar -- ou designar outros membros não-proprietários -- a cargos com mais poder do que têm. Ou seja, membros com essa função podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member" value="8"/> + <action description="Remover membros das funções" longdescription="Use a lista Cargos desempenhados para destituir membros de seus cargos (Cargos > guia Membros). Proprietários não podem ser destituÃdos." name="role remove member" value="9"/> + <action description="Determinar e remover habilidades em funções" longdescription="Use a lista Funções autorizadas para adicionar e tirar as funções de cada cargo (Cargos > guia Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções. Membros excercendo todas as funções podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions" value="10"/> </action_set> <action_set description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insÃgnia." name="Group Identity"> - <action description="Mudar apresentação, insÃgnia, 'Publicar na web', e quais membros estão publicamente visÃveis em Informações do Grupo." longdescription="Modificar o estatuto, sÃmbolo e exibição nos resultados de busca. Use a seção Geral." name="group change identity"/> + <action description="Mudar apresentação, insÃgnia, 'Publicar na web', e quais membros estão publicamente visÃveis em Informações do Grupo." longdescription="Modificar o estatuto, sÃmbolo e exibição nos resultados de busca. Use a seção Geral." name="group change identity" value="11"/> </action_set> <action_set description="Estas funções incluem poderes de transferir, vender e modificar os terrenos do grupo. Para acessar a janela 'Sobre terrenos', clique no chão com o botão direito e selecione 'Sobre terrenos'. Ou clique no Ãcone 'i' da barra de navegação." name="Parcel Management"> - <action description="Transferir e comprar terreno para o grupo" longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno > aba Geral." name="land deed"/> - <action description="Abandonar terreno para Governador Linden" longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno > aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade." name="land release"/> - <action description="Definir terreno para informação de venda" longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno > aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade." name="land set sale info"/> - <action description="Subdividir e unir parcelas" longdescription="Juntar ou dividir lotes. Clique no chão com o botão direito, selecione 'Editar terreno' e arraste o mouse sobre o terreno para ver as opções. Para dividir um terreno, selecione a área a ser dividida e clique em 'Dividir'. Para juntar terrenos, selecione dois ou mais lotes adjacentes e clique em 'Juntar'." name="land divide join"/> + <action description="Transferir e comprar terreno para o grupo" longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno > aba Geral." name="land deed" value="12"/> + <action description="Abandonar terreno para Governador Linden" longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno > aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade." name="land release" value="13"/> + <action description="Definir terreno para informação de venda" longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno > aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade." name="land set sale info" value="14"/> + <action description="Subdividir e unir parcelas" longdescription="Juntar ou dividir lotes. Clique no chão com o botão direito, selecione 'Editar terreno' e arraste o mouse sobre o terreno para ver as opções. Para dividir um terreno, selecione a área a ser dividida e clique em 'Dividir'. Para juntar terrenos, selecione dois ou mais lotes adjacentes e clique em 'Juntar'." name="land divide join" value="15"/> </action_set> <action_set description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem & opções de rota de TP." name="Parcel Identity"> - <action description="Alternar 'Exibir nos resultados de busca' e selecionar a categoria" longdescription="Alterne entre 'Exibir nos resultados de busca' ou não, e selecione a categoria do terreno em 'Sobre o terreno'." name="land find places"/> - <action description="Mude o nome, a descrição e a exibição do terreno nos resultados de busca." longdescription="Mude o nome, a descrição e a exibição do terreno nos resultados de busca. Veja essas opções em Sobre o terreno > guia Opções." name="land change identity"/> - <action description="Definir ponto de aterrissagem e rota de teletransporte" longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno > aba Opções." name="land set landing point"/> + <action description="Alternar 'Exibir nos resultados de busca' e selecionar a categoria" longdescription="Alterne entre 'Exibir nos resultados de busca' ou não, e selecione a categoria do terreno em 'Sobre o terreno'." name="land find places" value="17"/> + <action description="Mude o nome, a descrição e a exibição do terreno nos resultados de busca." longdescription="Mude o nome, a descrição e a exibição do terreno nos resultados de busca. Veja essas opções em Sobre o terreno > guia Opções." name="land change identity" value="18"/> + <action description="Definir ponto de aterrissagem e rota de teletransporte" longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno > aba Opções." name="land set landing point" value="19"/> </action_set> <action_set description="Estas habilidade incluem poderes que afetam opções de parcela, como 'Criar objetos', 'Editar terreno' e música & configurações de mÃdia." name="Parcel Settings"> - <action description="Mudar música & configurações de mÃdia" longdescription="Mude streaming de música e configurações de vÃdeo em Sobre o terreno > aba MÃdia." name="land change media"/> - <action description="Ativar/desativar 'Editar terreno'" longdescription="Ative/desative 'Editar terreno'. *AVISO* Sobre o terreno > aba Opções > Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno > aba Opções." name="land edit"/> - <action description="Ativar/desativar variados Sobre o Terreno > Opções de configuração" longdescription="Alterna as opções 'Seguro (zero danos)', 'Voar' e autorizar outros residentes a: 'Editar terreno', 'Contruir', 'Criar marcos' e 'Executar scripts' nos terrenos do grupo. Clique em Sobre o terreno > guia Opções." name="land options"/> + <action description="Mudar música & configurações de mÃdia" longdescription="Mude streaming de música e configurações de vÃdeo em Sobre o terreno > aba MÃdia." name="land change media" value="20"/> + <action description="Ativar/desativar 'Editar terreno'" longdescription="Ative/desative 'Editar terreno'. *AVISO* Sobre o terreno > aba Opções > Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno > aba Opções." name="land edit" value="21"/> + <action description="Ativar/desativar variados Sobre o Terreno > Opções de configuração" longdescription="Alterna as opções 'Seguro (zero danos)', 'Voar' e autorizar outros residentes a: 'Editar terreno', 'Contruir', 'Criar marcos' e 'Executar scripts' nos terrenos do grupo. Clique em Sobre o terreno > guia Opções." name="land options" value="22"/> </action_set> <action_set description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo." name="Parcel Powers"> - <action description="Sempre permitir 'Editar terreno'" longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow edit land"/> - <action description="Sempre permitir 'Voar'" longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow fly"/> - <action description="Sempre permitir 'Criar objetos'" longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow create"/> - <action description="Sempre permitir 'Criar ponto de referência'" longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow landmark"/> - <action description="Permitir 'Colocar casa aqui' no terreno do grupo" longdescription="Membros exercendo cargos com esta função podem selecionar no menu Mundo > Marcos > Definir como casa em lotes doados ao grupo." name="land allow set home"/> + <action description="Sempre permitir 'Editar terreno'" longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow edit land" value="23"/> + <action description="Sempre permitir 'Voar'" longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow fly" value="24"/> + <action description="Sempre permitir 'Criar objetos'" longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow create" value="25"/> + <action description="Sempre permitir 'Criar ponto de referência'" longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno > aba Opções." name="land allow landmark" value="26"/> + <action description="Permitir 'Colocar casa aqui' no terreno do grupo" longdescription="Membros exercendo cargos com esta função podem selecionar no menu Mundo > Marcos > Definir como casa em lotes doados ao grupo." name="land allow set home" value="28"/> + <action description="Permitir a 'Organização de eventos' que usam terrenos do grupo" longdescription="Membros que exercem cargos com esta função podem usar terrenos do grupo para eventos que estão organizando." name="land allow host event" value="41"/> </action_set> <action_set description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes." name="Parcel Access"> - <action description="Gerenciar listas de acesso à parcela" longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno > aba Acesso." name="land manage allowed"/> - <action description="Gerenciar lista de banidos da parcela" longdescription="Administre as listas de acesso e bloqueio em Sobre o terreno > guia Acesso." name="land manage banned"/> - <action description="Modificar as opções 'Vender passes para'" longdescription="Mude as opções 'Vender passes para' em Sobre o terreno > guia Acesso." name="land manage passes"/> - <action description="Expulsar e congelar residentes nas parcelas" longdescription="Membros exercendo cargos com esta função podem lidar com residentes problemáticos nos terrenos do grupo. Clique no residente com o botão direito, depois selecione 'Ejetar' ou 'Congelar'." name="land admin"/> + <action description="Gerenciar listas de acesso à parcela" longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno > aba Acesso." name="land manage allowed" value="29"/> + <action description="Gerenciar lista de banidos da parcela" longdescription="Administre as listas de acesso e bloqueio em Sobre o terreno > guia Acesso." name="land manage banned" value="30"/> + <action description="Modificar as opções 'Vender passes para'" longdescription="Mude as opções 'Vender passes para' em Sobre o terreno > guia Acesso." name="land manage passes" value="31"/> + <action description="Expulsar e congelar residentes nas parcelas" longdescription="Membros exercendo cargos com esta função podem lidar com residentes problemáticos nos terrenos do grupo. Clique no residente com o botão direito, depois selecione 'Ejetar' ou 'Congelar'." name="land admin" value="32"/> </action_set> <action_set description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possÃvel desfazer a mudança dos objetos." name="Parcel Content"> - <action description="Retornar objetos que pertencem ao grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno > aba Objetos." name="land return group owned"/> - <action description="Retornar objetos definidos para o grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno > aba Objetos." name="land return group set"/> - <action description="Retornar objetos que não pertencem ao grupo" longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno > aba Objetos." name="land return non group"/> - <action description="Ajardinar usando plantas Linden" longdescription="Função de paisagismo: poder de plantar e mudar árvores, plantas e grama Linden. A pasta Biblioteca > Objetos do inventário contém material de paisagismo. Use o menu Construir para criar suas próprias plantas." name="land gardening"/> + <action description="Retornar objetos que pertencem ao grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno > aba Objetos." name="land return group owned" value="48"/> + <action description="Retornar objetos definidos para o grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno > aba Objetos." name="land return group set" value="33"/> + <action description="Retornar objetos que não pertencem ao grupo" longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno > aba Objetos." name="land return non group" value="34"/> + <action description="Ajardinar usando plantas Linden" longdescription="Função de paisagismo: poder de plantar e mudar árvores, plantas e grama Linden. A pasta Biblioteca > Objetos do inventário contém material de paisagismo. Use o menu Construir para criar suas próprias plantas." name="land gardening" value="35"/> </action_set> <action_set description="Estas funções incluem poderes de transferir, vender e modificar os objetos do grupo. Essas opções ficam nas Ferramentas de contrução > guia Geral. Clique em um objeto com o botão direito e selecione Editar para ver as configurações do objeto." name="Object Management"> - <action description="Transferir objetos para o grupo" longdescription="Transfira objetos para o grupo em Ferramentas de construção > guia Geral." name="object deed"/> - <action description="Manipular (mover, copiar, modificar) objetos do grupo" longdescription="Manipule (transportar, copiar, modificar) objetos do grupo nas Ferramentas de construção > guia Geral." name="object manipulate"/> - <action description="Definir objetos pertencentes ao grupo para venda" longdescription="Ponha objetos do grupo à venda nas Ferramentas de construção > guia Geral." name="object set sale"/> + <action description="Transferir objetos para o grupo" longdescription="Transfira objetos para o grupo em Ferramentas de construção > guia Geral." name="object deed" value="36"/> + <action description="Manipular (mover, copiar, modificar) objetos do grupo" longdescription="Manipule (transportar, copiar, modificar) objetos do grupo nas Ferramentas de construção > guia Geral." name="object manipulate" value="38"/> + <action description="Definir objetos pertencentes ao grupo para venda" longdescription="Ponha objetos do grupo à venda nas Ferramentas de construção > guia Geral." name="object set sale" value="39"/> </action_set> <action_set description="Estas habilidades incluem poderes que requerem que membros paguem dÃvidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo." name="Accounting"> - <action description="Pagar débitos e receber dividendos do grupo" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. " name="accounting accountable"/> + <action description="Pagar débitos e receber dividendos do grupo" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. " name="accounting accountable" value="40"/> </action_set> <action_set description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo." name="Notices"> - <action description="Enviar aviso" longdescription="Membros que exercem cargos com esta função podem enviar avisos na seção Avisos." name="notices send"/> - <action description="Receber novos avisos e ver os anteriores" longdescription="Membros que exercem cargos com esta função podem receber e ler avisos antigos na seção Avisos." name="notices receive"/> - </action_set> - <action_set description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação." name="Proposals"> - <action description="Criar proposta" longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo > aba Propostas." name="proposal start"/> - <action description="Votar em propostas" longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo > aba Propostas." name="proposal vote"/> + <action description="Enviar aviso" longdescription="Membros que exercem cargos com esta função podem enviar avisos na seção Avisos." name="notices send" value="42"/> + <action description="Receber novos avisos e ver os anteriores" longdescription="Membros que exercem cargos com esta função podem receber e ler avisos antigos na seção Avisos." name="notices receive" value="43"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml index 5d87a855ef..59c6c8f080 100644 --- a/indra/newview/skins/default/xui/pt/strings.xml +++ b/indra/newview/skins/default/xui/pt/strings.xml @@ -194,6 +194,9 @@ <string name="TooltipAgentUrl"> Clique para ver o perfil deste residente </string> + <string name="TooltipAgentInspect"> + Saiba mais sobre este residente + </string> <string name="TooltipAgentMute"> Clique para silenciar este residente </string> @@ -741,6 +744,12 @@ <string name="Estate / Full Region"> Propriedadade / Região inteira: </string> + <string name="Estate / Homestead"> + Imóvel / Homestead + </string> + <string name="Mainland / Homestead"> + Continente / Homestead + </string> <string name="Mainland / Full Region"> Continente / Região inteira: </string> @@ -777,7 +786,7 @@ <string name="xml_file"> Arquivo XML </string> - <string name="dot_raw_file"> + <string name="raw_file"> Arquivo RAW </string> <string name="compressed_image_files"> @@ -1391,10 +1400,10 @@ Script não encontrado no servidor. </string> <string name="CompileQueueProblemDownloading"> - Problema no download + Problema no download </string> <string name="CompileQueueInsufficientPermDownload"> - Permissões insuficientes para fazer o download do script. + Permissões insuficientes para fazer o download do script. </string> <string name="CompileQueueInsufficientPermFor"> Permissões insuficientes para @@ -1699,7 +1708,7 @@ (vai atualizar depois de publicado) </string> <string name="NoPicksClassifiedsText"> - Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio. + Você não criou nenhum Destaque ou Anúncio. Clique no botão "+" para criar um Destaque ou Anúncio. </string> <string name="NoAvatarPicksClassifiedsText"> O usuário não tem nenhum destaque ou anúncio @@ -3471,7 +3480,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. Você é o único usuário desta sessão. </string> <string name="offline_message"> - [FIRST] [LAST] está offline. + [NAME] está offline. </string> <string name="invite_message"> Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz. @@ -3540,6 +3549,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. http://secondlife.com/landing/voicemorphing </string> <string name="paid_you_ldollars"> + [NAME] lhe pagou L$ [AMOUNT] [REASON]. + </string> + <string name="paid_you_ldollars_no_reason"> [NAME] lhe pagou L$ [AMOUNT] </string> <string name="you_paid_ldollars"> @@ -3554,6 +3566,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="you_paid_ldollars_no_name"> You pagou L$[AMOUNT] por [REASON]. </string> + <string name="for item"> + por [ITEM] + </string> <string name="for a parcel of land"> por uma parcela </string> @@ -3572,6 +3587,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE]. <string name="to upload"> para carregar </string> + <string name="to publish a classified ad"> + para publicar um anúncio + </string> <string name="giving"> Dando L$ [AMOUNT] </string> diff --git a/indra/newview/tests/lldateutil_test.cpp b/indra/newview/tests/lldateutil_test.cpp index 99b346cff8..47353962e1 100644 --- a/indra/newview/tests/lldateutil_test.cpp +++ b/indra/newview/tests/lldateutil_test.cpp @@ -183,4 +183,14 @@ namespace tut LLDateUtil::ageFromDate("12/13/2009", now), "3 weeks old" ); } + + //template<> template<> + //void dateutil_object_t::test<6>() + //{ + // set_test_name("ISO dates"); + // LLDate now(std::string("2010-01-04T12:00:00Z")); + // ensure_equals("days", + // LLDateUtil::ageFromDateISO("2009-12-13", now), + // "3 weeks old" ); + //} } diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index 55823fc386..db50b89620 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -62,6 +62,12 @@ LLSLURL LLStartUp::sStartSLURL; static std::string gLoginURI; static LLSD gLoginCreds; static bool gDisconnectCalled = false; + +#include "../llviewerwindow.h" +void LLViewerWindow::setShowProgress(BOOL show) {} + +LLViewerWindow* gViewerWindow; + class LLLogin::Impl { }; @@ -107,6 +113,8 @@ void LLGridManager::addGrid(LLSD& grid_data) { } LLGridManager::LLGridManager() +: + mIsInProductionGrid(false) { } diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 949fa3cc1c..6861f02bfb 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -271,6 +271,12 @@ class WindowsManifest(ViewerManifest): self.disable_manifest_check() + # Get fmod dll, continue if missing + try: + self.path("fmod.dll") + except: + print "Skipping fmod.dll" + # For textures if self.args['configuration'].lower() == 'debug': self.path("openjpegd.dll") @@ -315,12 +321,6 @@ class WindowsManifest(ViewerManifest): # For use in crash reporting (generates minidumps) self.path("dbghelp.dll") - try: - # FMOD for sound - self.path("fmod.dll") - except: - print "Skipping FMOD - not found" - self.enable_no_crt_manifest_check() # Media plugins - QuickTime @@ -956,6 +956,13 @@ class Linux_i686Manifest(LinuxManifest): self.path("libvivoxplatform.so") self.end_prefix("lib") +class Linux_x86_64Manifest(LinuxManifest): + def construct(self): + super(Linux_x86_64Manifest, self).construct() + + # support file for valgrind debug tool + self.path("secondlife-i686.supp") + ################################################################ if __name__ == "__main__": diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp index 40ac019721..873fa23db8 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.cpp +++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp @@ -956,6 +956,23 @@ mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source ) //////////////////////////////////////////////////////////////////////////////// // +mediaPanel* LLMediaPluginTest::findMediaPanel( const std::string &target_name ) +{ + mediaPanel *result = NULL; + + for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel ) + { + if ( mMediaPanels[ panel ]->mTarget == target_name ) + { + result = mMediaPanels[ panel ]; + } + } + + return result; +} + +//////////////////////////////////////////////////////////////////////////////// +// void LLMediaPluginTest::navigateToNewURI( std::string uri ) { if ( uri.length() ) @@ -1566,7 +1583,7 @@ std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type ) //////////////////////////////////////////////////////////////////////////////// // -void LLMediaPluginTest::addMediaPanel( std::string url ) +mediaPanel* LLMediaPluginTest::addMediaPanel( std::string url ) { // Get the plugin filename using the URL std::string mime_type = mimeTypeFromUrl( url ); @@ -1598,7 +1615,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) { std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; - return; + return NULL; } std::string user_data_path = std::string( cwd ) + "/"; #endif @@ -1668,6 +1685,8 @@ void LLMediaPluginTest::addMediaPanel( std::string url ) std::cout << "Adding new media panel for " << url << "(" << media_width << "x" << media_height << ") with index " << panel->mId << " - total panels = " << mMediaPanels.size() << std::endl; } + + return panel; } //////////////////////////////////////////////////////////////////////////////// @@ -1773,15 +1792,15 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel ) //////////////////////////////////////////////////////////////////////////////// // -void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) +mediaPanel* LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) { // no media panels so we can't change anything - have to add if ( mMediaPanels.size() == 0 ) - return; + return NULL; // sanity check if ( ! panel ) - return; + return NULL; int index; for(index = 0; index < (int)mMediaPanels.size(); index++) @@ -1793,7 +1812,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) if(index >= (int)mMediaPanels.size()) { // panel isn't in mMediaPanels - return; + return NULL; } std::cout << "Replacing media panel with index " << panel->mId << std::endl; @@ -1835,7 +1854,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) if (NULL == getcwd( cwd, FILENAME_MAX - 1 )) { std::cerr << "Couldn't get cwd - probably too long - failing to init." << std::endl; - return; + return NULL; } std::string user_data_path = std::string( cwd ) + "/"; #endif @@ -1875,6 +1894,8 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url ) // load and start the URL panel->mMediaSource->loadURI( url ); panel->mMediaSource->start(); + + return panel; } //////////////////////////////////////////////////////////////////////////////// @@ -2134,7 +2155,39 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e break; case MEDIA_EVENT_CLICK_LINK_HREF: - std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << std::endl; + { + std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << ", target is " << self->getClickTarget() << std::endl; + // retrieve the event parameters + std::string url = self->getClickURL(); + std::string target = self->getClickTarget(); + + if(target == "_external") + { + // this should open in an external browser, but since this is a test app we don't care. + } + else if(target == "_blank") + { + // Create a new panel with the specified URL. + addMediaPanel(url); + } + else // other named target + { + mediaPanel *target_panel = findMediaPanel(target); + if(target_panel) + { + target_panel = replaceMediaPanel(target_panel, url); + } + else + { + target_panel = addMediaPanel(url); + } + + if(target_panel) + { + target_panel->mTarget = target; + } + } + } break; case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: @@ -2148,6 +2201,25 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH: std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED_LAUNCH" << std::endl; break; + + case MEDIA_EVENT_CLOSE_REQUEST: + std::cerr << "Media event: MEDIA_EVENT_CLOSE_REQUEST" << std::endl; + break; + + case MEDIA_EVENT_PICK_FILE_REQUEST: + std::cerr << "Media event: MEDIA_EVENT_PICK_FILE_REQUEST" << std::endl; + // TODO: display an actual file picker + self->sendPickFileResponse("cake"); + break; + + case MEDIA_EVENT_GEOMETRY_CHANGE: + std::cerr << "Media event: MEDIA_EVENT_GEOMETRY_CHANGE, uuid is " << self->getClickUUID() + << ", x = " << self->getGeometryX() + << ", y = " << self->getGeometryY() + << ", width = " << self->getGeometryWidth() + << ", height = " << self->getGeometryHeight() + << std::endl; + break; } } diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h index 8fa20b8d72..1f6f18e43c 100644 --- a/indra/test_apps/llplugintest/llmediaplugintest.h +++ b/indra/test_apps/llplugintest/llmediaplugintest.h @@ -51,6 +51,7 @@ struct mediaPanel int mId; std::string mStartUrl; std::string mMimeType; + std::string mTarget; LLPluginClassMedia *mMediaSource; int mMediaWidth; int mMediaHeight; @@ -91,16 +92,17 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner void draw( int draw_type ); void windowPosToTexturePos( int window_x, int window_y, int& media_x, int& media_y, int& id ); - void addMediaPanel( std::string url ); + mediaPanel* addMediaPanel( std::string url ); void updateMediaPanel( mediaPanel* panel ); void remMediaPanel( mediaPanel* panel ); - void replaceMediaPanel( mediaPanel* panel, std::string url ); + mediaPanel* replaceMediaPanel( mediaPanel* panel, std::string url ); void getRandomMediaSize( int& width, int& height, std::string mime_type ); void navigateToNewURI( std::string uri ); void initUrlHistory( std::string uri ); void selectPanelById( int id ); void selectPanel( mediaPanel* panel ); mediaPanel* findMediaPanel( LLPluginClassMedia* panel ); + mediaPanel* findMediaPanel( const std::string &target_name ); void makePickTexture( int id, GLuint* texture_handle, unsigned char** texture_pixels ); void makeChrome(); void resetView(); diff --git a/indra/viewer_components/login/CMakeLists.txt b/indra/viewer_components/login/CMakeLists.txt index fb65779eb7..fe64926da6 100644 --- a/indra/viewer_components/login/CMakeLists.txt +++ b/indra/viewer_components/login/CMakeLists.txt @@ -3,7 +3,9 @@ project(login) include(00-Common) -include(LLAddBuildTest) +if(LL_TESTS) + include(LLAddBuildTest) +endif(LL_TESTS) include(LLCommon) include(LLMath) include(LLXML) @@ -43,14 +45,16 @@ target_link_libraries(lllogin ${PTH_LIBRARIES} ) -SET(lllogin_TEST_SOURCE_FILES +if(LL_TESTS) + SET(lllogin_TEST_SOURCE_FILES + lllogin.cpp + ) + + set_source_files_properties( lllogin.cpp + PROPERTIES + LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}" ) -set_source_files_properties( - lllogin.cpp - PROPERTIES - LL_TEST_ADDITIONAL_LIBRARIES "${PTH_LIBRARIES}" - ) - -LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") + LL_ADD_PROJECT_UNIT_TESTS(lllogin "${lllogin_TEST_SOURCE_FILES}") +endif(LL_TESTS) diff --git a/indra/viewer_components/login/tests/lllogin_test.cpp b/indra/viewer_components/login/tests/lllogin_test.cpp index 95d0421273..58bf371a04 100644 --- a/indra/viewer_components/login/tests/lllogin_test.cpp +++ b/indra/viewer_components/login/tests/lllogin_test.cpp @@ -6,7 +6,7 @@ * * $LicenseInfo:firstyear=2009&license=viewerlgpl$ * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * Copyright (C) 2009-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 diff --git a/install.xml b/install.xml index 9c37b4bc1e..98e983299e 100644 --- a/install.xml +++ b/install.xml @@ -185,7 +185,7 @@ <key>copyright</key> <string>various</string> <key>description</key> - <string>A set of portable C++ libraries which provide a wide set of functionality. Used primarily for tokenization. </string> + <string>A set of portable C++ libraries which provide a wide set of functionality. </string> <key>license</key> <string>boost</string> <key>packages</key> @@ -366,23 +366,23 @@ <key>darwin</key> <map> <key>md5sum</key> - <string>c7e317bec481b7efa2a0319e163dcc65</string> + <string>261bcd3387066cf0a1d46549400052b5</string> <key>url</key> - <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20080818.tar.bz2</uri> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-darwin-20101007.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>abd2b4ba4ac993f19d82804af387eb7c</string> + <string>8490d97430c12c2e1ac19ff80a8d4db4</string> <key>url</key> - <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20080818.tar.bz2</uri> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-linux-20101007.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>1a55dec2907821f5f785648a660126c3</string> + <string>bab1babcb01ff9849b7f072d352e1ecd</string> <key>url</key> - <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-windows-20080611.tar.bz2</uri> + <uri>scp:install-packages.lindenlab.com:/local/www/install-packages/doc/fmod-3.75-windows-20101007.tar.bz2</uri> </map> </map> </map> @@ -981,23 +981,23 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>becffca6bd8dcb239de284ea2a8b485b</string> + <string>34d9e4c93678a422cf80521bf0cd7628</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6+cookies-darwin-20100617.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100914.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>414d72dd59e3d83c96f0e1531360792e</string> + <string>5d743c93b970abe685b185de83001a6e</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100618.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-qt4.6-20100923.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>df1bdd683128e060d60e435f65d8f7e8</string> + <string>4b8412833c00f8cdaba26808f0ddb404</string> <key>url</key> - <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100617.tar.bz2</uri> + <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100916.tar.bz2</uri> </map> </map> </map> @@ -1408,7 +1408,7 @@ anguage Infrstructure (CLI) international standard</string> </map> </map> </map> - <key>vivox</key> + <key>slvoice</key> <map> <key>copyright</key> <string> </string> @@ -1419,23 +1419,23 @@ anguage Infrstructure (CLI) international standard</string> <key>darwin</key> <map> <key>md5sum</key> - <string>aa144917d0e33453d3c2cc2c05c6c47c</string> + <string>2f9b3528d4b5f858fb8dcee4b6dd5188</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-darwin-20100529.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-darwin-20101117a.tar.bz2</uri> </map> <key>linux</key> <map> <key>md5sum</key> - <string>98f7945755f3ee8e52f685a3eff4d7be</string> + <string>cde4728b8a75a76c72a8785815cb769f</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-linux-20100529.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-linux-20101117a.tar.bz2</uri> </map> <key>windows</key> <map> <key>md5sum</key> - <string>e8fdd46cb026c2ec72c4489eb3bf39c1</string> + <string>940ac55a6d0141c958bf2b14939d8474</string> <key>url</key> - <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-windows-20100529.tar.bz2</uri> + <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/slvoice-3.2.0002.9361-windows-20101117a.tar.bz2</uri> </map> </map> </map> diff --git a/scripts/install.py b/scripts/install.py index 7368af0b37..c2adf4d0a2 100755 --- a/scripts/install.py +++ b/scripts/install.py @@ -84,18 +84,6 @@ except ImportError: from indra.base import llsd from indra.util import helpformatter -# *HACK: Necessary for python 2.3. Consider removing this code wart -# after etch has deployed everywhere. 2008-12-23 Phoenix -try: - sorted = sorted -except NameError: - def sorted(in_list): - "Return a list which is a sorted copy of in_list." - # Copy the source to be more functional and side-effect free. - out_list = copy.copy(in_list) - out_list.sort() - return out_list - class InstallFile(object): "This is just a handy way to throw around details on a file in memory." def __init__(self, pkgname, url, md5sum, cache_dir, platform_path): diff --git a/scripts/md5check.py b/scripts/md5check.py new file mode 100644 index 0000000000..951fe0105c --- /dev/null +++ b/scripts/md5check.py @@ -0,0 +1,61 @@ +#!/usr/bin/python +"""\ +@file md5check.py +@brief Replacement for message template compatibility verifier. + +$LicenseInfo:firstyear=20i10&license=viewergpl$ +Copyright (c) 2010, Linden Research, Inc. + +Second Life Viewer Source Code +The source code in this file ("Source Code") is provided by Linden Lab +to you under the terms of the GNU General Public License, version 2.0 +("GPL"), unless you have obtained a separate licensing agreement +("Other License"), formally executed by you and Linden Lab. Terms of +the GPL can be found in doc/GPL-license.txt in this distribution, or +online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + +There are special exceptions to the terms and conditions of the GPL as +it is applied to this Source Code. View the full text of the exception +in the file doc/FLOSS-exception.txt in this software distribution, or +online at +http://secondlifegrid.net/programs/open_source/licensing/flossexception + +By copying, modifying or distributing this software, you acknowledge +that you have read and understood your obligations described above, +and agree to abide by those obligations. + +ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO +WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, +COMPLETENESS OR PERFORMANCE. +$/LicenseInfo$ +""" + +import sys +import hashlib + +if len(sys.argv) != 3: + print """Usage: %s --create|<hash-digest> <file> + +Creates an md5sum hash digest of the specified file content +and compares it with the given hash digest. + +If --create is used instead of a hash digest, it will simply +print out the hash digest of specified file content. +""" % sys.argv[0] + sys.exit(1) + +if sys.argv[2] == '-': + fh = sys.stdin + filename = "<stdin>" +else: + filename = sys.argv[2] + fh = open(filename) + +hexdigest = hashlib.md5(fh.read()).hexdigest() +if sys.argv[1] == '--create': + print hexdigest +elif hexdigest == sys.argv[1]: + print "md5sum check passed:", filename +else: + print "md5sum check FAILED:", filename + sys.exit(1) diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg index d4f791c202..77dc940335 100644 --- a/scripts/messages/message_template.msg +++ b/scripts/messages/message_template.msg @@ -6812,6 +6812,19 @@ version 2.0 { SquareMetersCommitted S32 } { Description Variable 1 } // string } + // For replies that are part of a transaction (buying something) provide + // metadata for localization. If TransactionType is 0, the message is + // purely a balance update. Added for server 1.40 and viewer 2.1. JC + { + TransactionInfo Single + { TransactionType S32 } // lltransactiontype.h + { SourceID LLUUID } + { IsSourceGroup BOOL } + { DestID LLUUID } + { IsDestGroup BOOL } + { Amount S32 } + { ItemDescription Variable 1 } // string + } } @@ -6838,6 +6851,17 @@ version 2.0 { SquareMetersCommitted S32 } { Description Variable 1 } // string } + // See MoneyBalanceReply above. + { + TransactionInfo Single + { TransactionType S32 } // lltransactiontype.h + { SourceID LLUUID } + { IsSourceGroup BOOL } + { DestID LLUUID } + { IsDestGroup BOOL } + { Amount S32 } + { ItemDescription Variable 1 } // string + } } @@ -8972,5 +8996,7 @@ version 2.0 { InvType S8 } { Name Variable 1 } { Description Variable 1 } + } } + diff --git a/viewer-hg-convert.shamap b/viewer-hg-convert.shamap index 29f98ed8cf..1371d2cf76 100644 --- a/viewer-hg-convert.shamap +++ b/viewer-hg-convert.shamap @@ -14430,3 +14430,374 @@ ac617ee90acf68794feef501b99ae43ab538a558 09f13edf6aa8c1cef43c8ba7f17289e75096a6a f84f5fca57946f838e79a59be20dffe407e9d3a7 edb3d5536c38643633925215404f2f02350f37d4 426780dc180359b13f72bb6a259f9c4effe88cf9 fe1a7607de6ce5c3dedf96907e114ca0a208076a edef0997a11b5e3bc1c82cce0509e0d57bdde64b 6b93a09d0cdf42d7cee85979de6d7b18e34f6dd1 +b140fb0f294a7cae1181edb342294f0c372a052d a6250fa92374d84353e5d80d38bafc0a315a9d71 +6cf3df8ac3c7712f1a8058e0d6f42761ecc63d58 462b1c235a145dec4b89cdb9f3c107f2dcdd048f +070724e750c4bdd0eedefdb8fd4554e69e0ad33e ffca5f9c5c2ac2c8b201e1dc262371087f3f116d +5f627e224ba5a0c8a63044ea91d9cb7e55f485e6 70e4af736964c211ea0e66e154255c0fb9fc4a1f +de1c17c35aa42c6421c60ebd9102da151d78b1c1 5d67b10edea1f8696886d3d0479c784943fd228c +e2fe42293f8a5a879b4c9a4206dd43c81f385720 c68776612c1f2895629f8712b7b8293d8f0cd833 +cd7e437979644107c314493e41fb39bc126caf97 80af8db446dfec8baf360c709ef7eb990dafaf74 +6247e22de57b7a78eae29758d816dae4c328c8e7 7d2e13e2bd90397984edd7d6b1de1641c546d3a0 +0a5fa7cb1858f4f87a594c740e49c6029cf61439 4f100e626f2d5b0d68c0cd581a1136404466316d +1f4097b566c0c9395477219fa921ad24fdc7d252 5ab43707d58a1b9681d1935396aba08144ba96b8 +d2430c126b94dc6bc30eb0676ae4d6aa4bf81ab4 c3852476e859ad0bf2db7739185bb52442ca0498 +16040352ffd3f8d126e6fb5233e219b3840e4baf d13df6d264e1a58187545b5cfc2e83d37fcc0aee +5ba552b6dd1585e2518b69afc7c6cb01d5bfb5bf 1d78d0e00428c1df177699cde1347c86a6e0da3c +fba2f283e8847b9eaadcb7c78c220442bc61273a 54f5159608a71a8e6a7c6118e94128be35f5b94c +f9766c168cb00ce2e293377f3587a0b398c10951 2cd0ffda361c57134f3fe87784d308f208f44340 +82b23a0e487bd95c6b6dbfd47f7724b14d4807cd 2ce97abf67d8e47f378adb352733bbe515f68763 +72651623d96deee014411daeb82d50452261e0b3 0d637cf64f9c61aafb938be19e6b77d0d75d2256 +359f03b1285092f52ca9cd8c1b2653d182568fd8 fed92bc4562639d565716008264fe7357e5e5493 +708e00baf7cd7b47dbfcc0dce45e2eb305fe3b72 bb9243c01e89446d08fd62b4ea874dc870a1e871 +f7714ce278de8b0aa577c7160e8770f0ecf432b2 5bff02eeef4689558df52f72a8f8a82d619f092b +a8ed6873b6dba8eb5b7cd04ca5182d1c8820ca8a 9624351548184433776f16552da60487e663be08 +ffe8d0aa373cb42df6893b707027f66f3cf6694c 1fcfc45f02a5c3da4d5135167ec350fc916efdce +6fd0d0bcdb5edc3509d5a810cae5e7a22d0eb82c 1fcfc45f02a5c3da4d5135167ec350fc916efdce +08dfb2e4ed346ca38b3b59f2450c37f69e1ee671 bd299f8f759355320d1fe2ca19b599b77be0bad7 +5f7a90472c8c317a7531f919188daf506873790c 9d8ac18944420fdb0e9c600ac688d15860a289f6 +d1348e4ef737bc13dd223b62a2e41c38ffe30c72 0420007883104eaf3073c8d750edeccd830e1080 +3fad13218df677671f46c16962658f3ab42c975a 3f804a666358e9ae5af5beb69aad4c7b15f02f5b +9577c104c8201f5fc18d326a6837db7bf1ad6353 380b963a1f0f87a2c3d5290117518da6e83d83ee +0deb0a34cff7921b00a8e0c9cf366fa766bb9c34 14e17bde662cadb7835fe8bbcdceb5a83ec1c510 +e72b2aa52f48f786aa1a75ce436e62099665dcf6 d39aac8b222feb2955f3b630438a164ed4528c25 +9cb9aa264a2e231369de9ff9ea752d40ad9fcdd2 9b0a9bf5ce2f04ff3fd6caf8dbd30f7539586985 +a9163992e7050cb01bbdcadb78dbddc77d840488 edb69650e477033a04e25dd7b66b35fce24dc836 +0aac191d03179a59d41163be52860c3c26a37849 3a171f9cdbda0ba8cef60c33a11559273227b416 +b3bb873255af4849703bc17c81dbf755f22dbcf7 8582ab0f137b3e3bf85e931c550e4b0c7ba77ca1 +36e8ba1ae0728814a9f6f771b9380c7624c6af75 73a7e5749b0cc59ea73687dd9223d902e9dfcd80 +9cb4d9eb3d2df7dda2bfa3b9e8f623dff03dedc9 ced75bc3ce177acd84e83d79d6ae9c5f3118d3e2 +e0cd410398f70b7fbea7e04248c308f61dbf4b99 6c711bf31d62fb882dd4acbec5f518904b7b0183 +93bed3d76df0ccd9acb15d2e35dca67b2e9b0dc7 25017ca844f16f7251b7a41450deda304e0a6ba0 +5e8110decca97a55ac9fe68c2625dd36d77ec2a7 c075a1ed884ee002f6e18f564890e1fb17081667 +394d4cad28a28edce20eef31fa80a355559c7875 9c595e435fb3f2bac594c4bca503f47973275ca2 +17459d6abeb5289c6cf4e2e948b0687a2ddb0431 0bc0dcfa8873ca252fa22e2232518db481b6cfb6 +33601045919daf0e1dd3275abc3c59f767c09950 94982effd5cc02216ef6a9f43285749acb60ec1a +565c110b72319fa973446814e551ad16e10a65ad 78b3304e3ff93810feeda98347aa44a97595e61f +93190a6f49225ea2e3d2ce69626c9a7533300f53 19f58f962a66fef84261b7b8d9ca29242c566c1d +ed2c851222c480d2d277c65e16cb193302d3a3e9 8f7ce29375da74dab526e8adb7b54870e145aac2 +9834412a934f93b3bf8aeb036bce0c7992042862 9fe3d3ab9dc7d5cd1fd0ee997248d3c445c99c14 +15267760d50c1aadb7f808d987ebfc6657830841 36949020e376f0a6a071cf64f714a4a54f4b6968 +eec90bdee54a588efe8518426a19a52770e1d1cc 57be583d7b844321a3c792a53ca20c3d7bef27e5 +d9125878d02521ec0ab2a4b974b5a1faaed004c5 653a6c7743f3eb23b853ecc54b703d8a0e36eefd +934cf4e6d1eaf2707e6239ab80d0c566329f9cb3 32a4ec227b638cb0a4e1c238902bfa3fb99b1b2f +346bf54e88d566da15ad09f7df78f55ac6d6ced7 461feca8921050c640c07c7e00b72b0aecf4acb2 +10dceeb7dbaf22857e6fdf45b7380238a7bbb869 c50a896787b44164995d4121044129780693ff5f +f26fbc0cf6ad8ebbecdffba20e575834d135ffa0 3e75204640193b1337295ef3d05b416c131956f8 +d4a428559d3b107c0da7e8adf63970069b36cd35 06a41d63494131ac94990030e30b9525be10ece0 +56c391335a4ec4dc6ce45019fe236f0543f4a7a7 e3d8033c70ad10c0a54b291c195f8764869c6541 +7f8780db973eefb93fff212350abc447b8bc3cbc 8651c7b505d4ca24551954334737e3c6885e255d +c02a766081eda6cc1d80bd6c19b41787e2541993 3816752a14f68c6b41ea6c9ea8180d80cb9eb3e2 +06a9be592bad3bdb0f843a88ade668b98c293016 3ae24f3a621a6efc2a845f88fe56ac0f8b618beb +6b93e59e4942e2cb27431b20c243f1ebc5639c29 b2309808b156d54f25c21c68130da5fff16f5352 +0066c8b1620ef553c509a27121ef5d22b877064e 70933bb6ec87f8a251165e41db4c58f33e365c84 +e20a25cb260476adef2c108277ad87a9a2a90873 d17aa37a74bfc9ff7f6a3720f1bf23a8dea6c8f4 +d0ee75b942c5e0858f24c3b7aa0c26b919f1b7d8 b9f2438cc54e059cb0fc6a04c933db5028a148f2 +ec6a34eb37a6b5c7f36ea25752ae235346585ccd 3aafb01f4d8b4da78b0ba748df89c222eef03c86 +00e2b47aff44d0b80ae12a13c27450fea551004d 0704c40eb014577dd5843424d25e7bb73f43940c +b1d92d7b39d6cb05728f27a9678d1fe08cea87c6 07c8441b1b55e4b9a13a89c5105d2913980cb128 +ec71fe47d2c4cdf16f4972fb743c844a0905ab21 6ac0bc6f805f62bcc579057fd0379f99f7a13c25 +6e9644d49652a6e1953d8bd791fad27942af2f2a 484e32d2b9a8721a4fc46d0f4093aa45a835a2b9 +12f41f9809967be695ccb52b33097452c3b37159 178809a07578142bfbe5ebb4e44a6239a39b2b90 +bc716311be35b0586dabcee225ecce302295e8b5 8dccf0ffabf5fbe36e1b29b66e4a747c4fe5a1e1 +b8873253909069c4750a1ecca80735db762ea92e 52031bc79f08c7d1e4ddfbdd580a15344e02a20f +b520fb6d3d0f7972f106349e00819726b7cac9bc c9359a4f6ceff438c736e589c2ed35d1a889dae3 +82b4da888fc0d3ceed08988d94505385aea9b4f6 1c1bb9d8880c8cbebf0dae6901cc57a7580fe7a3 +8703b77fd914bce4145c8ba318d3605ae6cbbbf5 390d85cb3d6c8f17843680f6022bf3dbbfb62a67 +919a72408d72e55a219a88959986271926c76dd9 4d11122fa058a801d0f57c8898c0867e55a18035 +89be09c64c7f23b5cb6862b713ba9f43baeab6b1 f8cfde7fd7bd189bbeb93b09c7ea9296d9e059a2 +832c18c5075bfaf4e5dbab56592b628ffc2484f4 855c3cb89918ed1ebf4c724811f94bfa8a5d5aeb +88bc7aea10a76df348ae9bc271aa74fd7c838b69 aec30358ef4786af41af2f3fc6fa787ea5a85682 +2f176370fedbee5e3fe37b2cf27eb94bc199e2ae df08d42aff5264cea1747d9a0937efef58a2ceda +c00e7b247ccb1bf600c44203af00c94759c23e59 c2a6a7bd29949b6de93260614a63a2b5135e8d0b +48cc49a039c39ee92c5a90f0ba155b5a92a408a8 696ad5f3d808e1a2d6b0ebffea0d9c337194c74f +108cb92a2943ae5b274a43b9912fb97ed71fa9ba a042ece75362ff6b83010f3c66c8c3f5fe8c2a36 +5413225c8797e25fb42d314b172d4abd02f64d25 12351e182354413334fa8d0e1c773501c0d93a90 +1121237696041ebc58933ff0ea9cd1ee8566eb11 ef165d65c72aa68c12ba4503925214dc07a92d8a +ca6a373ba89b7c74132b324f5ae2964160c01833 cc98bba7c26b2d2c9a65b95bd5618e14be8df8d5 +e90f089fae1224b29e1b047e9be2c1b653e224c4 72cceacad6f470c919f5a52fd4007098715af7c1 +81e8feff93c19164d9319d100a848673b7c76730 252779212dc40b64f9291c1287bd6f7c29f48377 +54e904d0062a98e9aa7f4935aa5671a6eeb647cb 741eb25e921cd0f8f274a660a31169284d47cdad +84318fea200ddc5b502d51f68f92f31eac939556 f0b8e4748ec61c862d084b9eebe8eb37dfc1ef88 +144e4ef8c73291f488b4aeff55dfb2616571c009 a15dac7cf1f9056702c85c134c21b92fbc7a5849 +200575dbef612f1bd91db72242355519534b9fdd a2e46778a30ee390acfacf8009eec0acca441090 +2bfffe15ff3e4ef98dfc84c6e7303cbb33619154 12659fe5f0852cbbc2b3db4757ec25f525632240 +92443bdeff135c9032b618da17f883c35323e2b0 055fe04592f29645af4452b56cedf68209668b17 +524c1736684dc38ff3b381f968fec709f96f70cd 4105a6fd17b55cc83c332561347dae978edc3ebf +796dd7513d261c7d3479afc32ecc39dd174965b9 849432193dbf5fe86dde65edc25560a1e9909c16 +6361273ae0f4f8fb876d3c1396d52c630a211460 70fc718d68cd079396863bfbc61e5770984adadf +adddb5d790b8eb43c52992f730f2ec450731ab16 100999bf3348eef87c917b47c269dd450eed9db9 +5bcf7a83d56a6f26721548c2022462d708131116 1d4dc477ab14450a989fddc92e46f305cb5d2970 +f75c3fb19b8dffabe3510c45ead576a0534a569d d999e6b90aa03e1a97f530da74a5b7fc1df1d2b2 +29a591d8188a8cbc555c5ea9def1d397604ddb1f de9a0847cd5b883d96c4e48ae5866b3563f17309 +23a287269bc1e0cdfa4fdb0abb90fb34fce2f2e2 f68fdc49adf2d06c680b95a9c1c864343ca82882 +23a287269bc1e0cdfa4fdb0abb90fb34fce2f2e2 291d3b2d1d3496c7d02419059be50ecf824b7157 +6f051897d5bdefdfed8b4501813af38d72454fb5 36cbde31518921654643e789ad78f8600b8d25ff +9f8d0227ab38ff772ff712d4cda7b4a009f0cd59 30505fa0f4e3b7dd221774f03347768f45aff37b +89b047185845fe5e6059ebc33a2dc62a4aac4b3b 51112c653a6c2eeec620e079f07d24e8cbdf0c90 +fead8f2e1ce1bd01585f65e187e05d4813dafcc2 bb94e4d608052e5e35b8623a684a4f7fdcb1b3cb +18811ebc0e95ba3ffc9faa20bd9dc96aa1a14ee3 03d700c66cb257b36475ddce6743edeeeb9e59da +64a1581a24aaa1f79d36a59e590febcba6a0282f 6f7e9e889bb2bfcdc4443ae55e7679d0fcc241e6 +4ec24ab623c0645cde31b76f80adb3a54b388081 c42c64d95a6ed18b8b45bfad477a04337ead43da +972fa9f777271dbc663b94d76ff8294cc6e544cb 7847b6bc86ace4244aafc82535b90bb19db16260 +10b5411cbab28a31aa5d05132e317cabd2814155 04dfcdfc5342879eba9193c1a1c280871e44cd8d +727da85430045ab9be950a66aec91e82153fca4b 9ad96d06e05f880c05bea282ab16df3cda269ae7 +181536a8410e24c26d56c56e4e02202830f65d6b 7847ec3dc260169adbc5948d93fc2c9cce6f10e3 +d355215859a86830e1bcad5907429fb3bf5b5377 7e8965721eaec9dbfdc5321fdfbfaf4f14b03f68 +1d16e58572c9f845fb17488a3836d8443967ca11 1868a0d7ce3f18cd2392b88992f106a628a4f973 +c7293fa82ab689e7d977a42f5842572f20a86b94 c8b8c02dce2d4690a212853635f71ceec9d4889f +52bc038b3f71c2eb07f6e90222517f9837eadb55 c8b8c02dce2d4690a212853635f71ceec9d4889f +f6c5ec32338599dd974c05eff729b1e0e21f3537 16cd734700bafa489c0079995733949b4f82422e +fc5e955a11cd6760643cae269a84b9ec9a05c7bc db128831cc9045b5faa791eec9818275939a84c4 +48f050d962b16dcbad7c4133ac2106163c993280 c7e03e72aaa1cec06c77138d4a6a6e8eac16cacb +0057fb0730ec8e1ea7e6e1b694be16f5f59e94cc 81ff96f535ba8b9002e3afffdeb0321e0079da95 +d061f0c76bc997d97315a5d5e2b4bc171325d5a6 d9a5cf2f9bbdc82ea89f11e1b5c7a970754f8191 +db4e63b381d98839f5b7eef8ed45cc3aec2803bd 205f3060d6654d044a0f8451d60168224125853b +2ba920c6b890fec0aaec4592484c7c58f0afe05d a0ddcc16136a5f7989f3835b2f0744ab94f974ce +84a447cf4554b5daf19bef1a34da6926804ac8a6 7e4269176596eb13ef5706e433b35033e3313730 +21f6555c2645ee967a0cf1d373ba73967e4da4ff 47ec383bfb1dfe713a05646a1d14dfe6a695aa99 +2b465b964a501e905bb76c2698d3216d5b8a7e85 c62e77fb255cd22f9bf346e5a0ce69f038c1802a +242563cbb3e405594bc8d8e6b4cdd3695a3eb116 6855665fbc2736fd6d19423663daf6b612ed873b +ba2cc5b3feacb1bd427c10df10cd4606a45ce46d 69f98f451fe4e49a8cc95636e936e324b3ba39a5 +57e8deed1754c797d1f4bc3257fc4ecec4f72381 0aae9a9b7d5e56c86d412a1b0bbfabbb394c1e55 +1661b05e868ec2302dd0eeabd374dcf300f55d6c a9ed7fac89f5bd419fd715cf7a3d8af28beaef2e +e19f7ce8b667a334c95bc87f59ac9029b6b26990 dda04d9470473a690e09d4c24c1a6b4a007e6cf2 +f6127974f8c3ac3ec3c9667c8f4e442df7c26b78 e7628f6e722fcbd655a6e92d3dfc90092aa026ba +172013ec9966ac57ffe789451d748f1ce268c420 6421b317cef15d54b0bff83c12bfde0e1aebbd90 +29a9f00a4e48d379e3a59ae2bd9ba43eede05337 f3702734ddd035721e5ad4bd7b1ae83d1885bc48 +224b8f9e727f42112dd5952005e730856cffe838 c543349aac02e3b1dbb5af8b3c4680bb7516350d +36b9804f6b66dc742c11fbefd9e24a57c2cca8d1 8265ffe74fd92d73e85403b6ba583bd335a7642a +a71012c45228968db36a871d92403bb564462b97 e2d40ed2f82753cef927cba254ebdcaf81b49f8b +dab4605b1bf0d1a686109f4ed6e78f5fbbf1e9d5 f7a84f3af9a4fe9c06c587235858ca86d49d241a +f3e52086c5133f7935464191ae022b49d1cd93ea 527133079cd656d6fd90f77daec8a93678962afc +971d4b0c9f1a0690d076275a716bc02f272ee62f dd60cc12c3039920eb0eff0d2259eff0af25b304 +42e14ac94026769259af54a183850e6eb975dc64 4c2f81f0bd4c5e94d3fc69bc8fec0c193dd3bbe7 +8cad2e5be6325926e0c824069041b2e870bf52bf 1248724a14280b7c48dff9f854cea469a0696bea +560c3b8785188a77d816e0eb9ed0b87a27ade565 ff353e408c619e6bced6bd74bceea5eaf9070ce4 +a86cb0e7c5cfbce2a1864bef535373884ba0d65c 8ad454ce2d865f80dad857b92506365fd2a3e032 +22cb5cef36f6009b5dac6784d1b1d48af6fbbe25 fb2f44be8d6fd0c0b2a6c3065a99859afdb4d246 +ed2c132bb5b7025dae00e4c76a7650f6f99963ea bd7c5c5f4a1bf02993c6511b07b625406fcd987c +17a15fe7b21c10d3371b18a8b0f3c1be500f6f60 686808099ed95cbe8cbf6f5cc1afe90d57212fb2 +0a69f7d189bf1576d6c762b784fefc2b3f327876 f4f8ac9826e27469c3811b54fa4d996c573e95f5 +dd583a2279dd27ff6eb3c514787cbf2aeb56f4e8 98f5a275f591735c5d4e8756aadb20fb57bd562f +c351424acf21410d081ce8de62989f73f85a8c10 9cfb405637fe411aed751293d7797deb5a59d0d1 +c6c87576e743909b387ab09fe802e48ba5e3f0b4 e6f8f82feee38144e80977d395b0966e2a34a6da +be03e0ebbb964637715f9008d3051ecc743cc3fe 9e35342b486cd7cf3eb6b147a9b3a88d10861a66 +76cb02070c6cb35ad2f1032155b1e883d1531c81 d7a4b984e121aaf61c86f8203189cdd0457f875e +b5325710ac2a0c6a5f0718d5ba88998c70db4885 8a6676b74d57dbe5da11cb35089aa754549b1d9f +0a5887ac3c2d719c036a271ba54b1a25a7a91f56 bfc158cd6bccc9c43e19f45c33aac583bac14cd5 +53abe24c9d53677965de02b8de701693ad446f13 bfc158cd6bccc9c43e19f45c33aac583bac14cd5 +baf2b13c06de58e5c5fc6dacaf8d95d4b88f7655 02410f4bb682eabb5d055ae9ff921650b3bd8066 +228546f536f8542bcd3fc03651a941d41fbdbd52 304371397edc16a4e0ed3e68af37a280fc87bdaf +c001f33dff6b167e220a4afbe471091a5dee6d94 304371397edc16a4e0ed3e68af37a280fc87bdaf +8d2ad62e42979c64b0a2aaae2b115ed788cd6f5a 3ec1f0a1c22aed15145d5751e0df8ee47e53d2b4 +5c99782b24433479b1780757eac57351c798fb41 7f3287bff4b1c7ac53e13affa29ab9a45818d300 +6544920f2f4429d32b8a87e61ef45009e2b84cac f255405b550f26176bce3a95645d49c5727b1ef2 +701082a8d2be28cc7daa9979c14bc893480c3de9 cb3935e607767584d72cbc893aacd47a285c3838 +9e78eb0e6eb97f32da222e20a0a4411496586412 c3fc5c0e25af262ec1e12d1ca4e8e86c71ad82ee +e9b7efa29de0f9a1065627eae24dd91b349efa91 730f5bbeb25087b27b7c4ba343709b4f95bbc8c1 +1281ecc85abffca0c02a139dd8fe0b009a2624c2 4f3660701e9a199a7c4238061bd0783ec9097518 +d1922682dd4750be91f40001b13c994e15f81192 5f3e13484f1e7321261f6cbc9c7a9a0379f1f679 +259cafb0f743a870ee33695c0abe3c97c17e79fb 786393962bcec24e434e9df123e06e641c165ed4 +3cfeda894ef67211fb556fd540695865800fc79b dc250e4489c647d552d075319d38d746db065f0e +74d0b8904ca9264571fbf86e12671fba827a7f3f 36f91bcad175c109bbdbfbcc7a2ff508f1937f66 +8b1c59cd65391782744ec8375f77354723345d78 2eb4f1ac885cb50194ef0867fa97580b85af93a0 +fafede892b43f2474cc57145d7d4e1112c225d30 21ed31a077ffb7e66d78ac2b63f00cab05905b96 +2ef79141b7c548055fa2602f8c759f98a6ffdf92 deccc38fda47fb3fd5fe93eeb86d6971f6f944e8 +f60486fb33a46f1129926acb87bd8db2fb092ac3 0dbda301dd0ec4e7713d3da3d32d4eb33b811b6f +6b520fd4520fad57a6afe027908c2d025d2036c4 a98a934ef3adffd0c921a684ffa6564166d715b0 +0abe1bc81a96c95b07e18e40c1dcdb2198db669a a98a934ef3adffd0c921a684ffa6564166d715b0 +a5b2e3bf5aaf613fcdf6472c42b24893040e0653 a98a934ef3adffd0c921a684ffa6564166d715b0 +9270d7600d44686cc937680cfc06363232ffdb23 b5b3111011549114f1c914cc399b65fceb73740a +bb51c2d339673a3cb4070559c7260865f1f5f0ea 9a8a8848cb30c33a134fcd9f67a915ef67896367 +a64bc47252b634a3e164d79b8536f9af298bbd37 a698d3c4f6fb233b07454a2819bc5c735d0e53de +7518242ba2ef9b9ef67ff990f865e1c978278703 976d6aec4956fb9a0fa03b7c5a4dfd28ba9cac00 +2625103cb2e688dbcc2a2fc2ca73a00dc6d42336 9c2257478178a6e1eb30d0633f2c2b7d73f79471 +7030896c7d94e648372cd2748fdca92f08b4646a da63c2cc6f59a05c71f926b5f82adfe5f5e17428 +616752407247c0511e1f5d9ba325d8570b542ac3 f2e64d606dad48fdd494322d6040f6714723bfdb +b5f5609af16a5bb18254e2e6cd2048d654a0492a ed1ea8be0ad51f6cc1c15a6c58449ffaeb57959f +37e77bb4a9d58eb1ca444e79d83f5361ec4735cd 8b732c44c517e5c2c87c1e612b46769e7bfd3193 +327f071afc26ea9b89607d2264a74ec5832dd4f4 07e1e48457d4ef73bea8ab5befcbbe469f9b3749 +031bfa823714aeafa2dc479caa95984c0e9e9f9a 3fd3f47b750c8bfc06df9b35db21bd5f61862c8d +ae9b8dad12e34919f8523a311a46acb93ee729eb 54f1a1738d5b2c86b10364ecaea7526871d1db0c +e80e32b160e2ef65391bf9458c567cdf04eee0b2 69718305767139bf0989cda6e95186c3da99e4ec +1e58888b0641c37ccaa5bdd8fb239d7fca3f2904 09a51a69232c85a1e6d28450642304eea1bfc10f +ad9f74c0ec3cb79a332f0f380b66c961c476c8d2 9b61860449952c40c5aa26406c502706ba602a60 +32b5f244d110d5f33c7609db74451cb2954db4f2 5701d5fe36e5e6ffcd75322f8b6437b3c816afd0 +e965cbc8f4283e7e0b0e71ac8d8e1c6d66ce11e0 1b5c26a1b7a8ce0c9920dc27b9f858de710acacd +ef5c156e6d834b994d03c491b345b4998f73f222 cbbdf0cb7959d9b19d2f0e569c3b8a89c13b5a3c +3c6858f04b8587cb9ad2c3e4458384a67aff84b7 91a3f9dd8fdaf5dcabdafc31d769a8d179a09db2 +cf53ad9b489b705aa7469c867d645f00bb0db572 48a2ea489aa39f4693ffc7d4f8f2ed1c2b19f547 +3d49a941920272516cf986fdf8442f9bb1ca1ce4 06541e114a3014c8dae724f19ed0176a4e665b78 +6e8f28a229147ff3b4942310621f3846cf1e9849 9f4e73c21d9b97a56effae1e23cb1b12121bf719 +52aa65fdd414ab47390e2e0b38b296b190cb9e15 77367f92422d60468c58fbf9fef07a7b08baa035 +629e40b26146c0fa9d65a247c5cf820cea70d6f4 fe44dd618834af6971b8bc832aecd0603a4be5d0 +d6d0e691e72062cf1bacb21f0a116146d520495d 81cd45e1291c22801b7623dd6e8ccbf1b1713f05 +04108417b64f46c00eeff9b4ca91da3d479e12f1 d2be38fdba130a1a40e9e2bd5ebbe164c931b86c +ffcdc7b40b0e2c033c2dfe7b6152dbe9e45d9642 ee3952cbaf190b696e871f0afde8f94a2ac86338 +0904b87ceb0c1f1baa7a8202fc7d26214abd160d e139292ee5efd985f6d0d4ca8f81b4e7de70ff01 +866ed854411b23420915a80579587f4cffb4df0e d4489559a88cbba824e80ebd579fd8c6c800f5d4 +929ade1d0619e798aab5461195ed49d0401e5243 a699382fdafd6a6b0ea887408bb77a5ab143e341 +e9e2186f808e5908a1e93ef7955c50aad9190f56 7e43225b378de143f729552032505a82084efd54 +ca3e6e2efe4b6feb575d487fa951f3219a33e246 9a4741ebafcab25360084c9bf9ef5ec6f7cefa2c +d814e6735dacf5f261afc770497fbdd09c346444 996434fdeda7f22fcac86eafc067c90ffa24c5c2 +e51510803ee3651aad11bf57489f377b7a794dd8 d484945c2d2e9680064ed5fdd1c8297c3446eb94 +6db32c1a6ccecefbe9607ea77ed2f52bf0e459b8 91480ea9e0526fed7db57393c1bf6624113e1ac6 +44b20c17758c302619954f8fc276c0f154f546bb d453b6faccd7da86be8bc3b0a044373af20f7a9e +81a71a96647fcd450d729dd35fcc3bbe36a35271 2effbde08719985e336f316ea8a9781003d962a9 +3e0cf194c4fbcfa15ed4b8507c1f55f198246e79 3ec2608589cfecb0c1cec8e26141d0c2625c2ceb +510dd7642a0d36a2446ac78d9934ea67da8aaa0d bbb272c8379fc8812b37bacedf9b643ff88d2718 +8a3e7705787537eddbf8bab929c9e6314f188380 e291b919ad6f748e320a99ba90d6dbb93a103672 +93d662b4fe6b36122e15aeb3afa7dc775c1e7133 996480dd0fe7fc7d9307559b20cbbf965224b4e3 +c978c8f17d41ce4657aef6b38392afd8a874cc4e 714c0c0e325bd48471c5211750b26e8f7fe46eb4 +943fb6a1c19e9f0bdc00caa0dc3a15ca4017368e d48e2b8c4b41122d0702d00dd09e0f20293d298c +d151831aa0ba06fa0881a7c708908b08ce83d333 aa21e1b0d6ef672c84018d522b42f9a1c13a4f3a +8f1e31afedfe5012b549583bd44cb1ec72477745 1f0f7bdc489dbadfb76e7476ead4bcd74cf65249 +1432a234e29cba17dac71d2bb85542e6059b5d08 5577554418a91890133c83c42f2707b57085b217 +246f21f4f48f0cb0bbada7266cbc219c34162a51 2769faacf41872735de41fbefbd13e252a08bc2e +8ff7edb70fb6090bca458540d681a7032a48fb82 1b3190cc3363b9a24a44ccd04867c361fd54a39c +0c23687b000260423026e694250d0b39abafe762 34bb555b900b22e8ad4e30f21fe340854c69669c +7683b50d300fb35f042a80b46ceba0b32dc4241c 75ef0db627f8afde1e80c62a49a1a77938f1a3fb +0430242156ced9f76b4ce47cfc8e5db2a0215a70 ca5ccde213d6744fa4a029ce8ed15fab3d9d27b9 +7fe732dd446923cc24d5bee656defb9b94adeb4d f94894f92e354fed31f215b9bcef13bed2f26a47 +cba6f7ec58e4bdd599a2df39eac15f729c879eeb e2a66892d1a6dcbdda8f9d6da6e2299972618e27 +b7c66289dcd0f9c1085eec4aa9b7331acc8ac75f bd140577b0fe56179ea38e1f378f7a2b59849f27 +fe15771f8d179c15c7992cc6647c15707aae6bc9 2a6e219adbd64270285f2c65bbfe697b59cd5901 +55f978cf7da82f1e4ec7fe4619b8829f91154e5d 049b41eb6951536ddf6416d40c307c0fd3a0a7a4 +dfef76b0de4b9146017cc97fa1795d18461b6469 f920a151780198f611eb417f350c0f27b67a8934 +22d473ed191d613a1cefe9c107630b058aebf9f2 d8b9d74aae5e4ac41953cf7e10639a54a6d01081 +1284c4b409000e23c4616b23247deabe95328f04 382eb9d13d8e793cdac35c9c560b3570e719ad24 +92bf7410a6ebd7f226e1787d28b5cc7d38360566 9c3d03ccc0814827e974b435ba3fff8f69652792 +8192473845912f21a48127f5f121bce6c43a5031 4ccb03c83c23aea10a924492a9ac04cebf7860b2 +8d05c834e3776caefea1f41ee96fc7266d5477b1 de3342d3a31d3286fed6bb49bd34b8f40f925c61 +efe26699180d0ec25fa3247999e18afe3b6ca223 5f07335f2ba560a1346c664ef63ac8af12f13d61 +bf6940aeed99a6dabf5ff126b42eefac8f1c030b 5d60fd16315e89b3f223b10fe23b21cc8a461e63 +39c5579bc870db6708a28934bc32ea6448d54ee0 9dad37bbc5f254e3a20e6b04bc212ea41cc9ffcc +2c84cf07ae8d8da36cea54a22089a52bf39d0a85 ab4af8a7c257130bfe842d99836053847b941c3f +f00c996e4ea680a3094bf5b9ac41fee6584c73c7 8566d4a80f5bdbaf7bfaeb985dd792302b57b6c2 +24e43a0644f76cc8d32845213a7cbebbc23e425d 828b4c34e19fa4947345798653ae11f07a5b5351 +c394f4e78595401f114c871f61de997c7cb2c6b3 c11fc04406f6763f190684e350a210394ac6e30e +537d09b50f7a8e5c73216f9e68927128acdcf54b fbb6ead7cabc056201129a7ba9391046668adb15 +f76dd253ca4ca1c164c8228bfdeffa238b53a429 37e3c80d82977f9de019a46af06f31ff10b0b432 +1fab965fd81accd9801ad44455b0bf969486a9b0 0e3d77359b543b19532b6518c6a0805a32419dbb +a44f290722ce4b88cb9de7337ab0256cf0b41d68 59e81b029c15032bb2bf4c31a6cf11dc6a264f0e +3610fabe2a2b969adc8e8b3cb95f1f609b3b7533 80bf8b15d97e12a737c315de9e4de54d31e689fc +27f664400117387a6af70e274b20c06f6ef8df79 40b888d1800edd11db7362ac3844d79f6ab3d7c7 +af8b804cdb9238beb2ac2fe9e27aea1e7f1734f2 0300446b133e9a5c51470641062bed806789de1f +4eae07797fa7ddf59b091e664a76e77b6dd0ef86 1444fee60b3136abc0d7b1d6a3625d09e7615c5d +dc1aca5bf7c62d2bd1200722fc216f95dcdf152c e3ff4cc9bd0038b9c139a5e0385096957b339638 +f588d547cfc955fec521dd8d78ecc93c0e196cf3 6e2c0cccad2670f9fa469802190318c8de506415 +384317b9a4232a0df7c2950bfd718821615cf0c2 615666b34e3208724dbda301d33c461880843d70 +2f307dc5af8f8f9f93f8618c5216b12f9a73b81a c9752733b14d75046c32034d59eff43272a18b13 +7b50a80f413588fa7b39c777e507d7cc87ef284e 94f9472fd0c4b9a89d072f37cdd81c5ae5370a2e +65ffd5a5db3a39d7449ad04b5e811c719944ea78 d57597c3a10f7d2bdd285ff46a57c13032455fc9 +a1ac1a90dda50ad4522d58a692b7d38182b81248 8f840381ada3481335008fe82c6f95930a7caf76 +23aa79bd72afe47b304a58ab1059b8d882d74767 cf7444a23d179cb06813f0fac1d5c1731ccde305 +903688af107c5f9c4cf6263fb80ec733c4444c3d 8853ae84bdf7c565209a510bdeb495781e48fbc8 +09905c5d4a471783e05bd69741f58cda2f0bbd7f 67af7c8a570db6a2d2c9248aad6c69f134adb497 +28a470ad71d1a31e6c3c46e84207e471a3ea6020 2ac43e29c08ab54a7a2923c126164a997e331af8 +ff8a3a11ca26ba30ccee6c50d8c2bcf6fab724f0 c40c37b5d46c759b2f11992bbb414ee905e3d245 +fa565fbd994edbaad72d947f2517907c77e0ea89 e621f4c28dbb352b9f567c32565857f0f86bd07e +65e7feeef7fe73ff06e387d845a985471c930c1a a0a4ff52dcccb831729061c5e7153f24c7e76418 +6f9c26f707d72cb6d74277669b6ea4a15c192d68 fee586e78f33304675053841639ba85de054645e +0d7b0166e40c5f95c31972e9311c129615c7b1ee daae08036a5e84e31e775a0d3c4a87d9759cf8b0 +4fcb500a2aa588a47937500f32ecd3c9fb87ef59 3bd22a45d28138b026ed35e34a851e898a09bf07 +a8e57e05d9ed058d918a3ccceaba1814c5e56f81 9a1ec4eb469f4a91227eff08dc3e775f3411f3a0 +60e120f0e278713dfe1f7e7ad4724545c9d6990c 5acad4093229acf26af312e26a73cd1e4c65f788 +5ecd01fe91da59cce4c645a1365c9fd692fe9f9d c0ae3c411f4a2bb75166df6e6c284c117501f7ab +8af4dc094c80909917da5d2881a7a27e859ed9e0 06fb8916d2d7be6c52f1a3585540e340b447689c +8eab64c08f34c86372e7b514bcb86da534ae1beb 8c9d711a3e2d374bd1a65b6a41e9b0a852db9fed +6573a5a8a192b7f1bca527e6251ba6a33b99e9bd 8cf47d25d93bbc11bf86d70129aba84e015436d4 +020f85e2747dfb604b7a3a68b3b55bb2db53045b 39a3cdc698ddef8643eb489e088ca7b5361dd74f +849511cf6f1eaac930b841392598a6b0cb424844 dfb4659b960352065bf79bf1d1b958b36c8725e5 +553604c238ef656871da2e826f99a2b2387dbfd4 994d1a11f7e387cd079a3ae88a805c7f186a7728 +7d9e7588da4b2713ae9fe92a66d6cf4eb23a93bb 8d0115ef58ffbe94f9dd61b4459b64490254c90c +10e2a288304a10821d5179e413427b99e37c11e4 1cd0f032f262e27a4a5c82e1830b7d1e5934c4b5 +466948a7a6757783171fadadb5abedb160e3e649 835e6cbae7115acb825fc4f1edc7cc458ed96525 +dad8eed55bd0b981ed0a339139a0c73cd09b4ee4 39c249630afe0d5641da4f073ec87e6b506712ac +880096665e91644e46e578fcab87e7106a0774ae a93dc1c879efe08c5825a7fbd6ec5504d2285479 +7e16444d4f5efaef5837e92a16a28d6759716b7e 68c8448cb6602e37d77eb0a0aa8fe13996d64700 +ea8b903b110b16b1b5ca5e0a2ced7bf493d92a64 76a6f0bf5aef1a4272292cd5c623c4d3dcb8630c +4fec39876ab5fd680993215389bcd89e0474823d 51bd2fa52d837a905120b95316f424d95b6de85d +ca06291fd20689e803a19166c3b9c5dd6afb77ae 7a9df79c496686f5ea99aa8242e2a4b5f1ae7ca0 +1cb42a748ff4c67b70be557fb9ab6e48e1bb4c51 39ef85cb5945bd35b9148479d8337a154644d3e2 +7eeb068bc71a5d75043e1359290ddfd2b6ec6428 c09a5450bebba3c8841c6da3f575fc8a33993ee9 +c24608f25b3e2b1dabb659511117c475e7040d75 90f5b0301d613bc234faa4340746f8226e57e349 +cf0657b3d632793cb0725766ba7f7ba4a9d56d73 23031b5065fd603f31f175dad5d1f68ebe66465c +fdcada2a654a852e162c7cd05f4957b33cbc8ee2 dc73cdd6eb49c9584e5f1420a6a31036b2f93966 +4503d100f8de74ab5d82e69d99eb88a276c18b66 cb223ea24f72f9dbbe30a8e0f9a9238202ea24bf +cfe9cd208c53e35b54e5dcb3bbab70480e053f0a 5edf0b2d6e081da9cf0691ebd5ceed14308075ec +a174edc8c89bcf84fdefa91a74d55d874855c13d d6cbf8c6abf016ab652054460d2ec54ab2eee6f7 +5b7bc0c2f3238a2ba18db03500d5c6c2f35b0e9f 1a08649c45b58a66b6862e5a6349a22ac3baad92 +2a7ab1414551ef9b35fa94495a522bd031e1313f ccbcfe82c451165a37b2991c5c8db200a6c14f7b +aa159d98c8d7d89894bbed12b893bb8286df980c 416454f288976dae527bd278262996cff99f65d6 +90296aeccab8a4acc6428e34138ad6856034748a 1fc21a434ac4bd787ddc9c38d9f298564a106d4f +b953bf8192ce452f4d7fb73348307c89958457b2 f5679f1293197d5673a5d005a25303dea9dcba69 +46b1b76724579b86b4b3b098b12c135f875a3123 cd8f6a9c573aff38898049614bfb157510fd5c67 +2c12ed68531423f8f5160dd8370ece15b12ef6e1 b259df1ff62208b50042fdc614dd71ea3d4a3e1b +ef81822d8452633f5c0df4fe69a9a37b81b12306 42f02d7eb73a2b902ec6b440610a1309768ba8f2 +e9f0c71c026a1bee9a590eeec164cf22f6001712 8822fb96fda54e33a75f2e9f6ca799ef78790dee +4bb60687c0826bb52c53cceba3f0989fc0430218 6fb928d035faa3b6fbd87c4b181be5d9045597f1 +c885afa42b50c8aae7a77aa2855f11ce0dad816c 26852eb945c51ce9435e6fa03d8ba931a5c5b389 +858419c0784b8d7196c2be79672969726213b97e 41cd56a1ff85212573719b08828bd9e21e381d3a +02f63e300c52c70794da39e1cd4892d79a7e2277 aa8d23ec2c63d453bca02a9f096a64fbf4c99b9b +2d062ddad0209d881f2e02dd46770d039ef36a6c 590988fed11d328889202434762ec2558fb2e8a0 +a4e50af6dc20621bd9e4b1d922e8e3dba19b10af 4100ccf099c7eb967f23bbac547f6fb424d5593c +dcb7a730e8911953a29b70a611a1a55976036c87 b13d1d8dc224be84eedd234c00683d451fbd992e +3473a7b27a7e4691f57a10a36de783803ce89c10 b54de647be7828787b1e0d6527339fe7620b9efe +039fba4db247c021e18b080cf39d5448023240f7 69effa42fb5101007364c3aa92be9976864fe399 +864b803a21e8d05bcf8769fa4515e2be625e08fc da63507e9eadceda53a19f134f83e198bfc788b4 +75d6f66ba26c1883d20ffd8d2a5fcf7c30b56987 32f69511735924378e079e8cbce95853d55218ca +323b74e803cfad1b0d4dcb752cb871cb359c783c 8f6fabd3519a99876358fec217a3981167ff2c48 +09b8c9f75f5a0e12d732ac2263c78be3ce8d1a67 675a14d18f75d3f7a75871ffd4ac7709db12ccc1 +06a3255dd5634406ddff42bc8e4dfcf88aa99147 70f6d5bd211c7818626c0b1b7469c5253fc61229 +9d248f7841180144b6c59483d165f2e220d85266 8aa27a2f5a943f876a17c69d9b9abfe07ffd23d5 +806f968dd79658f10b62629fe10dce5fd063c4df 6b7e58b232ea33ce3eba0cb359495f6552c09ef7 +6dfa525cc4df8d1bf209bf766ec4b592edb71aab add69d9d4892fffda7d908dfab4b7b6be756a51b +4797a1ddab66b83c4a06e43d2ab646743590572e e20e4cfb58054352cd9f5ca27cff39a7865f827d +9e539c23fdef67d6106c17f06cb89c66383a1552 97eb5f91ff238fcdf0630683ff87c39412789275 +6c519ce9907281cadd261ebcd9d9824acb76c26c 6529d7953b09cc9b27a312d7af79c2c85a04e354 +e6fe3e4822450f4bacc95696ca999afd5ffc7c2d 7474a1f7dadbcfdf87eedbf12c109141776191b4 +661e085a077a2cd9545c70d6321189c4e1935395 c189de52738974a12f0408333d7d3775f8bb49e7 +d8fb90bcaee5bebd9b894cfe97aa8f32f1277fb8 7dc5c9299f8bb9972000b8d10b73e3c40502e788 +7f5e4d3ea40b1fe2cd65c3d08341b76464591b51 2de1d5b61694c2a065632fcc48b6d4ca9c02a4d0 +77d5a678e9a4138a93cbbcbafa95a2638d3f0970 c6c03f447890ec203ff59420c4fe029bb1d22f18 +290dee064c1878668b25bb465ba90b36122eeef8 4076fa8d9101f0276bb2ff92253229baf7c370f3 +cc79d68db784d2953301c75ff40e649b67caf326 5ea3600258e631ea5cf492510495f5f08c5b163f +96466504c293eab0753c9759ebc32410f54e38d6 6047d55343eea2927520f12293f7974bf8942a40 +0f866e8f6c90498eff4adc64cba52b33589e5459 d0cf303414d1ad9e3d6194ebb3d241fe32302c2c +7f5967793458bb7cc3fe2759bfb8cc83bcd40e68 2153613214e476a6747d170fec90ef6c06a35cfc +91e67e85420bd86b5e4cca72879755203c0614d0 8b2f7563400f8b8bbac0dfac18f6fd796d6157ce +107fe46e77b1cbceee0550d5de89e9ef9e2f7789 9a554c894296e42a0dd6ffa86f4ada032d54353a +ffbf120ea16d2754f5a0bcd997e4ad6c35d192ac 3cab9256a1f1c1ff2a768bfb99a8e0ca763d384b +6de333be7616cc46e61491270e75cef4da52c70b d6b7d08f715f205cb38f767905f483a5609c6225 +cb89b8a70c46c53b70fef93dc699640f5368d0eb c95a8641fbc8e87f9fec17703b5101841909797b +7df432f17574663ce7229ff3698d89de54f60bc0 e00653516de339059991c3248c4402f236f096fe +2e2891df6476e64c705be28778a2ddb86c178518 b99723b3d0819d525c2b656bdb48754e21671a19 +f5894a9c0eb0112d7ecf765b7243052df8f73f5c 6dd0381a578564c5fb7d5a5c214737cf932cf243 +e8c58b6655a52762a07adc950ca3b9976650f864 bb94cf81b3edc23a49616b1b7110be3353051ee4 +2e645246e4708ddf6039c4e469b3f3cf40c4ae7e a377dd0842d72dfe90f43109e192a31bb6318fb0 +5e9baf57e6a36891a43a1d647f209fdb14d16587 8bbf44d6314f37560922c7c6d2b67b59d5d1b496 +53666a605f9b8f1f266a9bf3bd38664542f8e63a 6cd2f6bdac93b3205ceb2e0443ba354b4fc1f63f +5ff52235796997bcf1d79ee04d3973e3e3a9a355 e376d6b35ac92cbcf30c742fca298e55899ab137 +e7fd284735a7a5eda25467017d9083e4edfe7edf be1ab370e57e7c544b7b9fdc567cd51ae74bfbbf +da3545be15a096c18f6eb3f5b5ab43c69cbc0690 7c5e45780b196a042c1ac56c6c39ba37fdd140e3 +a986554af6a67340bd25fa3fca0848d07745ed2f c5a8e611aaaa8ea792192a58085aad098fe65448 +fe4076c7c05ac31d239a3304a8e7afd8c09b3289 10dc6474871cf59eec6128e2f1cc6d2d6fc45ce1 +b887a4a41dabcb0d5cd46c33bfa992519a3c52bc bc657a3304da0afab91fd9723be78f9fc14f2b01 +4fd00b3d25604d6b5746f9dae0db78ceecc8a4a9 f3d29f365ae4fbbe6082aaf636aa463bdefd769d +ad14aa1d94a92e570d4e2d28b5a174488ee6ac83 2a17e7293c6819adfbd65d7a918321c90f6630cf +5c6de8c98f366336b612ea1fae299cf8ac6a3458 957c8d5dce7238673db0ac6f7693e4372a7d199b +6fd7200401f02e63f110c08c7ee8c47f1e624650 43165cedd36f0df30bd0ce34cdc8938dfc791562 +e4e1ffa7c08d80a53f977d66be18b49aa796700f 0276c9cd2202c63cfc9cd78449c98729b22c5cab +3f6da1c3b36eec3504cf646b44d63ab69b4552a3 441ae273be41239b63198e5b7de98c5bdd498d15 +572fc7ad1b854e0743e39b5487a378733acd6275 b9279f8d94cfceaecb1137de098c0816299d17f7 +685e4d07438a09b2d494378a7660e3d0fbe7c51c 28ecbea20bad3dcf671c368cde6fe0090d2c0f9b +0b0e3c1d3c6f6b4d941d6ddb2683a1bcf01ceaf8 69463ad570a0a69879d8bf613ea8c4a36b610c15 +d1ec40d311c7c0d21ce0199959a5c4a7016fb389 bb93876525916e7116b54e7af23334c1e1b62e29 +1afbd58ce07c1e59100c20dec3238878a07c8128 f10444f1a5fb3b19d4e6b353ce7e2251d5387a56 +2fe42b058aa75a6a5157500b906859146e689c4d b8e5b1ba6ac6182a5efd283eb62e3d3846e3cfa1 +0f6fc32adcf2154532970e7277f45267891ed321 1825eb47fbfd270c1b25f62c90c58ed8e485cfc5 +cb5b63acba38dbf3f38b8826aca7aded0b3d2d4d 64ea46825b6e1ae4d28b191e5e4c13260c2f1586 +5bb9f8487e2e804352c21484839b65a57c2dff7a ba4bdedaa46844de1d30a6674f22538048fa329a +cd66ed79630f512fe005e8ada37bfcc1e00d53a1 7dae50aeadebd52c51222f7c6d15ea85e46ef119 +cd66ed79630f512fe005e8ada37bfcc1e00d53a1 10206014e497abfeec9cd22327d715f16ec0c5f4 |