diff options
Diffstat (limited to 'indra')
702 files changed, 16332 insertions, 8088 deletions
diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 8d4969a49e..d01e1869b6 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -22,7 +22,10 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(Variables) if (DARWIN) - cmake_minimum_required(VERSION 2.6.2 FATAL_ERROR) + # 2.6.4 fixes a Mac bug in get_target_property(... "SLPlugin" LOCATION): + # before that version it returns "pathname/SLPlugin", whereas the correct + # answer is "pathname/SLPlugin.app/Contents/MacOS/SLPlugin". + cmake_minimum_required(VERSION 2.6.4 FATAL_ERROR) endif (DARWIN) if (NOT CMAKE_BUILD_TYPE) diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 8b0864a539..40a04e72f7 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -38,10 +38,10 @@ if (WINDOWS) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi /MDd /MP" CACHE STRING "C++ compiler debug options" FORCE) set(CMAKE_CXX_FLAGS_RELWITHDEBINFO - "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /Gm" + "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od /Zi /MD /MP /Ob2" CACHE STRING "C++ compiler release-with-debug options" FORCE) set(CMAKE_CXX_FLAGS_RELEASE - "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP" + "${CMAKE_CXX_FLAGS_RELEASE} ${LL_CXX_FLAGS} /O2 /Zi /MD /MP /Gm /Ob2" CACHE STRING "C++ compiler release options" FORCE) set(CMAKE_CXX_STANDARD_LIBRARIES "") diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake index 79c3bb7da2..29e2492551 100644 --- a/indra/cmake/LLAddBuildTest.cmake +++ b/indra/cmake/LLAddBuildTest.cmake @@ -1,265 +1,273 @@ -# -*- cmake -*- -include(LLTestCommand) -include(GoogleMock) - -MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources) - # Given a project name and a list of sourcefiles (with optional properties on each), - # add targets to build and run the tests specified. - # ASSUMPTIONS: - # * this macro is being executed in the project file that is passed in - # * current working SOURCE dir is that project dir - # * there is a subfolder tests/ with test code corresponding to the filenames passed in - # * properties for each sourcefile passed in indicate what libs to link that file with (MAKE NO ASSUMPTIONS ASIDE FROM TUT) - # - # More info and examples at: https://wiki.secondlife.com/wiki/How_to_add_unit_tests_to_indra_code - # - # WARNING: do NOT modify this code without working with poppy - - # there is another branch that will conflict heavily with any changes here. -INCLUDE(GoogleMock) - - - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}") - ENDIF(LL_TEST_VERBOSE) - - # Start with the header and project-wide setup before making targets - #project(UNITTEST_PROJECT_${project}) - # Setup includes, paths, etc - SET(alltest_SOURCE_FILES - ${CMAKE_SOURCE_DIR}/test/test.cpp - ${CMAKE_SOURCE_DIR}/test/lltut.cpp - ) - SET(alltest_DEP_TARGETS - # needed by the test harness itself - ${APRUTIL_LIBRARIES} - ${APR_LIBRARIES} - llcommon - ) - IF(NOT "${project}" STREQUAL "llmath") - # add llmath as a dep unless the tested module *is* llmath! - LIST(APPEND alltest_DEP_TARGETS - llmath - ) - ENDIF(NOT "${project}" STREQUAL "llmath") - SET(alltest_INCLUDE_DIRS - ${LLMATH_INCLUDE_DIRS} - ${LLCOMMON_INCLUDE_DIRS} - ${LIBS_OPEN_DIR}/test - ${GOOGLEMOCK_INCLUDE_DIRS} - ) - SET(alltest_LIBRARIES - ${GOOGLEMOCK_LIBRARIES} - ${PTHREAD_LIBRARY} - ${WINDOWS_LIBRARIES} - ) - # Headers, for convenience in targets. - SET(alltest_HEADER_FILES - ${CMAKE_SOURCE_DIR}/test/test.h - ) - - # Use the default flags - if (LINUX) - SET(CMAKE_EXE_LINKER_FLAGS "") - endif (LINUX) - - # start the source test executable definitions - SET(${project}_TEST_OUTPUT "") - FOREACH (source ${sources}) - STRING( REGEX REPLACE "(.*)\\.[^.]+$" "\\1" name ${source} ) - STRING( REGEX REPLACE ".*\\.([^.]+)$" "\\1" extension ${source} ) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})") - ENDIF(LL_TEST_VERBOSE) - - # - # Per-codefile additional / external source, header, and include dir property extraction - # - # Source - GET_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES) - IF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND) - SET(${name}_test_additional_SOURCE_FILES "") - ENDIF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND) - SET(${name}_test_SOURCE_FILES ${source} tests/${name}_test.${extension} ${alltest_SOURCE_FILES} ${${name}_test_additional_SOURCE_FILES} ) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}") - ENDIF(LL_TEST_VERBOSE) - # Headers - GET_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES) - IF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND) - SET(${name}_test_additional_HEADER_FILES "") - ENDIF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND) - SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES}) - set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) - LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES}) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}") - ENDIF(LL_TEST_VERBOSE) - # Include dirs - GET_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS) - IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) - SET(${name}_test_additional_INCLUDE_DIRS "") - ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND) - INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS ) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}") - ENDIF(LL_TEST_VERBOSE) - - - # Setup target - ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES}) - SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}") - - # - # Per-codefile additional / external project dep and lib dep property extraction - # - # WARNING: it's REALLY IMPORTANT to not mix these. I guarantee it will not work in the future. + poppy 2009-04-19 - # Projects - GET_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS) - IF(${name}_test_additional_PROJECTS MATCHES NOTFOUND) - SET(${name}_test_additional_PROJECTS "") - ENDIF(${name}_test_additional_PROJECTS MATCHES NOTFOUND) - # Libraries - GET_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES) - IF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND) - SET(${name}_test_additional_LIBRARIES "") - ENDIF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND) - IF(LL_TEST_VERBOSE) - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}") - MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}") - ENDIF(LL_TEST_VERBOSE) - # Add to project - TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} ) - - # - # Setup test targets - # - GET_TARGET_PROPERTY(TEST_EXE PROJECT_${project}_TEST_${name} LOCATION) - SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt) - SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR}) - - # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19 - IF(LL_TEST_VERBOSE) - MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}") - ENDIF(LL_TEST_VERBOSE) - - SET_TEST_PATH(LD_LIBRARY_PATH) - LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD}) - IF(LL_TEST_VERBOSE) - MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}") - ENDIF(LL_TEST_VERBOSE) - # Add test - ADD_CUSTOM_COMMAND( - OUTPUT ${TEST_OUTPUT} - COMMAND ${TEST_SCRIPT_CMD} - DEPENDS PROJECT_${project}_TEST_${name} - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - # Why not add custom target and add POST_BUILD command? - # Slightly less uncertain behavior - # (OUTPUT commands run non-deterministically AFAIK) + poppy 2009-04-19 - # > I did not use a post build step as I could not make it notify of a - # > failure after the first time you build and fail a test. - daveh 2009-04-20 - LIST(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT}) - ENDFOREACH (source) - - # Add the test runner target per-project - # (replaces old _test_ok targets all over the place) - ADD_CUSTOM_TARGET(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT}) - ADD_DEPENDENCIES(${project} ${project}_tests) -ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS) - -FUNCTION(LL_ADD_INTEGRATION_TEST - testname - additional_source_files - library_dependencies -# variable args - ) - if(TEST_DEBUG) - message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on") - endif(TEST_DEBUG) - - SET(source_files - tests/${testname}_test.cpp - ${CMAKE_SOURCE_DIR}/test/test.cpp - ${CMAKE_SOURCE_DIR}/test/lltut.cpp - ${additional_source_files} - ) - - SET(libraries - ${library_dependencies} - ${GOOGLEMOCK_LIBRARIES} - ${PTHREAD_LIBRARY} - ) - - # Add test executable build target - if(TEST_DEBUG) - message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})") - endif(TEST_DEBUG) - ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files}) - SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}") - - # Add link deps to the executable - if(TEST_DEBUG) - message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})") - endif(TEST_DEBUG) - TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries}) - - # Create the test running command - SET(test_command ${ARGN}) - GET_TARGET_PROPERTY(TEST_EXE INTEGRATION_TEST_${testname} LOCATION) - LIST(FIND test_command "{}" test_exe_pos) - IF(test_exe_pos LESS 0) - # The {} marker means "the full pathname of the test executable." - # test_exe_pos -1 means we didn't find it -- so append the test executable - # name to $ARGN, the variable part of the arg list. This is convenient - # shorthand for both straightforward execution of the test program (empty - # $ARGN) and for running a "wrapper" program of some kind accepting the - # pathname of the test program as the last of its args. You need specify - # {} only if the test program's pathname isn't the last argument in the - # desired command line. - LIST(APPEND test_command "${TEST_EXE}") - ELSE (test_exe_pos LESS 0) - # Found {} marker at test_exe_pos. Remove the {}... - LIST(REMOVE_AT test_command test_exe_pos) - # ...and replace it with the actual name of the test executable. - LIST(INSERT test_command test_exe_pos "${TEST_EXE}") - ENDIF (test_exe_pos LESS 0) - - SET_TEST_PATH(LD_LIBRARY_PATH) - LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command}) - - if(TEST_DEBUG) - message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}") - endif(TEST_DEBUG) - - ADD_CUSTOM_COMMAND( - TARGET INTEGRATION_TEST_${testname} - POST_BUILD - COMMAND ${TEST_SCRIPT_CMD} - ) - - # Use CTEST? Not sure how to yet... - # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD}) - -ENDFUNCTION(LL_ADD_INTEGRATION_TEST) - -MACRO(SET_TEST_PATH LISTVAR) - IF(WINDOWS) - # We typically build/package only Release variants of third-party - # libraries, so append the Release staging dir in case the library being - # sought doesn't have a debug variant. - set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release) - ELSEIF(DARWIN) - # We typically build/package only Release variants of third-party - # libraries, so append the Release staging dir in case the library being - # sought doesn't have a debug variant. - 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. - 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) +# -*- cmake -*-
+include(LLTestCommand)
+include(GoogleMock)
+
+MACRO(LL_ADD_PROJECT_UNIT_TESTS project sources)
+ # Given a project name and a list of sourcefiles (with optional properties on each),
+ # add targets to build and run the tests specified.
+ # ASSUMPTIONS:
+ # * this macro is being executed in the project file that is passed in
+ # * current working SOURCE dir is that project dir
+ # * there is a subfolder tests/ with test code corresponding to the filenames passed in
+ # * properties for each sourcefile passed in indicate what libs to link that file with (MAKE NO ASSUMPTIONS ASIDE FROM TUT)
+ #
+ # More info and examples at: https://wiki.secondlife.com/wiki/How_to_add_unit_tests_to_indra_code
+ #
+ # WARNING: do NOT modify this code without working with poppy -
+ # there is another branch that will conflict heavily with any changes here.
+INCLUDE(GoogleMock)
+
+
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} sources: ${sources}")
+ ENDIF(LL_TEST_VERBOSE)
+
+ # Start with the header and project-wide setup before making targets
+ #project(UNITTEST_PROJECT_${project})
+ # Setup includes, paths, etc
+ SET(alltest_SOURCE_FILES
+ ${CMAKE_SOURCE_DIR}/test/test.cpp
+ ${CMAKE_SOURCE_DIR}/test/lltut.cpp
+ )
+ SET(alltest_DEP_TARGETS
+ # needed by the test harness itself
+ ${APRUTIL_LIBRARIES}
+ ${APR_LIBRARIES}
+ llcommon
+ )
+ IF(NOT "${project}" STREQUAL "llmath")
+ # add llmath as a dep unless the tested module *is* llmath!
+ LIST(APPEND alltest_DEP_TARGETS
+ llmath
+ )
+ ENDIF(NOT "${project}" STREQUAL "llmath")
+ SET(alltest_INCLUDE_DIRS
+ ${LLMATH_INCLUDE_DIRS}
+ ${LLCOMMON_INCLUDE_DIRS}
+ ${LIBS_OPEN_DIR}/test
+ ${GOOGLEMOCK_INCLUDE_DIRS}
+ )
+ SET(alltest_LIBRARIES
+ ${GOOGLEMOCK_LIBRARIES}
+ ${PTHREAD_LIBRARY}
+ ${WINDOWS_LIBRARIES}
+ )
+ # Headers, for convenience in targets.
+ SET(alltest_HEADER_FILES
+ ${CMAKE_SOURCE_DIR}/test/test.h
+ )
+
+ # Use the default flags
+ if (LINUX)
+ SET(CMAKE_EXE_LINKER_FLAGS "")
+ endif (LINUX)
+
+ # start the source test executable definitions
+ SET(${project}_TEST_OUTPUT "")
+ FOREACH (source ${sources})
+ STRING( REGEX REPLACE "(.*)\\.[^.]+$" "\\1" name ${source} )
+ STRING( REGEX REPLACE ".*\\.([^.]+)$" "\\1" extension ${source} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS UNITTEST_PROJECT_${project} individual source: ${source} (${name}.${extension})")
+ ENDIF(LL_TEST_VERBOSE)
+
+ #
+ # Per-codefile additional / external source, header, and include dir property extraction
+ #
+ # Source
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_SOURCE_FILES ${source} LL_TEST_ADDITIONAL_SOURCE_FILES)
+ IF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
+ SET(${name}_test_additional_SOURCE_FILES "")
+ ENDIF(${name}_test_additional_SOURCE_FILES MATCHES NOTFOUND)
+ SET(${name}_test_SOURCE_FILES ${source} tests/${name}_test.${extension} ${alltest_SOURCE_FILES} ${${name}_test_additional_SOURCE_FILES} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_SOURCE_FILES ${${name}_test_SOURCE_FILES}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Headers
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_HEADER_FILES ${source} LL_TEST_ADDITIONAL_HEADER_FILES)
+ IF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
+ SET(${name}_test_additional_HEADER_FILES "")
+ ENDIF(${name}_test_additional_HEADER_FILES MATCHES NOTFOUND)
+ SET(${name}_test_HEADER_FILES ${name}.h ${${name}_test_additional_HEADER_FILES})
+ set_source_files_properties(${${name}_test_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE)
+ LIST(APPEND ${name}_test_SOURCE_FILES ${${name}_test_HEADER_FILES})
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_HEADER_FILES ${${name}_test_HEADER_FILES}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Include dirs
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_INCLUDE_DIRS ${source} LL_TEST_ADDITIONAL_INCLUDE_DIRS)
+ IF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
+ SET(${name}_test_additional_INCLUDE_DIRS "")
+ ENDIF(${name}_test_additional_INCLUDE_DIRS MATCHES NOTFOUND)
+ INCLUDE_DIRECTORIES(${alltest_INCLUDE_DIRS} ${name}_test_additional_INCLUDE_DIRS )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_INCLUDE_DIRS ${${name}_test_additional_INCLUDE_DIRS}")
+ ENDIF(LL_TEST_VERBOSE)
+
+
+ # Setup target
+ ADD_EXECUTABLE(PROJECT_${project}_TEST_${name} ${${name}_test_SOURCE_FILES})
+ SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+
+ #
+ # Per-codefile additional / external project dep and lib dep property extraction
+ #
+ # WARNING: it's REALLY IMPORTANT to not mix these. I guarantee it will not work in the future. + poppy 2009-04-19
+ # Projects
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_PROJECTS ${source} LL_TEST_ADDITIONAL_PROJECTS)
+ IF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
+ SET(${name}_test_additional_PROJECTS "")
+ ENDIF(${name}_test_additional_PROJECTS MATCHES NOTFOUND)
+ # Libraries
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_LIBRARIES ${source} LL_TEST_ADDITIONAL_LIBRARIES)
+ IF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
+ SET(${name}_test_additional_LIBRARIES "")
+ ENDIF(${name}_test_additional_LIBRARIES MATCHES NOTFOUND)
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_PROJECTS ${${name}_test_additional_PROJECTS}")
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_LIBRARIES ${${name}_test_additional_LIBRARIES}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Add to project
+ TARGET_LINK_LIBRARIES(PROJECT_${project}_TEST_${name} ${alltest_LIBRARIES} ${alltest_DEP_TARGETS} ${${name}_test_additional_PROJECTS} ${${name}_test_additional_LIBRARIES} )
+ # Compile-time Definitions
+ GET_SOURCE_FILE_PROPERTY(${name}_test_additional_CFLAGS ${source} LL_TEST_ADDITIONAL_CFLAGS)
+ IF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
+ SET_TARGET_PROPERTIES(PROJECT_${project}_TEST_${name} PROPERTIES COMPILE_FLAGS ${${name}_test_additional_CFLAGS} )
+ IF(LL_TEST_VERBOSE)
+ MESSAGE("LL_ADD_PROJECT_UNIT_TESTS ${name}_test_additional_CFLAGS ${${name}_test_additional_CFLAGS}")
+ ENDIF(LL_TEST_VERBOSE)
+ ENDIF(NOT ${name}_test_additional_CFLAGS MATCHES NOTFOUND)
+
+ #
+ # Setup test targets
+ #
+ GET_TARGET_PROPERTY(TEST_EXE PROJECT_${project}_TEST_${name} LOCATION)
+ SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt)
+ SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR})
+
+ # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19
+ IF(LL_TEST_VERBOSE)
+ MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}")
+ ENDIF(LL_TEST_VERBOSE)
+
+ SET_TEST_PATH(LD_LIBRARY_PATH)
+ LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD})
+ IF(LL_TEST_VERBOSE)
+ MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}")
+ ENDIF(LL_TEST_VERBOSE)
+ # Add test
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${TEST_OUTPUT}
+ COMMAND ${TEST_SCRIPT_CMD}
+ DEPENDS PROJECT_${project}_TEST_${name}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ )
+ # Why not add custom target and add POST_BUILD command?
+ # Slightly less uncertain behavior
+ # (OUTPUT commands run non-deterministically AFAIK) + poppy 2009-04-19
+ # > I did not use a post build step as I could not make it notify of a
+ # > failure after the first time you build and fail a test. - daveh 2009-04-20
+ LIST(APPEND ${project}_TEST_OUTPUT ${TEST_OUTPUT})
+ ENDFOREACH (source)
+
+ # Add the test runner target per-project
+ # (replaces old _test_ok targets all over the place)
+ ADD_CUSTOM_TARGET(${project}_tests ALL DEPENDS ${${project}_TEST_OUTPUT})
+ ADD_DEPENDENCIES(${project} ${project}_tests)
+ENDMACRO(LL_ADD_PROJECT_UNIT_TESTS)
+
+FUNCTION(LL_ADD_INTEGRATION_TEST
+ testname
+ additional_source_files
+ library_dependencies
+# variable args
+ )
+ if(TEST_DEBUG)
+ message(STATUS "Adding INTEGRATION_TEST_${testname} - debug output is on")
+ endif(TEST_DEBUG)
+
+ SET(source_files
+ tests/${testname}_test.cpp
+ ${CMAKE_SOURCE_DIR}/test/test.cpp
+ ${CMAKE_SOURCE_DIR}/test/lltut.cpp
+ ${additional_source_files}
+ )
+
+ SET(libraries
+ ${library_dependencies}
+ ${GOOGLEMOCK_LIBRARIES}
+ ${PTHREAD_LIBRARY}
+ )
+
+ # Add test executable build target
+ if(TEST_DEBUG)
+ message(STATUS "ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})")
+ endif(TEST_DEBUG)
+ ADD_EXECUTABLE(INTEGRATION_TEST_${testname} ${source_files})
+ SET_TARGET_PROPERTIES(INTEGRATION_TEST_${testname} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${EXE_STAGING_DIR}")
+
+ # Add link deps to the executable
+ if(TEST_DEBUG)
+ message(STATUS "TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})")
+ endif(TEST_DEBUG)
+ TARGET_LINK_LIBRARIES(INTEGRATION_TEST_${testname} ${libraries})
+
+ # Create the test running command
+ SET(test_command ${ARGN})
+ GET_TARGET_PROPERTY(TEST_EXE INTEGRATION_TEST_${testname} LOCATION)
+ LIST(FIND test_command "{}" test_exe_pos)
+ IF(test_exe_pos LESS 0)
+ # The {} marker means "the full pathname of the test executable."
+ # test_exe_pos -1 means we didn't find it -- so append the test executable
+ # name to $ARGN, the variable part of the arg list. This is convenient
+ # shorthand for both straightforward execution of the test program (empty
+ # $ARGN) and for running a "wrapper" program of some kind accepting the
+ # pathname of the test program as the last of its args. You need specify
+ # {} only if the test program's pathname isn't the last argument in the
+ # desired command line.
+ LIST(APPEND test_command "${TEST_EXE}")
+ ELSE (test_exe_pos LESS 0)
+ # Found {} marker at test_exe_pos. Remove the {}...
+ LIST(REMOVE_AT test_command test_exe_pos)
+ # ...and replace it with the actual name of the test executable.
+ LIST(INSERT test_command test_exe_pos "${TEST_EXE}")
+ ENDIF (test_exe_pos LESS 0)
+
+ SET_TEST_PATH(LD_LIBRARY_PATH)
+ LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command})
+
+ if(TEST_DEBUG)
+ message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}")
+ endif(TEST_DEBUG)
+
+ ADD_CUSTOM_COMMAND(
+ TARGET INTEGRATION_TEST_${testname}
+ POST_BUILD
+ COMMAND ${TEST_SCRIPT_CMD}
+ )
+
+ # Use CTEST? Not sure how to yet...
+ # ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
+
+ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
+
+MACRO(SET_TEST_PATH LISTVAR)
+ IF(WINDOWS)
+ # We typically build/package only Release variants of third-party
+ # libraries, so append the Release staging dir in case the library being
+ # sought doesn't have a debug variant.
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release)
+ ELSEIF(DARWIN)
+ # We typically build/package only Release variants of third-party
+ # libraries, so append the Release staging dir in case the library being
+ # sought doesn't have a debug variant.
+ 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.
+ 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/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..c43e235f20 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 + 0441fea513458ade4b81607acf481692 + ${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/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/integration_tests/llui_libtest/llui_libtest.cpp b/indra/integration_tests/llui_libtest/llui_libtest.cpp index 1f15b73182..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) { diff --git a/indra/linux_updater/linux_updater.cpp b/indra/linux_updater/linux_updater.cpp index be4d810860..d909516bf8 100644 --- a/indra/linux_updater/linux_updater.cpp +++ b/indra/linux_updater/linux_updater.cpp @@ -49,6 +49,7 @@ const guint ROTATE_IMAGE_TIMEOUT = 8000; typedef struct _updater_app_state { std::string app_name; std::string url; + std::string file; std::string image_dir; std::string dest_dir; std::string strings_dirs; @@ -113,7 +114,7 @@ BOOL install_package(std::string package_file, std::string destination); BOOL spawn_viewer(UpdaterAppState *app_state); extern "C" { - void on_window_closed(GtkWidget *sender, gpointer state); + void on_window_closed(GtkWidget *sender, GdkEvent *event, gpointer state); gpointer worker_thread_cb(gpointer *data); int download_progress_cb(gpointer data, double t, double d, double utotal, double ulnow); gboolean rotate_image_cb(gpointer data); @@ -216,11 +217,11 @@ 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; } -void on_window_closed(GtkWidget *sender, gpointer data) +void on_window_closed(GtkWidget *sender, GdkEvent* event, gpointer data) { UpdaterAppState *app_state; @@ -266,85 +267,95 @@ gpointer worker_thread_cb(gpointer data) CURLcode result; FILE *package_file; GError *error = NULL; - char *tmp_filename = NULL; int fd; //g_return_val_if_fail (data != NULL, NULL); app_state = (UpdaterAppState *) data; try { - // create temporary file to store the package. - fd = g_file_open_tmp - ("secondlife-update-XXXXXX", &tmp_filename, &error); - if (error != NULL) - { - llerrs << "Unable to create temporary file: " - << error->message - << llendl; - - g_error_free(error); - throw 0; - } - package_file = fdopen(fd, "wb"); - if (package_file == NULL) + if(!app_state->url.empty()) { - llerrs << "Failed to create temporary file: " - << tmp_filename - << llendl; + char* tmp_local_filename = NULL; + // create temporary file to store the package. + fd = g_file_open_tmp + ("secondlife-update-XXXXXX", &tmp_local_filename, &error); + if (error != NULL) + { + llerrs << "Unable to create temporary file: " + << error->message + << llendl; - gdk_threads_enter(); - display_error(app_state->window, - LLTrans::getString("UpdaterFailDownloadTitle"), - LLTrans::getString("UpdaterFailUpdateDescriptive")); - gdk_threads_leave(); - throw 0; - } + g_error_free(error); + throw 0; + } + + if(tmp_local_filename != NULL) + { + app_state->file = tmp_local_filename; + g_free(tmp_local_filename); + } - // initialize curl and start downloading the package - llinfos << "Downloading package: " << app_state->url << llendl; + package_file = fdopen(fd, "wb"); + if (package_file == NULL) + { + llerrs << "Failed to create temporary file: " + << app_state->file.c_str() + << llendl; + + gdk_threads_enter(); + display_error(app_state->window, + LLTrans::getString("UpdaterFailDownloadTitle"), + LLTrans::getString("UpdaterFailUpdateDescriptive")); + gdk_threads_leave(); + throw 0; + } - curl = curl_easy_init(); - if (curl == NULL) - { - llerrs << "Failed to initialize libcurl" << llendl; + // initialize curl and start downloading the package + llinfos << "Downloading package: " << app_state->url << llendl; - gdk_threads_enter(); - display_error(app_state->window, - LLTrans::getString("UpdaterFailDownloadTitle"), - LLTrans::getString("UpdaterFailUpdateDescriptive")); - gdk_threads_leave(); - throw 0; - } + curl = curl_easy_init(); + if (curl == NULL) + { + llerrs << "Failed to initialize libcurl" << llendl; + + gdk_threads_enter(); + display_error(app_state->window, + LLTrans::getString("UpdaterFailDownloadTitle"), + LLTrans::getString("UpdaterFailUpdateDescriptive")); + gdk_threads_leave(); + throw 0; + } - curl_easy_setopt(curl, CURLOPT_URL, app_state->url.c_str()); - curl_easy_setopt(curl, CURLOPT_NOSIGNAL, TRUE); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, package_file); - curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); - curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, - &download_progress_cb); - curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, app_state); + curl_easy_setopt(curl, CURLOPT_URL, app_state->url.c_str()); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, TRUE); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, package_file); + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, FALSE); + curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, + &download_progress_cb); + curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, app_state); - result = curl_easy_perform(curl); - fclose(package_file); - curl_easy_cleanup(curl); + result = curl_easy_perform(curl); + fclose(package_file); + curl_easy_cleanup(curl); - if (result) - { - llerrs << "Failed to download update: " - << app_state->url - << llendl; + if (result) + { + llerrs << "Failed to download update: " + << app_state->url + << llendl; - gdk_threads_enter(); - display_error(app_state->window, - LLTrans::getString("UpdaterFailDownloadTitle"), - LLTrans::getString("UpdaterFailUpdateDescriptive")); - gdk_threads_leave(); + gdk_threads_enter(); + display_error(app_state->window, + LLTrans::getString("UpdaterFailDownloadTitle"), + LLTrans::getString("UpdaterFailUpdateDescriptive")); + gdk_threads_leave(); - throw 0; + throw 0; + } } - + // now pulse the progres bar back and forth while the package is // being unpacked gdk_threads_enter(); @@ -357,7 +368,7 @@ gpointer worker_thread_cb(gpointer data) // *TODO: if the destination is not writable, terminate this // thread and show file chooser? - if (!install_package(tmp_filename, app_state->dest_dir)) + if (!install_package(app_state->file.c_str(), app_state->dest_dir)) { llwarns << "Failed to install package to destination: " << app_state->dest_dir @@ -392,15 +403,6 @@ gpointer worker_thread_cb(gpointer data) app_state->failure = TRUE; } - // FIXME: delete package file also if delete-event is raised on window - if (tmp_filename != NULL) - { - if (gDirUtilp->fileExists(tmp_filename)) - { - LLFile::remove(tmp_filename); - } - } - gdk_threads_enter(); updater_app_quit(app_state); gdk_threads_leave(); @@ -712,7 +714,7 @@ BOOL spawn_viewer(UpdaterAppState *app_state) void show_usage_and_exit() { - std::cout << "Usage: linux-updater --url URL --name NAME --dest PATH --stringsdir PATH1,PATH2 --stringsfile FILE" + std::cout << "Usage: linux-updater <--url URL | --file FILE> --name NAME --dest PATH --stringsdir PATH1,PATH2 --stringsfile FILE" << "[--image-dir PATH]" << std::endl; exit(1); @@ -728,6 +730,10 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state) { app_state->url = argv[i]; } + else if ((!strcmp(argv[i], "--file")) && (++i < argc)) + { + app_state->file = argv[i]; + } else if ((!strcmp(argv[i], "--name")) && (++i < argc)) { app_state->app_name = argv[i]; @@ -756,7 +762,7 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state) } if (app_state->app_name.empty() - || app_state->url.empty() + || (app_state->url.empty() && app_state->file.empty()) || app_state->dest_dir.empty()) { show_usage_and_exit(); @@ -771,10 +777,10 @@ void parse_args_and_init(int argc, char **argv, UpdaterAppState *app_state) int main(int argc, char **argv) { - UpdaterAppState app_state; + UpdaterAppState* app_state = new UpdaterAppState; GThread *worker_thread; - parse_args_and_init(argc, argv, &app_state); + parse_args_and_init(argc, argv, app_state); // Initialize logger, and rename old log file gDirUtilp->initAppDirs("SecondLife"); @@ -797,17 +803,29 @@ int main(int argc, char **argv) gtk_init(&argc, &argv); // create UI - updater_app_ui_init(&app_state); + updater_app_ui_init(app_state); //llinfos << "SAMPLE TRANSLATION IS: " << LLTrans::getString("LoginInProgress") << llendl; // create download thread worker_thread = g_thread_create - (GThreadFunc(worker_thread_cb), &app_state, FALSE, NULL); + (GThreadFunc(worker_thread_cb), app_state, FALSE, NULL); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); - return (app_state.failure == FALSE) ? 0 : 1; + // Delete the file only if created from url download. + if(!app_state->url.empty() && !app_state->file.empty()) + { + if (gDirUtilp->fileExists(app_state->file)) + { + LLFile::remove(app_state->file); + } + } + + bool success = !app_state->failure; + delete app_state; + return success ? 0 : 1; } + diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp index 1cc03bddb8..c9cb1cd6e7 100644 --- a/indra/llaudio/llaudioengine.cpp +++ b/indra/llaudio/llaudioengine.cpp @@ -1557,6 +1557,10 @@ bool LLAudioSource::hasPendingPreloads() const LLAudioData *adp = iter->second; // note: a bad UUID will forever be !hasDecodedData() // but also !hasValidData(), hence the check for hasValidData() + if (!adp) + { + continue; + } if (!adp->hasDecodedData() && adp->hasValidData()) { // This source is still waiting for a preload diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h index 4c8bd690e8..cbfca588b0 100644 --- a/indra/llcharacter/lljoint.h +++ b/indra/llcharacter/lljoint.h @@ -83,6 +83,7 @@ protected: LLXformMatrix mOldXform; LLXformMatrix mDefaultXform; + LLUUID mId; public: U32 mDirtyFlags; BOOL mUpdateXform; @@ -182,6 +183,8 @@ public: void setDefaultFromCurrentXform( void ); void storeCurrentXform( const LLVector3& pos ); + LLUUID getId( void ) { return mId; } + void setId( const LLUUID& id ) { mId = id;} }; #endif // LL_LLJOINT_H diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 7bad780dd8..9342a22d46 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -70,6 +70,7 @@ set(llcommon_SOURCE_FILES llmemorystream.cpp llmemtype.cpp llmetrics.cpp + llmetricperformancetester.cpp llmortician.cpp lloptioninterface.cpp llptrto.cpp @@ -92,6 +93,7 @@ set(llcommon_SOURCE_FILES llstringtable.cpp llsys.cpp llthread.cpp + llthreadsafequeue.cpp lltimer.cpp lluri.cpp lluuid.cpp @@ -186,6 +188,7 @@ set(llcommon_HEADER_FILES llmemorystream.h llmemtype.h llmetrics.h + llmetricperformancetester.h llmortician.h llnametable.h lloptioninterface.h @@ -223,6 +226,7 @@ set(llcommon_HEADER_FILES llstringtable.h llsys.h llthread.h + llthreadsafequeue.h lltimer.h lltreeiterators.h lluri.h diff --git a/indra/llcommon/indra_constants.h b/indra/llcommon/indra_constants.h index b0618bfe59..95cb606240 100644 --- a/indra/llcommon/indra_constants.h +++ b/indra/llcommon/indra_constants.h @@ -245,9 +245,6 @@ const U8 SIM_ACCESS_ADULT = 42; // Seriously Adult Only const U8 SIM_ACCESS_DOWN = 254; const U8 SIM_ACCESS_MAX = SIM_ACCESS_ADULT; -// group constants -const S32 MAX_AGENT_GROUPS = 25; - // attachment constants const S32 MAX_AGENT_ATTACHMENTS = 38; const U8 ATTACHMENT_ADD = 0x80; @@ -300,6 +297,14 @@ const U32 START_LOCATION_ID_COUNT = 6; // group constants const U32 GROUP_MIN_SIZE = 2; +// gMaxAgentGroups is now sent by login.cgi, which +// looks it up from globals.xml. +// +// For now we need an old default value however, +// so the viewer can be deployed ahead of login.cgi. +// +const S32 DEFAULT_MAX_AGENT_GROUPS = 25; + // radius within which a chat message is fully audible const F32 CHAT_WHISPER_RADIUS = 10.f; const F32 CHAT_NORMAL_RADIUS = 20.f; diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h index 4ff93a553c..2b25f2fabb 100644..100755 --- a/indra/llcommon/llfasttimer.h +++ b/indra/llcommon/llfasttimer.h @@ -27,140 +27,9 @@ #ifndef LL_FASTTIMER_H #define LL_FASTTIMER_H +// Implementation of getCPUClockCount32() and getCPUClockCount64 are now in llfastertimer_class.cpp. + // pull in the actual class definition #include "llfasttimer_class.h" -// -// Important note: These implementations must be FAST! -// - -#if LL_WINDOWS -// -// Windows implementation of CPU clock -// - -// -// NOTE: put back in when we aren't using platform sdk anymore -// -// because MS has different signatures for these functions in winnt.h -// need to rename them to avoid conflicts -//#define _interlockedbittestandset _renamed_interlockedbittestandset -//#define _interlockedbittestandreset _renamed_interlockedbittestandreset -//#include <intrin.h> -//#undef _interlockedbittestandset -//#undef _interlockedbittestandreset - -//inline U32 LLFastTimer::getCPUClockCount32() -//{ -// U64 time_stamp = __rdtsc(); -// return (U32)(time_stamp >> 8); -//} -// -//// return full timer value, *not* shifted by 8 bits -//inline U64 LLFastTimer::getCPUClockCount64() -//{ -// return __rdtsc(); -//} - -// shift off lower 8 bits for lower resolution but longer term timing -// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing -inline U32 LLFastTimer::getCPUClockCount32() -{ - U32 ret_val; - __asm - { - _emit 0x0f - _emit 0x31 - shr eax,8 - shl edx,24 - or eax, edx - mov dword ptr [ret_val], eax - } - return ret_val; -} - -// return full timer value, *not* shifted by 8 bits -inline U64 LLFastTimer::getCPUClockCount64() -{ - U64 ret_val; - __asm - { - _emit 0x0f - _emit 0x31 - mov eax,eax - mov edx,edx - mov dword ptr [ret_val+4], edx - mov dword ptr [ret_val], eax - } - return ret_val; -} -#endif - - -#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) -// -// Linux and Solaris implementation of CPU clock - non-x86. -// This is accurate but SLOW! Only use out of desperation. -// -// Try to use the MONOTONIC clock if available, this is a constant time counter -// with nanosecond resolution (but not necessarily accuracy) and attempts are -// made to synchronize this value between cores at kernel start. It should not -// be affected by CPU frequency. If not available use the REALTIME clock, but -// this may be affected by NTP adjustments or other user activity affecting -// the system time. -inline U64 LLFastTimer::getCPUClockCount64() -{ - struct timespec tp; - -#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time? - if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME -#endif - clock_gettime(CLOCK_REALTIME,&tp); - - return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec; -} - -inline U32 LLFastTimer::getCPUClockCount32() -{ - return (U32)(LLFastTimer::getCPUClockCount64() >> 8); -} -#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) - - -#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__)) -// -// Mac+Linux+Solaris FAST x86 implementation of CPU clock -inline U32 LLFastTimer::getCPUClockCount32() -{ - U64 x; - __asm__ volatile (".byte 0x0f, 0x31": "=A"(x)); - return (U32)(x >> 8); -} - -inline U64 LLFastTimer::getCPUClockCount64() -{ - U64 x; - __asm__ volatile (".byte 0x0f, 0x31": "=A"(x)); - return x; -} -#endif - - -#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) -// -// Mac PPC (deprecated) implementation of CPU clock -// -// Just use gettimeofday implementation for now - -inline U32 LLFastTimer::getCPUClockCount32() -{ - return (U32)(get_clock_count()>>8); -} - -inline U64 LLFastTimer::getCPUClockCount64() -{ - return get_clock_count(); -} -#endif - #endif // LL_LLFASTTIMER_H diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp index c45921cdec..0828635881 100644 --- a/indra/llcommon/llfasttimer_class.cpp +++ b/indra/llcommon/llfasttimer_class.cpp @@ -35,10 +35,13 @@ #include <boost/bind.hpp> + #if LL_WINDOWS +#include "lltimer.h" #elif LL_LINUX || LL_SOLARIS #include <sys/time.h> #include <sched.h> +#include "lltimer.h" #elif LL_DARWIN #include <sys/time.h> #include "lltimer.h" // get_clock_count() @@ -56,10 +59,13 @@ 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; +#define USE_RDTSC 0 + #if LL_LINUX || LL_SOLARIS U64 LLFastTimer::sClockResolution = 1000000000; // Nanosecond resolution #else @@ -233,10 +239,23 @@ U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer #else // windows or x86-mac or x86-linux or x86-solaris U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer { +#if USE_RDTSC || !LL_WINDOWS //getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0); // we drop the low-order byte in our timers, so report a lower frequency +#else + // If we're not using RDTSC, each fasttimer tick is just a performance counter tick. + // Not redefining the clock frequency itself (in llprocessor.cpp/calculate_cpu_frequency()) + // since that would change displayed MHz stats for CPUs + static bool firstcall = true; + static U64 sCPUClockFrequency; + if (firstcall) + { + QueryPerformanceFrequency((LARGE_INTEGER*)&sCPUClockFrequency); + firstcall = false; + } +#endif return sCPUClockFrequency >> 8; } #endif @@ -481,6 +500,19 @@ void LLFastTimer::NamedTimer::resetFrame() { if (sLog) { //output current frame counts to performance log + + static S32 call_count = 0; + if (call_count % 100 == 0) + { + llinfos << "countsPerSecond (32 bit): " << countsPerSecond() << llendl; + llinfos << "get_clock_count (64 bit): " << get_clock_count() << llendl; + llinfos << "LLProcessorInfo().getCPUFrequency() " << LLProcessorInfo().getCPUFrequency() << llendl; + llinfos << "getCPUClockCount32() " << getCPUClockCount32() << llendl; + llinfos << "getCPUClockCount64() " << getCPUClockCount64() << llendl; + llinfos << "elapsed sec " << ((F64)getCPUClockCount64())/((F64)LLProcessorInfo().getCPUFrequency()*1000000.0) << llendl; + } + call_count++; + F64 iclock_freq = 1000.0 / countsPerSecond(); // good place to calculate clock frequency F64 total_time = 0; @@ -762,3 +794,152 @@ LLFastTimer::LLFastTimer(LLFastTimer::FrameState* state) ////////////////////////////////////////////////////////////////////////////// +// +// Important note: These implementations must be FAST! +// + + +#if LL_WINDOWS +// +// Windows implementation of CPU clock +// + +// +// NOTE: put back in when we aren't using platform sdk anymore +// +// because MS has different signatures for these functions in winnt.h +// need to rename them to avoid conflicts +//#define _interlockedbittestandset _renamed_interlockedbittestandset +//#define _interlockedbittestandreset _renamed_interlockedbittestandreset +//#include <intrin.h> +//#undef _interlockedbittestandset +//#undef _interlockedbittestandreset + +//inline U32 LLFastTimer::getCPUClockCount32() +//{ +// U64 time_stamp = __rdtsc(); +// return (U32)(time_stamp >> 8); +//} +// +//// return full timer value, *not* shifted by 8 bits +//inline U64 LLFastTimer::getCPUClockCount64() +//{ +// return __rdtsc(); +//} + +// shift off lower 8 bits for lower resolution but longer term timing +// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing +#if USE_RDTSC +U32 LLFastTimer::getCPUClockCount32() +{ + U32 ret_val; + __asm + { + _emit 0x0f + _emit 0x31 + shr eax,8 + shl edx,24 + or eax, edx + mov dword ptr [ret_val], eax + } + return ret_val; +} + +// return full timer value, *not* shifted by 8 bits +U64 LLFastTimer::getCPUClockCount64() +{ + U64 ret_val; + __asm + { + _emit 0x0f + _emit 0x31 + mov eax,eax + mov edx,edx + mov dword ptr [ret_val+4], edx + mov dword ptr [ret_val], eax + } + return ret_val; +} +#else +//LL_COMMON_API U64 get_clock_count(); // in lltimer.cpp +// These use QueryPerformanceCounter, which is arguably fine and also works on amd architectures. +U32 LLFastTimer::getCPUClockCount32() +{ + return (U32)(get_clock_count()>>8); +} + +U64 LLFastTimer::getCPUClockCount64() +{ + return get_clock_count(); +} +#endif + +#endif + + +#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) +// +// Linux and Solaris implementation of CPU clock - non-x86. +// This is accurate but SLOW! Only use out of desperation. +// +// Try to use the MONOTONIC clock if available, this is a constant time counter +// with nanosecond resolution (but not necessarily accuracy) and attempts are +// made to synchronize this value between cores at kernel start. It should not +// be affected by CPU frequency. If not available use the REALTIME clock, but +// this may be affected by NTP adjustments or other user activity affecting +// the system time. +U64 LLFastTimer::getCPUClockCount64() +{ + struct timespec tp; + +#ifdef CLOCK_MONOTONIC // MONOTONIC supported at build-time? + if (-1 == clock_gettime(CLOCK_MONOTONIC,&tp)) // if MONOTONIC isn't supported at runtime then ouch, try REALTIME +#endif + clock_gettime(CLOCK_REALTIME,&tp); + + return (tp.tv_sec*LLFastTimer::sClockResolution)+tp.tv_nsec; +} + +U32 LLFastTimer::getCPUClockCount32() +{ + return (U32)(LLFastTimer::getCPUClockCount64() >> 8); +} +#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__)) + + +#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__)) +// +// Mac+Linux+Solaris FAST x86 implementation of CPU clock +U32 LLFastTimer::getCPUClockCount32() +{ + U64 x; + __asm__ volatile (".byte 0x0f, 0x31": "=A"(x)); + return (U32)(x >> 8); +} + +U64 LLFastTimer::getCPUClockCount64() +{ + U64 x; + __asm__ volatile (".byte 0x0f, 0x31": "=A"(x)); + return x; +} +#endif + + +#if ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__))) +// +// Mac PPC (deprecated) implementation of CPU clock +// +// Just use gettimeofday implementation for now + +U32 LLFastTimer::getCPUClockCount32() +{ + return (U32)(get_clock_count()>>8); +} + +U64 LLFastTimer::getCPUClockCount64() +{ + return get_clock_count(); +} +#endif + diff --git a/indra/llcommon/llfasttimer_class.h b/indra/llcommon/llfasttimer_class.h index 8dd686dc38..2a645315c9 100644 --- a/indra/llcommon/llfasttimer_class.h +++ b/indra/llcommon/llfasttimer_class.h @@ -219,6 +219,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/llfile.cpp b/indra/llcommon/llfile.cpp index 289ce0bc2c..8f02391e75 100644 --- a/indra/llcommon/llfile.cpp +++ b/indra/llcommon/llfile.cpp @@ -318,7 +318,12 @@ void llofstream::close() if(is_open()) { if (_Filebuffer->close() == 0) + { _Myios::setstate(ios_base::failbit); /*Flawfinder: ignore*/ + } + delete _Filebuffer; + _Filebuffer = NULL; + _ShouldClose = false; } } diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 985f5ca30f..8d114f744b 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -1,25 +1,25 @@ -/** +/** * @file llmemory.h * @brief Memory allocation/deallocation header-stuff goes here. * * $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$ */ @@ -29,12 +29,13 @@ #include <stdlib.h> // A not necessarily efficient, but general, aligned malloc http://stackoverflow.com/questions/196329/osx-lacks-memalign +#if 0 //DON'T use ll_aligned_foo now that we use tcmalloc everywhere (tcmalloc aligns automatically at appropriate intervals) inline void* ll_aligned_malloc( size_t size, int align ) { void* mem = malloc( size + (align - 1) + sizeof(void*) ); char* aligned = ((char*)mem) + sizeof(void*); aligned += align - ((uintptr_t)aligned & (align - 1)); - + ((void**)aligned)[-1] = mem; return aligned; } @@ -95,6 +96,7 @@ inline void ll_aligned_free_32(void *p) free(p); // posix_memalign() is compatible with heap deallocator #endif } +#endif class LL_COMMON_API LLMemory { 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/llthread.cpp b/indra/llcommon/llthread.cpp index 84da54f26d..f0b7ac5def 100644 --- a/indra/llcommon/llthread.cpp +++ b/indra/llcommon/llthread.cpp @@ -78,9 +78,6 @@ void *APR_THREAD_FUNC LLThread::staticRun(apr_thread_t *apr_threadp, void *datap { LLThread *threadp = (LLThread *)datap; - // Set thread state to running - threadp->mStatus = RUNNING; - #if !LL_DARWIN sThreadID = threadp->mID; #endif @@ -168,26 +165,45 @@ void LLThread::shutdown() { // This thread just wouldn't stop, even though we gave it time //llwarns << "LLThread::~LLThread() exiting thread before clean exit!" << llendl; + // Put a stake in its heart. + apr_thread_exit(mAPRThreadp, -1); return; } mAPRThreadp = NULL; } delete mRunCondition; + mRunCondition = 0; - if (mIsLocalPool) + if (mIsLocalPool && mAPRPoolp) { apr_pool_destroy(mAPRPoolp); + mAPRPoolp = 0; } } void LLThread::start() { - apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp); + llassert(isStopped()); + + // Set thread state to running + mStatus = RUNNING; - // We won't bother joining - apr_thread_detach(mAPRThreadp); + apr_status_t status = + apr_thread_create(&mAPRThreadp, NULL, staticRun, (void *)this, mAPRPoolp); + + if(status == APR_SUCCESS) + { + // We won't bother joining + apr_thread_detach(mAPRThreadp); + } + else + { + mStatus = STOPPED; + llwarns << "failed to start thread " << mName << llendl; + ll_apr_warn_status(status); + } } //============================================================================ diff --git a/indra/llcommon/llthreadsafequeue.cpp b/indra/llcommon/llthreadsafequeue.cpp new file mode 100644 index 0000000000..8a73e632a9 --- /dev/null +++ b/indra/llcommon/llthreadsafequeue.cpp @@ -0,0 +1,109 @@ +/** + * @file llthread.cpp + * + * $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 <apr_pools.h> +#include <apr_queue.h> +#include "llthreadsafequeue.h" + + + +// LLThreadSafeQueueImplementation +//----------------------------------------------------------------------------- + + +LLThreadSafeQueueImplementation::LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity): + mOwnsPool(pool == 0), + mPool(pool), + mQueue(0) +{ + if(mOwnsPool) { + apr_status_t status = apr_pool_create(&mPool, 0); + if(status != APR_SUCCESS) throw LLThreadSafeQueueError("failed to allocate pool"); + } else { + ; // No op. + } + + apr_status_t status = apr_queue_create(&mQueue, capacity, mPool); + if(status != APR_SUCCESS) throw LLThreadSafeQueueError("failed to allocate queue"); +} + + +LLThreadSafeQueueImplementation::~LLThreadSafeQueueImplementation() +{ + if(mQueue != 0) { + if(apr_queue_size(mQueue) != 0) llwarns << + "terminating queue which still contains " << apr_queue_size(mQueue) << + " elements;" << "memory will be leaked" << LL_ENDL; + apr_queue_term(mQueue); + } + if(mOwnsPool && (mPool != 0)) apr_pool_destroy(mPool); +} + + +void LLThreadSafeQueueImplementation::pushFront(void * element) +{ + apr_status_t status = apr_queue_push(mQueue, element); + + if(status == APR_EINTR) { + throw LLThreadSafeQueueInterrupt(); + } else if(status != APR_SUCCESS) { + throw LLThreadSafeQueueError("push failed"); + } else { + ; // Success. + } +} + + +bool LLThreadSafeQueueImplementation::tryPushFront(void * element){ + return apr_queue_trypush(mQueue, element) == APR_SUCCESS; +} + + +void * LLThreadSafeQueueImplementation::popBack(void) +{ + void * element; + apr_status_t status = apr_queue_pop(mQueue, &element); + + if(status == APR_EINTR) { + throw LLThreadSafeQueueInterrupt(); + } else if(status != APR_SUCCESS) { + throw LLThreadSafeQueueError("pop failed"); + } else { + return element; + } +} + + +bool LLThreadSafeQueueImplementation::tryPopBack(void *& element) +{ + return apr_queue_trypop(mQueue, &element) == APR_SUCCESS; +} + + +size_t LLThreadSafeQueueImplementation::size() +{ + return apr_queue_size(mQueue); +} diff --git a/indra/llcommon/llthreadsafequeue.h b/indra/llcommon/llthreadsafequeue.h new file mode 100644 index 0000000000..58cac38769 --- /dev/null +++ b/indra/llcommon/llthreadsafequeue.h @@ -0,0 +1,205 @@ +/** + * @file llthreadsafequeue.h + * @brief Base classes for thread, mutex and condition handling. + * + * $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_LLTHREADSAFEQUEUE_H +#define LL_LLTHREADSAFEQUEUE_H + + +#include <string> +#include <stdexcept> + + +struct apr_pool_t; // From apr_pools.h +class LLThreadSafeQueueImplementation; // See below. + + +// +// A general queue exception. +// +class LL_COMMON_API LLThreadSafeQueueError: +public std::runtime_error +{ +public: + LLThreadSafeQueueError(std::string const & message): + std::runtime_error(message) + { + ; // No op. + } +}; + + +// +// An exception raised when blocking operations are interrupted. +// +class LL_COMMON_API LLThreadSafeQueueInterrupt: + public LLThreadSafeQueueError +{ +public: + LLThreadSafeQueueInterrupt(void): + LLThreadSafeQueueError("queue operation interrupted") + { + ; // No op. + } +}; + + +struct apr_queue_t; // From apr_queue.h + + +// +// Implementation details. +// +class LL_COMMON_API LLThreadSafeQueueImplementation +{ +public: + LLThreadSafeQueueImplementation(apr_pool_t * pool, unsigned int capacity); + ~LLThreadSafeQueueImplementation(); + void pushFront(void * element); + bool tryPushFront(void * element); + void * popBack(void); + bool tryPopBack(void *& element); + size_t size(); + +private: + bool mOwnsPool; + apr_pool_t * mPool; + apr_queue_t * mQueue; +}; + + +// +// Implements a thread safe FIFO. +// +template<typename ElementT> +class LLThreadSafeQueue +{ +public: + typedef ElementT value_type; + + // If the pool is set to NULL one will be allocated and managed by this + // queue. + LLThreadSafeQueue(apr_pool_t * pool = 0, unsigned int capacity = 1024); + + // Add an element to the front of queue (will block if the queue has + // reached capacity). + // + // This call will raise an interrupt error if the queue is deleted while + // the caller is blocked. + void pushFront(ElementT const & element); + + // Try to add an element to the front ofqueue without blocking. Returns + // true only if the element was actually added. + bool tryPushFront(ElementT const & element); + + // Pop the element at the end of the queue (will block if the queue is + // empty). + // + // This call will raise an interrupt error if the queue is deleted while + // the caller is blocked. + ElementT popBack(void); + + // Pop an element from the end of the queue if there is one available. + // Returns true only if an element was popped. + bool tryPopBack(ElementT & element); + + // Returns the size of the queue. + size_t size(); + +private: + LLThreadSafeQueueImplementation mImplementation; +}; + + + +// LLThreadSafeQueue +//----------------------------------------------------------------------------- + + +template<typename ElementT> +LLThreadSafeQueue<ElementT>::LLThreadSafeQueue(apr_pool_t * pool, unsigned int capacity): + mImplementation(pool, capacity) +{ + ; // No op. +} + + +template<typename ElementT> +void LLThreadSafeQueue<ElementT>::pushFront(ElementT const & element) +{ + ElementT * elementCopy = new ElementT(element); + try { + mImplementation.pushFront(elementCopy); + } catch (LLThreadSafeQueueInterrupt) { + delete elementCopy; + throw; + } +} + + +template<typename ElementT> +bool LLThreadSafeQueue<ElementT>::tryPushFront(ElementT const & element) +{ + ElementT * elementCopy = new ElementT(element); + bool result = mImplementation.tryPushFront(elementCopy); + if(!result) delete elementCopy; + return result; +} + + +template<typename ElementT> +ElementT LLThreadSafeQueue<ElementT>::popBack(void) +{ + ElementT * element = reinterpret_cast<ElementT *> (mImplementation.popBack()); + ElementT result(*element); + delete element; + return result; +} + + +template<typename ElementT> +bool LLThreadSafeQueue<ElementT>::tryPopBack(ElementT & element) +{ + void * storedElement; + bool result = mImplementation.tryPopBack(storedElement); + if(result) { + ElementT * elementPtr = reinterpret_cast<ElementT *>(storedElement); + element = *elementPtr; + delete elementPtr; + } else { + ; // No op. + } + return result; +} + + +template<typename ElementT> +size_t LLThreadSafeQueue<ElementT>::size(void) +{ + return mImplementation.size(); +} + + +#endif diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h index b209e4aa38..356e0f4c0f 100644 --- a/indra/llcommon/llversionviewer.h +++ b/indra/llcommon/llversionviewer.h @@ -28,14 +28,14 @@ #define LL_LLVERSIONVIEWER_H const S32 LL_VERSION_MAJOR = 2; -const S32 LL_VERSION_MINOR = 4; +const S32 LL_VERSION_MINOR = 5; 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"; +const char * const LL_VERSION_BUNDLE_ID = "com.secondlife.indra.viewer"; #endif #endif 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/llinventory.cpp b/indra/llinventory/llinventory.cpp index bda76eac80..a3caf79519 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -61,8 +61,6 @@ static const std::string INV_FOLDER_ID_LABEL_WS("category_id"); ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- -const U8 TASK_INVENTORY_ITEM_KEY = 0; -const U8 TASK_INVENTORY_ASSET_KEY = 1; const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730"); diff --git a/indra/llmessage/llavatarnamecache.cpp b/indra/llmessage/llavatarnamecache.cpp index 2f2d9099a3..03c28eb2a5 100644 --- a/indra/llmessage/llavatarnamecache.cpp +++ b/indra/llmessage/llavatarnamecache.cpp @@ -235,27 +235,21 @@ public: /*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; + // If there's an error, it might be caused by PeopleApi, + // or when loading textures on startup and using a very slow + // network, this query may time out. Fallback to the legacy + // cache. + + llwarns << "LLAvatarNameResponder error " << status << " " << reason << llendl; // 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); + gCacheName->get(agent_id, false, // legacy compatibility + boost::bind(&LLAvatarNameCache::legacyNameCallback, + _1, _2, _3)); } } @@ -286,18 +280,8 @@ public: } // No information in header, make a guess - if (status == 503) - { - // ...service unavailable, retry soon - const F64 SERVICE_UNAVAILABLE_DELAY = 600.0; // 10 min - return now + SERVICE_UNAVAILABLE_DELAY; - } - else - { - // ...other unexpected error - const F64 DEFAULT_DELAY = 3600.0; // 1 hour - return now + DEFAULT_DELAY; - } + const F64 DEFAULT_DELAY = 120.0; // 2 mintues + return now + DEFAULT_DELAY; } }; @@ -367,7 +351,7 @@ void LLAvatarNameCache::requestNamesViaCapability() if (url.size() > NAME_URL_SEND_THRESHOLD) { //llinfos << "requestNames " << url << llendl; - LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids)); + LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));//, LLSD(), 10.0f); url.clear(); agent_ids.clear(); } @@ -376,7 +360,7 @@ void LLAvatarNameCache::requestNamesViaCapability() if (!url.empty()) { //llinfos << "requestNames " << url << llendl; - LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids)); + LLHTTPClient::get(url, new LLAvatarNameResponder(agent_ids));//, LLSD(), 10.0f); url.clear(); agent_ids.clear(); } diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp index a8f53a38c3..479efabb5f 100644 --- a/indra/llmessage/llcachename.cpp +++ b/indra/llmessage/llcachename.cpp @@ -556,39 +556,43 @@ std::string LLCacheName::buildUsername(const std::string& full_name) //static std::string LLCacheName::buildLegacyName(const std::string& complete_name) { - // regexp doesn't play nice with unicode, chop off the display name + //boost::regexp was showing up in the crashreporter, so doing + //painfully manual parsing using substr. LF S32 open_paren = complete_name.rfind(" ("); + S32 close_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;
- }
- else
- {
- legacy_name = legacy_name + " Resident";
- }
-
- return legacy_name; + if (open_paren != std::string::npos && + close_paren == complete_name.length()-1) + { + S32 length = close_paren - open_paren - 2; + std::string legacy_name = complete_name.substr(open_paren+2, length); + + if (legacy_name.length() > 0) + { + std::string cap_letter = legacy_name.substr(0, 1); + LLStringUtil::toUpper(cap_letter); + legacy_name = cap_letter + legacy_name.substr(1); + + S32 separator = legacy_name.find('.'); + + if (separator != std::string::npos) + { + std::string last_name = legacy_name.substr(separator+1); + legacy_name = legacy_name.substr(0, separator); + + if (last_name.length() > 0) + { + cap_letter = last_name.substr(0, 1); + LLStringUtil::toUpper(cap_letter); + legacy_name = legacy_name + " " + cap_letter + last_name.substr(1); + } + } + + return legacy_name; + } + } + + return complete_name; } // This is a little bit kludgy. LLCacheNameCallback is a slot instead of a function pointer. @@ -971,6 +975,10 @@ void LLCacheName::Impl::processUUIDReply(LLMessageSystem* msg, bool isGroup) if (entry->mLastName.empty()) { full_name = cleanFullName(entry->mFirstName); + + //fix what we are putting in the cache + entry->mFirstName = full_name; + entry->mLastName = "Resident"; } else { diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp index 9ea2ff4153..5a38b7fd9f 100644 --- a/indra/llmessage/llhttpassetstorage.cpp +++ b/indra/llmessage/llhttpassetstorage.cpp @@ -174,8 +174,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const double curl_total_time = -1.0f; double curl_size_upload = -1.0f; double curl_size_download = -1.0f; - long curl_content_length_upload = -1; - long curl_content_length_download = -1; + double curl_content_length_upload = -1.0f; + double curl_content_length_download = -1.0f; long curl_request_size = -1; const char* curl_content_type = NULL; @@ -194,8 +194,8 @@ LLSD LLHTTPAssetRequest::getFullDetails() const sd["curl_total_time"] = curl_total_time; sd["curl_size_upload"] = curl_size_upload; sd["curl_size_download"] = curl_size_download; - sd["curl_content_length_upload"] = (int) curl_content_length_upload; - sd["curl_content_length_download"] = (int) curl_content_length_download; + sd["curl_content_length_upload"] = curl_content_length_upload; + sd["curl_content_length_download"] = curl_content_length_download; sd["curl_request_size"] = (int) curl_request_size; if (curl_content_type) { diff --git a/indra/llrender/llgl.cpp b/indra/llrender/llgl.cpp index 6ea63809f8..d802a3045d 100644 --- a/indra/llrender/llgl.cpp +++ b/indra/llrender/llgl.cpp @@ -154,30 +154,27 @@ PFNGLGETQUERYOBJECTUIVARBPROC glGetQueryObjectuivARB = NULL; PFNGLPOINTPARAMETERFARBPROC glPointParameterfARB = NULL; PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB = NULL; -// GL_EXT_framebuffer_object -PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT = NULL; -PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT = NULL; -PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = NULL; -PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT = NULL; -PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT = NULL; -PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT = NULL; -PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT = NULL; -PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT = NULL; -PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = NULL; -PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT = NULL; -PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = NULL; -PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT = NULL; -PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT = NULL; -PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT = NULL; -PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT = NULL; - -// GL_EXT_framebuffer_multisample -PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT = NULL; - -// GL_EXT_framebuffer_blit -PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT = NULL; +// GL_ARB_framebuffer_object +PFNGLISRENDERBUFFERPROC glIsRenderbuffer = NULL; +PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = NULL; +PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = NULL; +PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = NULL; +PFNGLISFRAMEBUFFERPROC glIsFramebuffer = NULL; +PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = NULL; +PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGENERATEMIPMAPPROC glGenerateMipmap = NULL; +PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = NULL; // GL_EXT_blend_func_separate PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT = NULL; @@ -320,7 +317,6 @@ LLGLManager::LLGLManager() : mHasMipMapGeneration(FALSE), mHasCompressedTextures(FALSE), mHasFramebufferObject(FALSE), - mHasFramebufferMultisample(FALSE), mHasBlendFuncSeparate(FALSE), mHasVertexBufferObject(FALSE), @@ -635,11 +631,6 @@ void LLGLManager::initExtensions() # else mHasFramebufferObject = FALSE; # endif -# ifdef GL_EXT_framebuffer_multisample - mHasFramebufferMultisample = TRUE; -# else - mHasFramebufferMultisample = FALSE; -# endif # ifdef GL_ARB_draw_buffers mHasDrawBuffers = TRUE; #else @@ -678,9 +669,7 @@ void LLGLManager::initExtensions() 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); - mHasFramebufferMultisample = mHasFramebufferObject && ExtensionExists("GL_EXT_framebuffer_multisample", gGLHExts.mSysExts); + mHasFramebufferObject = ExtensionExists("GL_ARB_framebuffer_object", gGLHExts.mSysExts); mHasDrawBuffers = ExtensionExists("GL_ARB_draw_buffers", gGLHExts.mSysExts); mHasBlendFuncSeparate = ExtensionExists("GL_EXT_blend_func_separate", gGLHExts.mSysExts); mHasTextureRectangle = ExtensionExists("GL_ARB_texture_rectangle", gGLHExts.mSysExts); @@ -705,7 +694,6 @@ void LLGLManager::initExtensions() mHasCompressedTextures = FALSE; mHasVertexBufferObject = FALSE; mHasFramebufferObject = FALSE; - mHasFramebufferMultisample = FALSE; mHasDrawBuffers = FALSE; mHasBlendFuncSeparate = FALSE; mHasMipMapGeneration = FALSE; @@ -759,10 +747,9 @@ void LLGLManager::initExtensions() if (strchr(blacklist,'p')) mHasPointParameters = FALSE;//S if (strchr(blacklist,'q')) mHasFramebufferObject = FALSE;//S if (strchr(blacklist,'r')) mHasDrawBuffers = FALSE;//S - 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; + if (strchr(blacklist,'s')) mHasTextureRectangle = FALSE; + if (strchr(blacklist,'t')) mHasBlendFuncSeparate = FALSE;//S + if (strchr(blacklist,'u')) mHasDepthClamp = FALSE; } #endif // LL_LINUX || LL_SOLARIS @@ -862,28 +849,26 @@ void LLGLManager::initExtensions() if (mHasFramebufferObject) { llinfos << "initExtensions() FramebufferObject-related procs..." << llendl; - glIsRenderbufferEXT = (PFNGLISRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbufferEXT"); - glBindRenderbufferEXT = (PFNGLBINDRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbufferEXT"); - glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffersEXT"); - glGenRenderbuffersEXT = (PFNGLGENRENDERBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffersEXT"); - glRenderbufferStorageEXT = (PFNGLRENDERBUFFERSTORAGEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageEXT"); - glGetRenderbufferParameterivEXT = (PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameterivEXT"); - glIsFramebufferEXT = (PFNGLISFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebufferEXT"); - glBindFramebufferEXT = (PFNGLBINDFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebufferEXT"); - glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffersEXT"); - glGenFramebuffersEXT = (PFNGLGENFRAMEBUFFERSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffersEXT"); - glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatusEXT"); - glFramebufferTexture1DEXT = (PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1DEXT"); - glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2DEXT"); - glFramebufferTexture3DEXT = (PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3DEXT"); - glFramebufferRenderbufferEXT = (PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbufferEXT"); - glGetFramebufferAttachmentParameterivEXT = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameterivEXT"); - glGenerateMipmapEXT = (PFNGLGENERATEMIPMAPEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmapEXT"); - } - if (mHasFramebufferMultisample) - { - glRenderbufferStorageMultisampleEXT = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisampleEXT"); - glBlitFramebufferEXT = (PFNGLBLITFRAMEBUFFEREXTPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebufferEXT"); + glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glIsRenderbuffer"); + glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBindRenderbuffer"); + glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteRenderbuffers"); + glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenRenderbuffers"); + glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorage"); + glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetRenderbufferParameteriv"); + glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glIsFramebuffer"); + glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBindFramebuffer"); + glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glDeleteFramebuffers"); + glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC) GLH_EXT_GET_PROC_ADDRESS("glGenFramebuffers"); + glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC) GLH_EXT_GET_PROC_ADDRESS("glCheckFramebufferStatus"); + glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture1D"); + glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture2D"); + glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTexture3D"); + glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferRenderbuffer"); + glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) GLH_EXT_GET_PROC_ADDRESS("glGetFramebufferAttachmentParameteriv"); + glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC) GLH_EXT_GET_PROC_ADDRESS("glGenerateMipmap"); + glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC) GLH_EXT_GET_PROC_ADDRESS("glBlitFramebuffer"); + glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) GLH_EXT_GET_PROC_ADDRESS("glRenderbufferStorageMultisample"); + glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC) GLH_EXT_GET_PROC_ADDRESS("glFramebufferTextureLayer"); } if (mHasDrawBuffers) { diff --git a/indra/llrender/llgl.h b/indra/llrender/llgl.h index 85fab7a0f8..4630811679 100644 --- a/indra/llrender/llgl.h +++ b/indra/llrender/llgl.h @@ -80,7 +80,6 @@ public: BOOL mHasMipMapGeneration; BOOL mHasCompressedTextures; BOOL mHasFramebufferObject; - BOOL mHasFramebufferMultisample; BOOL mHasBlendFuncSeparate; // ARB Extensions @@ -418,4 +417,67 @@ extern BOOL gClothRipple; extern BOOL gNoRender; extern BOOL gGLActive; +// Deal with changing glext.h definitions for newer SDK versions, specifically +// with MAC OSX 10.5 -> 10.6 + + +#ifndef GL_DEPTH_ATTACHMENT +#define GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT +#endif + +#ifndef GL_STENCIL_ATTACHMENT +#define GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT +#endif + +#ifndef GL_FRAMEBUFFER +#define GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT +#define GL_DRAW_FRAMEBUFFER GL_DRAW_FRAMEBUFFER_EXT +#define GL_READ_FRAMEBUFFER GL_READ_FRAMEBUFFER_EXT +#define GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT +#define GL_FRAMEBUFFER_UNSUPPORTED GL_FRAMEBUFFER_UNSUPPORTED_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT +#define glGenFramebuffers glGenFramebuffersEXT +#define glBindFramebuffer glBindFramebufferEXT +#define glCheckFramebufferStatus glCheckFramebufferStatusEXT +#define glBlitFramebuffer glBlitFramebufferEXT +#define glDeleteFramebuffers glDeleteFramebuffersEXT +#define glFramebufferRenderbuffer glFramebufferRenderbufferEXT +#define glFramebufferTexture2D glFramebufferTexture2DEXT +#endif + +#ifndef GL_RENDERBUFFER +#define GL_RENDERBUFFER GL_RENDERBUFFER_EXT +#define glGenRenderbuffers glGenRenderbuffersEXT +#define glBindRenderbuffer glBindRenderbufferEXT +#define glRenderbufferStorage glRenderbufferStorageEXT +#define glRenderbufferStorageMultisample glRenderbufferStorageMultisampleEXT +#define glDeleteRenderbuffers glDeleteRenderbuffersEXT +#endif + +#ifndef GL_COLOR_ATTACHMENT +#define GL_COLOR_ATTACHMENT GL_COLOR_ATTACHMENT_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT0 +#define GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT1 +#define GL_COLOR_ATTACHMENT1 GL_COLOR_ATTACHMENT1_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT2 +#define GL_COLOR_ATTACHMENT2 GL_COLOR_ATTACHMENT2_EXT +#endif + +#ifndef GL_COLOR_ATTACHMENT3 +#define GL_COLOR_ATTACHMENT3 GL_COLOR_ATTACHMENT3_EXT +#endif + + +#ifndef GL_DEPTH24_STENCIL8 +#define GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT +#endif + #endif // LL_LLGL_H diff --git a/indra/llrender/llglheaders.h b/indra/llrender/llglheaders.h index 576969b81a..46bc282436 100644 --- a/indra/llrender/llglheaders.h +++ b/indra/llrender/llglheaders.h @@ -1,25 +1,25 @@ -/** +/** * @file llglheaders.h * @brief LLGL definitions * * $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$ */ @@ -449,30 +449,27 @@ extern PFNGLGETCOMPRESSEDTEXIMAGEARBPROC glGetCompressedTexImageARB; //GL_EXT_blend_func_separate extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; -//GL_EXT_framebuffer_object -extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT; -extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; -extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; -extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; -extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; -extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT; -extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT; -extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; -extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; -extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; -extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; -extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT; -extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; -extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT; -extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; -extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT; -extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; - -// GL_EXT_framebuffer_multisample -extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; - -// GL_EXT_framebuffer_blit -extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT; +//GL_ARB_framebuffer_object +extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer; +extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; +extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; +extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; +extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; +extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; +extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer; +extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; +extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; +extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; +extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; +extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; +extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; +extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; +extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; +extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; //GL_ARB_draw_buffers extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; @@ -651,30 +648,27 @@ extern PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB; //GL_EXT_blend_func_separate extern PFNGLBLENDFUNCSEPARATEEXTPROC glBlendFuncSeparateEXT; -//GL_EXT_framebuffer_object -extern PFNGLISRENDERBUFFEREXTPROC glIsRenderbufferEXT; -extern PFNGLBINDRENDERBUFFEREXTPROC glBindRenderbufferEXT; -extern PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT; -extern PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; -extern PFNGLRENDERBUFFERSTORAGEEXTPROC glRenderbufferStorageEXT; -extern PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC glGetRenderbufferParameterivEXT; -extern PFNGLISFRAMEBUFFEREXTPROC glIsFramebufferEXT; -extern PFNGLBINDFRAMEBUFFEREXTPROC glBindFramebufferEXT; -extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; -extern PFNGLGENFRAMEBUFFERSEXTPROC glGenFramebuffersEXT; -extern PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT; -extern PFNGLFRAMEBUFFERTEXTURE1DEXTPROC glFramebufferTexture1DEXT; -extern PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT; -extern PFNGLFRAMEBUFFERTEXTURE3DEXTPROC glFramebufferTexture3DEXT; -extern PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC glFramebufferRenderbufferEXT; -extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC glGetFramebufferAttachmentParameterivEXT; -extern PFNGLGENERATEMIPMAPEXTPROC glGenerateMipmapEXT; - -// GL_EXT_framebuffer_multisample -extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC glRenderbufferStorageMultisampleEXT; - -// GL_EXT_framebuffer_blit -extern PFNGLBLITFRAMEBUFFEREXTPROC glBlitFramebufferEXT; +//GL_ARB_framebuffer_object +extern PFNGLISRENDERBUFFERPROC glIsRenderbuffer; +extern PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; +extern PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; +extern PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; +extern PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; +extern PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv; +extern PFNGLISFRAMEBUFFERPROC glIsFramebuffer; +extern PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; +extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; +extern PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; +extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; +extern PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; +extern PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; +extern PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; +extern PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; +extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv; +extern PFNGLGENERATEMIPMAPPROC glGenerateMipmap; +extern PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; +extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; +extern PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; //GL_ARB_draw_buffers extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; @@ -697,7 +691,7 @@ extern PFNGLDRAWBUFFERSARBPROC glDrawBuffersARB; #include <AvailabilityMacros.h> //GL_EXT_blend_func_separate -extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) ; // GL_EXT_framebuffer_object extern GLboolean glIsRenderbufferEXT(GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; @@ -718,6 +712,9 @@ extern void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenu extern void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; +#ifndef GL_ARB_framebuffer_object +#define glGenerateMipmap glGenerateMipmapEXT +#endif // GL_ARB_draw_buffers extern void glDrawBuffersARB(GLsizei n, const GLenum* bufs) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER; diff --git a/indra/llrender/llrendertarget.cpp b/indra/llrender/llrendertarget.cpp index ccbd027f30..cd2556d435 100644 --- a/indra/llrender/llrendertarget.cpp +++ b/indra/llrender/llrendertarget.cpp @@ -38,10 +38,10 @@ void check_framebuffer_status() { if (gDebugGL) { - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + GLenum status = glCheckFramebufferStatus(GL_DRAW_FRAMEBUFFER); switch (status) { - case GL_FRAMEBUFFER_COMPLETE_EXT: + case GL_FRAMEBUFFER_COMPLETE: break; default: ll_fail("check_framebuffer_status failed"); @@ -99,24 +99,24 @@ void LLRenderTarget::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth, boo stop_glerror(); } - glGenFramebuffersEXT(1, (GLuint *) &mFBO); + glGenFramebuffers(1, (GLuint *) &mFBO); if (mDepth) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); if (mStencil) { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); } else { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0); stop_glerror(); } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } stop_glerror(); @@ -168,14 +168,14 @@ void LLRenderTarget::addColorAttachment(U32 color_fmt) } if (mFBO) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+offset, + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset, LLTexUnit::getInternalType(mUsage), tex, 0); stop_glerror(); check_framebuffer_status(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } mTex.push_back(tex); @@ -187,10 +187,10 @@ void LLRenderTarget::allocateDepth() if (mStencil) { //use render buffers where stencil buffers are in play - glGenRenderbuffersEXT(1, (GLuint *) &mDepth); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth); - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, mResX, mResY); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); + glGenRenderbuffers(1, (GLuint *) &mDepth); + glBindRenderbuffer(GL_RENDERBUFFER, mDepth); + glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, mResX, mResY); + glBindRenderbuffer(GL_RENDERBUFFER, 0); } else { @@ -198,7 +198,7 @@ void LLRenderTarget::allocateDepth() gGL.getTexUnit(0)->bindManual(mUsage, mDepth); U32 internal_type = LLTexUnit::getInternalType(mUsage); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_POINT); - LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32_ARB, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + LLImageGL::setManualImage(internal_type, 0, GL_DEPTH_COMPONENT32, mResX, mResY, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); } } @@ -222,23 +222,23 @@ void LLRenderTarget::shareDepthBuffer(LLRenderTarget& target) if (mDepth) { stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, target.mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, target.mFBO); stop_glerror(); if (mStencil) { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); stop_glerror(); target.mStencil = true; } else { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), mDepth, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), mDepth, 0); stop_glerror(); } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); target.mUseDepth = true; } @@ -250,7 +250,7 @@ void LLRenderTarget::release() { if (mStencil) { - glDeleteRenderbuffersEXT(1, (GLuint*) &mDepth); + glDeleteRenderbuffers(1, (GLuint*) &mDepth); stop_glerror(); } else @@ -262,23 +262,23 @@ void LLRenderTarget::release() } else if (mUseDepth && mFBO) { //detach shared depth buffer - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); if (mStencil) { //attached as a renderbuffer - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, 0); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0); mStencil = false; } else { //attached as a texture - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, LLTexUnit::getInternalType(mUsage), 0, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, LLTexUnit::getInternalType(mUsage), 0, 0); } mUseDepth = false; } if (mFBO) { - glDeleteFramebuffersEXT(1, (GLuint *) &mFBO); + glDeleteFramebuffers(1, (GLuint *) &mFBO); mFBO = 0; } @@ -304,14 +304,14 @@ void LLRenderTarget::bindTarget() } else { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); stop_glerror(); if (gGLManager.mHasDrawBuffers) { //setup multiple render targets - GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0_EXT, - GL_COLOR_ATTACHMENT1_EXT, - GL_COLOR_ATTACHMENT2_EXT, - GL_COLOR_ATTACHMENT3_EXT}; + GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3}; glDrawBuffersARB(mTex.size(), drawbuffers); } @@ -336,7 +336,7 @@ void LLRenderTarget::unbindTarget() { if (gGLManager.mHasFramebufferObject) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } sBoundTarget = NULL; } @@ -398,7 +398,7 @@ void LLRenderTarget::flush(bool fetch_depth) } gGL.getTexUnit(0)->bind(this); - glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8_EXT, 0, 0, mResX, mResY, 0); + glCopyTexImage2D(LLTexUnit::getInternalType(mUsage), 0, GL_DEPTH24_STENCIL8, 0, 0, mResX, mResY, 0); } gGL.getTexUnit(0)->disable(); @@ -407,55 +407,59 @@ void LLRenderTarget::flush(bool fetch_depth) { stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); stop_glerror(); if (mSampleBuffer) { - LLGLEnable multisample(GL_MULTISAMPLE_ARB); + LLGLEnable multisample(GL_MULTISAMPLE); stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); stop_glerror(); check_framebuffer_status(); - glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, mSampleBuffer->mFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER, mSampleBuffer->mFBO); check_framebuffer_status(); stop_glerror(); - glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); + glBlitFramebuffer(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST); stop_glerror(); if (mTex.size() > 1) { for (U32 i = 1; i < mTex.size(); ++i) { - glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, LLTexUnit::getInternalType(mUsage), mTex[i], 0); stop_glerror(); - glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, mSampleBuffer->mTex[i]); + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, mSampleBuffer->mTex[i]); stop_glerror(); - glBlitFramebufferEXT(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT, GL_NEAREST); + glBlitFramebuffer(0, 0, mResX, mResY, 0, 0, mResX, mResY, GL_COLOR_BUFFER_BIT, GL_NEAREST); stop_glerror(); } for (U32 i = 0; i < mTex.size(); ++i) { - glFramebufferTexture2DEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, + glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, LLTexUnit::getInternalType(mUsage), mTex[i], 0); stop_glerror(); - glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+i, GL_RENDERBUFFER_EXT, mSampleBuffer->mTex[i]); + glFramebufferRenderbuffer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+i, GL_RENDERBUFFER, mSampleBuffer->mTex[i]); stop_glerror(); } } } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } } 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) { + GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE; + + LLGLDepthTest depth(write_depth, write_depth); + gGL.flush(); if (!source.mFBO || !mFBO) { @@ -472,25 +476,25 @@ void LLRenderTarget::copyContents(LLRenderTarget& source, S32 srcX0, S32 srcY0, { stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, source.mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, source.mFBO); gGL.getTexUnit(0)->bind(this, true); stop_glerror(); glCopyTexSubImage2D(LLTexUnit::getInternalType(mUsage), 0, srcX0, srcY0, dstX0, dstY0, dstX1, dstY1); stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); stop_glerror(); } else { - glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO); + glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO); stop_glerror(); - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFBO); stop_glerror(); check_framebuffer_status(); stop_glerror(); - glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); stop_glerror(); } } @@ -505,15 +509,19 @@ void LLRenderTarget::copyContentsToFramebuffer(LLRenderTarget& source, S32 srcX0 llerrs << "Cannot copy framebuffer contents for non FBO render targets." << llendl; } { - glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, source.mFBO); + GLboolean write_depth = mask & GL_DEPTH_BUFFER_BIT ? TRUE : FALSE; + + LLGLDepthTest depth(write_depth, write_depth); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, source.mFBO); stop_glerror(); - glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); stop_glerror(); check_framebuffer_status(); stop_glerror(); - glBlitFramebufferEXT(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); stop_glerror(); } } @@ -548,19 +556,19 @@ void LLMultisampleBuffer::release() { if (mFBO) { - glDeleteFramebuffersEXT(1, (GLuint *) &mFBO); + glDeleteFramebuffers(1, (GLuint *) &mFBO); mFBO = 0; } if (mTex.size() > 0) { - glDeleteRenderbuffersEXT(mTex.size(), (GLuint *) &mTex[0]); + glDeleteRenderbuffers(mTex.size(), (GLuint *) &mTex[0]); mTex.clear(); } if (mDepth) { - glDeleteRenderbuffersEXT(1, (GLuint *) &mDepth); + glDeleteRenderbuffers(1, (GLuint *) &mDepth); mDepth = 0; } } @@ -577,13 +585,13 @@ void LLMultisampleBuffer::bindTarget(LLRenderTarget* ref) ref = this; } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); if (gGLManager.mHasDrawBuffers) { //setup multiple render targets - GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0_EXT, - GL_COLOR_ATTACHMENT1_EXT, - GL_COLOR_ATTACHMENT2_EXT, - GL_COLOR_ATTACHMENT3_EXT}; + GLenum drawbuffers[] = {GL_COLOR_ATTACHMENT0, + GL_COLOR_ATTACHMENT1, + GL_COLOR_ATTACHMENT2, + GL_COLOR_ATTACHMENT3}; glDrawBuffersARB(ref->mTex.size(), drawbuffers); } @@ -611,11 +619,6 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth release(); - if (!gGLManager.mHasFramebufferMultisample) - { - llerrs << "Attempting to allocate unsupported render target type!" << llendl; - } - mSamples = samples; if (mSamples <= 1) @@ -635,21 +638,21 @@ void LLMultisampleBuffer::allocate(U32 resx, U32 resy, U32 color_fmt, bool depth stop_glerror(); } - glGenFramebuffersEXT(1, (GLuint *) &mFBO); + glGenFramebuffers(1, (GLuint *) &mFBO); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); if (mDepth) { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, mDepth); if (mStencil) { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, mDepth); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, mDepth); } } stop_glerror(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); stop_glerror(); } @@ -671,28 +674,28 @@ void LLMultisampleBuffer::addColorAttachment(U32 color_fmt) } U32 tex; - glGenRenderbuffersEXT(1, &tex); + glGenRenderbuffers(1, &tex); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, tex); - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, color_fmt, mResX, mResY); + glBindRenderbuffer(GL_RENDERBUFFER, tex); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, color_fmt, mResX, mResY); stop_glerror(); if (mFBO) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT+offset, GL_RENDERBUFFER_EXT, tex); + glBindFramebuffer(GL_FRAMEBUFFER, mFBO); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0+offset, GL_RENDERBUFFER, tex); stop_glerror(); - GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); switch (status) { - case GL_FRAMEBUFFER_COMPLETE_EXT: + case GL_FRAMEBUFFER_COMPLETE: break; default: llerrs << "WTF? " << std::hex << status << llendl; break; } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } mTex.push_back(tex); @@ -700,15 +703,15 @@ void LLMultisampleBuffer::addColorAttachment(U32 color_fmt) void LLMultisampleBuffer::allocateDepth() { - glGenRenderbuffersEXT(1, (GLuint* ) &mDepth); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, mDepth); + glGenRenderbuffers(1, (GLuint* ) &mDepth); + glBindRenderbuffer(GL_RENDERBUFFER, mDepth); if (mStencil) { - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH24_STENCIL8_EXT, mResX, mResY); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH24_STENCIL8, mResX, mResY); } else { - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, mSamples, GL_DEPTH_COMPONENT16_ARB, mResX, mResY); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, mSamples, GL_DEPTH_COMPONENT16, mResX, mResY); } } diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h index 953b7e6757..f40f013306 100644 --- a/indra/llrender/llvertexbuffer.h +++ b/indra/llrender/llvertexbuffer.h @@ -198,7 +198,7 @@ public: U8* getIndicesPointer() const { return useVBOs() ? (U8*) mAlignedIndexOffset : mMappedIndexData; } U8* getVerticesPointer() const { return useVBOs() ? (U8*) mAlignedOffset : mMappedData; } U32 getTypeMask() const { return mTypeMask; } - BOOL hasDataType(S32 type) const { return ((1 << type) & getTypeMask()) ? TRUE : FALSE; } + bool hasDataType(S32 type) const { return ((1 << type) & getTypeMask()); } S32 getSize() const; S32 getIndicesSize() const { return mNumIndices * sizeof(U16); } U8* getMappedData() const { return mMappedData; } diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt index 2c68f8cf75..761e4b67b3 100644 --- a/indra/llui/CMakeLists.txt +++ b/indra/llui/CMakeLists.txt @@ -159,6 +159,7 @@ set(llui_HEADER_FILES llnotificationslistener.h llnotificationsutil.h llnotificationtemplate.h + llnotificationvisibilityrule.h llpanel.h llprogressbar.h llradiogroup.h diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp index 9d49c1a831..9e4849c58b 100644 --- a/indra/llui/llaccordionctrltab.cpp +++ b/indra/llui/llaccordionctrltab.cpp @@ -203,7 +203,8 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw() S32 width = getRect().getWidth(); S32 height = getRect().getHeight(); - gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get(),true); + F32 alpha = getCurrentTransparency(); + gl_rect_2d(0,0,width - 1 ,height - 1,mHeaderBGColor.get() % alpha,true); LLAccordionCtrlTab* parent = dynamic_cast<LLAccordionCtrlTab*>(getParent()); bool collapsible = (parent && parent->getCollapsible()); diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 65ef3e5f8f..45ceaff696 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -98,7 +98,8 @@ LLButton::Params::Params() is_toggle("is_toggle", false), scale_image("scale_image", true), hover_glow_amount("hover_glow_amount"), - commit_on_return("commit_on_return", true) + commit_on_return("commit_on_return", true), + use_draw_context_alpha("use_draw_context_alpha", true) { addSynonym(is_toggle, "toggle"); held_down_delay.seconds = 0.5f; @@ -158,7 +159,8 @@ LLButton::LLButton(const LLButton::Params& p) mLastDrawCharsCount(0), mMouseDownSignal(NULL), mMouseUpSignal(NULL), - mHeldDownSignal(NULL) + mHeldDownSignal(NULL), + mUseDrawContextAlpha(p.use_draw_context_alpha) { static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0); @@ -539,7 +541,7 @@ BOOL LLButton::handleHover(S32 x, S32 y, MASK mask) // virtual void LLButton::draw() { - F32 alpha = getDrawContext().mAlpha; + F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency(); bool flash = FALSE; static LLUICachedControl<F32> button_flash_rate("ButtonFlashRate", 0); static LLUICachedControl<S32> button_flash_count("ButtonFlashCount", 0); diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h index 2d5fefa78c..16aa49b653 100644 --- a/indra/llui/llbutton.h +++ b/indra/llui/llbutton.h @@ -124,6 +124,8 @@ public: Optional<F32> hover_glow_amount; Optional<TimeIntervalParam> held_down_delay; + Optional<bool> use_draw_context_alpha; + Params(); }; @@ -338,6 +340,8 @@ private: S32 mImageOverlayTopPad; S32 mImageOverlayBottomPad; + bool mUseDrawContextAlpha; + /* * Space between image_overlay and label */ diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp index bbd8db2645..4fe444c1a4 100644 --- a/indra/llui/llcheckboxctrl.cpp +++ b/indra/llui/llcheckboxctrl.cpp @@ -88,27 +88,19 @@ LLCheckBoxCtrl::LLCheckBoxCtrl(const LLCheckBoxCtrl::Params& p) tbparams.font(p.font); } mLabel = LLUICtrlFactory::create<LLTextBox> (tbparams); + mLabel->reshapeToFitText(); addChild(mLabel); - S32 text_width = mLabel->getTextBoundingRect().getWidth(); - S32 text_height = llround(mFont->getLineHeight()); - LLRect label_rect; - label_rect.setOriginAndSize( - llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing, - llcheckboxctrl_vpad + 1, // padding to get better alignment - text_width + llcheckboxctrl_hpad, - text_height ); - mLabel->setShape(label_rect); - + LLRect label_rect = mLabel->getRect(); // Button // Note: button cover the label by extending all the way to the right. - LLRect btn_rect; + LLRect btn_rect = p.check_button.rect(); btn_rect.setOriginAndSize( - llcheckboxctrl_hpad, - llcheckboxctrl_vpad, - llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width + llcheckboxctrl_hpad, - llmax( text_height, llcheckboxctrl_btn_size() ) + llcheckboxctrl_vpad); + btn_rect.mLeft, + btn_rect.mBottom, + llmax(btn_rect.mRight, label_rect.mRight - btn_rect.mLeft), + llmax( label_rect.getHeight(), btn_rect.mTop)); std::string active_true_id, active_false_id; std::string inactive_true_id, inactive_false_id; @@ -174,31 +166,20 @@ void LLCheckBoxCtrl::clear() void LLCheckBoxCtrl::reshape(S32 width, S32 height, BOOL called_from_parent) { - //stretch or shrink bounding rectangle of label when rebuilding UI at new scale - static LLUICachedControl<S32> llcheckboxctrl_spacing ("UICheckboxctrlSpacing", 0); - static LLUICachedControl<S32> llcheckboxctrl_hpad ("UICheckboxctrlHPad", 0); - static LLUICachedControl<S32> llcheckboxctrl_vpad ("UICheckboxctrlVPad", 0); - static LLUICachedControl<S32> llcheckboxctrl_btn_size ("UICheckboxctrlBtnSize", 0); - S32 text_width = mLabel->getTextBoundingRect().getWidth(); - S32 text_height = llround(mFont->getLineHeight()); - LLRect label_rect; - label_rect.setOriginAndSize( - llcheckboxctrl_hpad + llcheckboxctrl_btn_size + llcheckboxctrl_spacing, - llcheckboxctrl_vpad, - text_width, - text_height ); - mLabel->setShape(label_rect); - - LLRect btn_rect; + mLabel->reshapeToFitText(); + + LLRect label_rect = mLabel->getRect(); + + // Button + // Note: button cover the label by extending all the way to the right. + LLRect btn_rect = mButton->getRect(); btn_rect.setOriginAndSize( - llcheckboxctrl_hpad, - llcheckboxctrl_vpad, - llcheckboxctrl_btn_size + llcheckboxctrl_spacing + text_width, - llmax( text_height, llcheckboxctrl_btn_size() ) ); - mButton->setShape( btn_rect ); - - LLUICtrl::reshape(width, height, called_from_parent); + btn_rect.mLeft, + btn_rect.mBottom, + llmax(btn_rect.getWidth(), label_rect.mRight - btn_rect.mLeft), + llmax(label_rect.mTop - btn_rect.mBottom, btn_rect.getHeight())); + mButton->setShape(btn_rect); } //virtual diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp index 2dabbc7767..6b06040b8a 100644 --- a/indra/llui/llcombobox.cpp +++ b/indra/llui/llcombobox.cpp @@ -769,7 +769,8 @@ BOOL LLComboBox::handleKeyHere(KEY key, MASK mask) return FALSE; } // if selection has changed, pop open list - else if (mList->getLastSelectedItem() != last_selected_item) + else if (mList->getLastSelectedItem() != last_selected_item || + (key == KEY_DOWN || key == KEY_UP) && !mList->isEmpty()) { showList(); } diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp index d48674f306..f6f5a0beb3 100644 --- a/indra/llui/lldockcontrol.cpp +++ b/indra/llui/lldockcontrol.cpp @@ -220,10 +220,15 @@ void LLDockControl::moveDockable() case TOP: x = dockRect.getCenterX() - dockableRect.getWidth() / 2; y = dockRect.mTop + dockableRect.getHeight(); - // unique docking used with dock tongue, so add tongue height o the Y coordinate + // unique docking used with dock tongue, so add tongue height to the Y coordinate if (use_tongue) { y += mDockTongue->getHeight(); + + if ( y > rootRect.mTop) + { + y = rootRect.mTop; + } } // check is dockable inside root view rect @@ -257,7 +262,7 @@ void LLDockControl::moveDockable() case BOTTOM: x = dockRect.getCenterX() - dockableRect.getWidth() / 2; y = dockRect.mBottom; - // unique docking used with dock tongue, so add tongue height o the Y coordinate + // unique docking used with dock tongue, so add tongue height to the Y coordinate if (use_tongue) { y -= mDockTongue->getHeight(); @@ -292,9 +297,21 @@ void LLDockControl::moveDockable() break; } - // move dockable - dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), - dockableRect.getHeight()); + S32 max_available_height = rootRect.getHeight() - mDockTongueY - mDockTongue->getHeight(); + + // A floater should be shrunk so it doesn't cover a part of its docking tongue and + // there is a space between a dockable floater and a control to which it is docked. + if (use_tongue && dockableRect.getHeight() >= max_available_height) + { + dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), max_available_height); + mDockableFloater->reshape(dockableRect.getWidth(), dockableRect.getHeight()); + } + else + { + // move dockable + dockableRect.setLeftTopAndSize(x, y, dockableRect.getWidth(), + dockableRect.getHeight()); + } LLRect localDocableParentRect; mDockableFloater->getParent()->screenRectToLocal(dockableRect, &localDocableParentRect); diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp index b758070419..1265733bf5 100644 --- a/indra/llui/llfloater.cpp +++ b/indra/llui/llfloater.cpp @@ -1,4 +1,5 @@ /** + * @file llfloater.cpp * @brief LLFloater base class * @@ -61,7 +62,6 @@ // use this to control "jumping" behavior when Ctrl-Tabbing const S32 TABBED_FLOATER_OFFSET = 0; - std::string LLFloater::sButtonNames[BUTTON_COUNT] = { "llfloater_close_btn", //BUTTON_CLOSE @@ -200,6 +200,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)); + updateActiveFloaterTransparency(); + } + + ctrl = LLUI::sSettingGroups["config"]->getControl("InactiveFloaterTransparency").get(); + if (ctrl) + { + ctrl->getSignal()->connect(boost::bind(&LLFloater::updateInactiveFloaterTransparency)); + updateInactiveFloaterTransparency(); + } + } // defaults for floater param block pulled from widgets/floater.xml @@ -207,7 +222,7 @@ static LLWidgetNameRegistry::StaticRegistrar sRegisterFloaterParams(&typeid(LLFl LLFloater::LLFloater(const LLSD& key, const LLFloater::Params& p) : LLPanel(), // intentionally do not pass params here, see initFromParams - mDragHandle(NULL), + mDragHandle(NULL), mTitle(p.title), mShortTitle(p.short_title), mSingleInstance(p.single_instance), @@ -347,6 +362,18 @@ void LLFloater::layoutDragHandle() updateTitleButtons(); } +// static +void LLFloater::updateActiveFloaterTransparency() +{ + sActiveControlTransparency = LLUI::sSettingGroups["config"]->getF32("ActiveFloaterTransparency"); +} + +// static +void LLFloater::updateInactiveFloaterTransparency() +{ + sInactiveControlTransparency = LLUI::sSettingGroups["config"]->getF32("InactiveFloaterTransparency"); +} + void LLFloater::addResizeCtrls() { // Resize bars (sides) @@ -1163,6 +1190,7 @@ void LLFloater::setFocus( BOOL b ) last_focus->setFocus(TRUE); } } + updateTransparency(b ? TT_ACTIVE : TT_INACTIVE); } // virtual @@ -1435,6 +1463,9 @@ void LLFloater::setFrontmost(BOOL take_focus) // there are more than one floater view // so we need to query our parent directly ((LLFloaterView*)getParent())->bringToFront(this, take_focus); + + // Make sure to set the appropriate transparency type (STORM-732). + updateTransparency(hasFocus() || getIsChrome() ? TT_ACTIVE : TT_INACTIVE); } } @@ -1622,7 +1653,8 @@ void LLFloater::onClickCloseBtn() // virtual void LLFloater::draw() { - F32 alpha = getDrawContext().mAlpha; + const F32 alpha = getCurrentTransparency(); + // draw background if( isBackgroundVisible() ) { @@ -1720,7 +1752,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; @@ -1737,10 +1768,32 @@ void LLFloater::drawShadow(LLPanel* panel) shadow_color.mV[VALPHA] *= 0.5f; } gl_drop_shadow(left, top, right, bottom, - shadow_color % alpha, + shadow_color % getCurrentTransparency(), llround(shadow_offset)); } +void LLFloater::updateTransparency(LLView* view, ETypeTransparency transparency_type) +{ + child_list_t children = *view->getChildList(); + child_list_t::iterator it = children.begin(); + + LLUICtrl* ctrl = dynamic_cast<LLUICtrl*>(view); + if (ctrl) + { + ctrl->setTransparencyType(transparency_type); + } + + for(; it != children.end(); ++it) + { + updateTransparency(*it, transparency_type); + } +} + +void LLFloater::updateTransparency(ETypeTransparency transparency_type) +{ + updateTransparency(this, transparency_type); +} + void LLFloater::setCanMinimize(BOOL can_minimize) { // if removing minimize/restore button programmatically, diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h index 32d03f9f83..bb96272d02 100644 --- a/indra/llui/llfloater.h +++ b/indra/llui/llfloater.h @@ -284,6 +284,8 @@ public: static void setFloaterHost(LLMultiFloater* hostp) {sHostp = hostp; } static LLMultiFloater* getFloaterHost() {return sHostp; } + + void updateTransparency(ETypeTransparency transparency_type); protected: @@ -341,6 +343,10 @@ private: void addDragHandle(); void layoutDragHandle(); // repair layout + static void updateActiveFloaterTransparency(); + static void updateInactiveFloaterTransparency(); + void updateTransparency(LLView* view, ETypeTransparency transparency_type); + public: // Called when floater is opened, passes mKey // Public so external views or floaters can watch for this floater opening diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h index a43f095d67..8c000eee48 100644 --- a/indra/llui/llhandle.h +++ b/indra/llui/llhandle.h @@ -61,13 +61,6 @@ public: return *this; } - template<typename Subclass> - LLHandle<T>& operator =(const LLHandle<Subclass>& other) - { - mTombStone = other.mTombStone; - return *this; - } - bool isDead() const { return mTombStone->getTarget() == NULL; @@ -99,7 +92,6 @@ public: { return lhs.mTombStone > rhs.mTombStone; } -protected: protected: LLPointer<LLTombStone<T> > mTombStone; diff --git a/indra/llui/lliconctrl.cpp b/indra/llui/lliconctrl.cpp index 627957061d..47f2cfaf89 100644 --- a/indra/llui/lliconctrl.cpp +++ b/indra/llui/lliconctrl.cpp @@ -41,6 +41,7 @@ static LLDefaultChildRegistry::Register<LLIconCtrl> r("icon"); LLIconCtrl::Params::Params() : image("image_name"), color("color"), + use_draw_context_alpha("use_draw_context_alpha", true), scale_image("scale_image") { tab_stop = false; @@ -51,6 +52,7 @@ LLIconCtrl::LLIconCtrl(const LLIconCtrl::Params& p) : LLUICtrl(p), mColor(p.color()), mImagep(p.image), + mUseDrawContextAlpha(p.use_draw_context_alpha), mPriority(0), mDrawWidth(0), mDrawHeight(0) @@ -71,7 +73,8 @@ void LLIconCtrl::draw() { if( mImagep.notNull() ) { - mImagep->draw(getLocalRect(), mColor.get() % getDrawContext().mAlpha ); + const F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency(); + mImagep->draw(getLocalRect(), mColor.get() % alpha ); } LLUICtrl::draw(); diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h index 79a8b0fb28..e9bdab2d47 100644 --- a/indra/llui/lliconctrl.h +++ b/indra/llui/lliconctrl.h @@ -48,6 +48,7 @@ public: { Optional<LLUIImage*> image; Optional<LLUIColor> color; + Optional<bool> use_draw_context_alpha; Ignored scale_image; Params(); }; @@ -79,6 +80,10 @@ protected: S32 mDrawWidth ; S32 mDrawHeight ; + // If set to true (default), use the draw context transparency. + // If false, will use transparency returned by getCurrentTransparency(). See STORM-698. + bool mUseDrawContextAlpha; + private: LLUIColor mColor; LLPointer<LLUIImage> mImagep; diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 940c7e7e18..ac30fce392 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -97,6 +97,8 @@ LLLayoutStack::Params::Params() : orientation("orientation"), animate("animate", true), clip("clip", true), + open_time_constant("open_time_constant", 0.02f), + close_time_constant("close_time_constant", 0.03f), border_size("border_size", LLCachedControl<S32>(*LLUI::sSettingGroups["config"], "UIResizeBarHeight", 0)) { name="stack"; @@ -110,7 +112,9 @@ LLLayoutStack::LLLayoutStack(const LLLayoutStack::Params& p) mOrientation((p.orientation() == "vertical") ? VERTICAL : HORIZONTAL), mAnimate(p.animate), mAnimatedThisFrame(false), - mClip(p.clip) + mClip(p.clip), + mOpenTimeConstant(p.open_time_constant), + mCloseTimeConstant(p.close_time_constant) {} LLLayoutStack::~LLLayoutStack() @@ -303,9 +307,6 @@ void LLLayoutStack::updateLayout(BOOL force_resize) S32 total_width = 0; S32 total_height = 0; - const F32 ANIM_OPEN_TIME = 0.02f; - const F32 ANIM_CLOSE_TIME = 0.03f; - e_panel_list_t::iterator panel_it; for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it) { @@ -316,7 +317,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (!mAnimatedThisFrame) { - (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_OPEN_TIME)); + (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 1.f, LLCriticalDamp::getInterpolant(mOpenTimeConstant)); if ((*panel_it)->mVisibleAmt > 0.99f) { (*panel_it)->mVisibleAmt = 1.f; @@ -334,7 +335,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize) { if (!mAnimatedThisFrame) { - (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + (*panel_it)->mVisibleAmt = lerp((*panel_it)->mVisibleAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant)); if ((*panel_it)->mVisibleAmt < 0.001f) { (*panel_it)->mVisibleAmt = 0.f; @@ -349,11 +350,11 @@ void LLLayoutStack::updateLayout(BOOL force_resize) if ((*panel_it)->mCollapsed) { - (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 1.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant)); } else { - (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(ANIM_CLOSE_TIME)); + (*panel_it)->mCollapseAmt = lerp((*panel_it)->mCollapseAmt, 0.f, LLCriticalDamp::getInterpolant(mCloseTimeConstant)); } if (mOrientation == HORIZONTAL) diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index e19ef403ef..2fc6164d7a 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -46,6 +46,8 @@ public: Optional<S32> border_size; Optional<bool> animate, clip; + Optional<F32> open_time_constant, + close_time_constant; Params(); }; @@ -137,6 +139,8 @@ private: bool mAnimatedThisFrame; bool mAnimate; bool mClip; + F32 mOpenTimeConstant; + F32 mCloseTimeConstant; }; // end class LLLayoutStack class LLLayoutPanel : public LLPanel diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index 314a6a5dd2..4064b7cc84 100644 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -1533,8 +1533,11 @@ void LLLineEditor::drawBackground() { image = mBgImage; } + + if (!image) return; - F32 alpha = getDrawContext().mAlpha; + F32 alpha = getCurrentTransparency(); + // optionally draw programmatic border if (has_focus) { diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h index a1aa6b71c6..ce2dfdeeb8 100644 --- a/indra/llui/lllineeditor.h +++ b/indra/llui/lllineeditor.h @@ -336,7 +336,7 @@ protected: std::vector<S32> mPreeditPositions; LLPreeditor::standouts_t mPreeditStandouts; - LLHandle<LLView> mContextMenuHandle; + LLHandle<LLContextMenu> mContextMenuHandle; private: // Instances that by default point to the statics but can be overidden in XML. diff --git a/indra/llui/llmenubutton.cpp b/indra/llui/llmenubutton.cpp index ac568a83e4..eed0085273 100644 --- a/indra/llui/llmenubutton.cpp +++ b/indra/llui/llmenubutton.cpp @@ -175,6 +175,13 @@ void LLMenuButton::updateMenuOrigin() mY = rect.mTop + mMenuHandle.get()->getRect().getHeight(); break; } + case MP_TOP_RIGHT: + { + const LLRect& menu_rect = mMenuHandle.get()->getRect(); + mX = rect.mRight - menu_rect.getWidth(); + mY = rect.mTop + menu_rect.getHeight(); + break; + } case MP_BOTTOM_LEFT: { mX = rect.mLeft; diff --git a/indra/llui/llmenubutton.h b/indra/llui/llmenubutton.h index 9e91b9e99d..7b657595da 100644 --- a/indra/llui/llmenubutton.h +++ b/indra/llui/llmenubutton.h @@ -47,6 +47,7 @@ public: typedef enum e_menu_position { MP_TOP_LEFT, + MP_TOP_RIGHT, MP_BOTTOM_LEFT } EMenuPosition; diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index a6cf86d9b8..6c0d47ef63 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1462,7 +1462,7 @@ BOOL LLMenuItemBranchDownGL::handleAcceleratorKey(KEY key, MASK mask) { BOOL branch_visible = getBranch()->getVisible(); BOOL handled = getBranch()->handleAcceleratorKey(key, mask); - if (handled && !branch_visible && getVisible()) + if (handled && !branch_visible && isInVisibleChain()) { // flash this menu entry because we triggered an invisible menu item LLMenuHolderGL::setActivatedItem(this); @@ -2611,6 +2611,7 @@ LLMenuItemGL* LLMenuGL::getHighlightedItem() LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disabled) { + if (mItems.empty()) return NULL; // highlighting first item on a torn off menu is the // same as giving focus to it if (!cur_item && getTornOff()) @@ -2711,6 +2712,8 @@ LLMenuItemGL* LLMenuGL::highlightNextItem(LLMenuItemGL* cur_item, BOOL skip_disa LLMenuItemGL* LLMenuGL::highlightPrevItem(LLMenuItemGL* cur_item, BOOL skip_disabled) { + if (mItems.empty()) return NULL; + // highlighting first item on a torn off menu is the // same as giving focus to it if (!cur_item && getTornOff()) @@ -3045,6 +3048,11 @@ void LLMenuGL::showPopup(LLView* spawning_view, LLMenuGL* menu, S32 x, S32 y) const S32 CURSOR_HEIGHT = 22; // Approximate "normal" cursor size const S32 CURSOR_WIDTH = 12; + if(menu->getChildList()->empty()) + { + return; + } + // Save click point for detecting cursor moves before mouse-up. // Must be in local coords to compare with mouseUp events. // If the mouse doesn't move, the menu will stay open ala the Mac. @@ -3125,7 +3133,10 @@ BOOL LLMenuBarGL::handleAcceleratorKey(KEY key, MASK mask) mAltKeyTrigger = FALSE; } - if(!result && (key == KEY_F10 && mask == MASK_CONTROL) && !gKeyboard->getKeyRepeated(key)) + if(!result + && (key == KEY_F10 && mask == MASK_CONTROL) + && !gKeyboard->getKeyRepeated(key) + && isInVisibleChain()) { if (getHighlightedItem()) { @@ -3508,8 +3519,10 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent) else { //highlight first enabled one - pMenu->highlightNextItem(NULL); - handled = true; + if(pMenu->highlightNextItem(NULL)) + { + handled = true; + } } } } @@ -3742,9 +3755,7 @@ public: LLContextMenuBranch(const Params&); virtual ~LLContextMenuBranch() - { - delete mBranch; - } + {} // called to rebuild the draw label virtual void buildDrawLabel( void ); @@ -3752,21 +3763,21 @@ public: // onCommit() - do the primary funcationality of the menu item. virtual void onCommit( void ); - LLContextMenu* getBranch() { return mBranch; } + LLContextMenu* getBranch() { return mBranch.get(); } void setHighlight( BOOL highlight ); protected: void showSubMenu(); - LLContextMenu* mBranch; + LLHandle<LLContextMenu> mBranch; }; LLContextMenuBranch::LLContextMenuBranch(const LLContextMenuBranch::Params& p) : LLMenuItemGL(p), - mBranch( p.branch ) + mBranch( p.branch()->getHandle() ) { - mBranch->hide(); - mBranch->setParentMenuItem(this); + mBranch.get()->hide(); + mBranch.get()->setParentMenuItem(this); } // called to rebuild the draw label @@ -3775,12 +3786,12 @@ void LLContextMenuBranch::buildDrawLabel( void ) { // default enablement is this -- if any of the subitems are // enabled, this item is enabled. JC - U32 sub_count = mBranch->getItemCount(); + U32 sub_count = mBranch.get()->getItemCount(); U32 i; BOOL any_enabled = FALSE; for (i = 0; i < sub_count; i++) { - LLMenuItemGL* item = mBranch->getItem(i); + LLMenuItemGL* item = mBranch.get()->getItem(i); item->buildDrawLabel(); if (item->getEnabled() && !item->getDrawTextDisabled() ) { @@ -3802,13 +3813,13 @@ void LLContextMenuBranch::buildDrawLabel( void ) void LLContextMenuBranch::showSubMenu() { - LLMenuItemGL* menu_item = mBranch->getParentMenuItem(); + LLMenuItemGL* menu_item = mBranch.get()->getParentMenuItem(); if (menu_item != NULL && menu_item->getVisible()) { S32 center_x; S32 center_y; localPointToScreen(getRect().getWidth(), getRect().getHeight() , ¢er_x, ¢er_y); - mBranch->show(center_x, center_y); + mBranch.get()->show(center_x, center_y); } } @@ -3828,7 +3839,7 @@ void LLContextMenuBranch::setHighlight( BOOL highlight ) } else { - mBranch->hide(); + mBranch.get()->hide(); } } @@ -3859,6 +3870,11 @@ void LLContextMenu::setVisible(BOOL visible) // Takes cursor position in screen space? void LLContextMenu::show(S32 x, S32 y) { + if (getChildList()->empty()) + { + // nothing to show, so abort + return; + } // Save click point for detecting cursor moves before mouse-up. // Must be in local coords to compare with mouseUp events. // If the mouse doesn't move, the menu will stay open ala the Mac. diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 35544402f4..7bde8e83ec 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -678,9 +678,12 @@ public: BOOL appendContextSubMenu(LLContextMenu *menu); + LLHandle<LLContextMenu> getHandle() { mHandle.bind(this); return mHandle; } + protected: - BOOL mHoveredAnyItem; - LLMenuItemGL* mHoverItem; + BOOL mHoveredAnyItem; + LLMenuItemGL* mHoverItem; + LLRootHandle<LLContextMenu> mHandle; }; diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp index dd6c632d10..c347e15792 100644 --- a/indra/llui/llnotifications.cpp +++ b/indra/llui/llnotifications.cpp @@ -28,6 +28,7 @@ #include "llnotifications.h" #include "llnotificationtemplate.h" +#include "llnotificationvisibilityrule.h" #include "llavatarnamecache.h" #include "llinstantmessage.h" @@ -64,7 +65,7 @@ LLNotificationForm::FormElementBase::FormElementBase() LLNotificationForm::FormIgnore::FormIgnore() : text("text"), control("control"), - invert_control("invert_control", true), + invert_control("invert_control", false), save_option("save_option", false) {} @@ -137,12 +138,6 @@ private: bool filterIgnoredNotifications(LLNotificationPtr notification) { - // filter everything if we are to ignore ALL - if(LLNotifications::instance().getIgnoreAllNotifications()) - { - return false; - } - LLNotificationFormPtr form = notification->getForm(); // Check to see if the user wants to ignore this alert return !notification->getForm()->getIgnored(); @@ -177,6 +172,28 @@ bool handleIgnoredNotification(const LLSD& payload) return false; } +bool defaultResponse(const LLSD& payload) +{ + if (payload["sigtype"].asString() == "add") + { + LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID()); + if (pNotif) + { + // supply default response + pNotif->respond(pNotif->getResponseTemplate(LLNotification::WITH_DEFAULT_BUTTON)); + } + } + return false; +} + +bool visibilityRuleMached(const LLSD& payload) +{ + // This is needed because LLNotifications::isVisibleByRules may have cancelled the notification. + // Returning true here makes LLNotificationChannelBase::updateItem do an early out, which prevents things from happening in the wrong order. + return true; +} + + namespace LLNotificationFilters { // a sample filter @@ -194,7 +211,7 @@ LLNotificationForm::LLNotificationForm() LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotificationForm::Params& p) : mIgnore(IGNORE_NO), - mInvertSetting(true) // ignore settings by default mean true=show, false=ignore + mInvertSetting(false) // ignore settings by default mean true=show, false=ignore { if (p.ignore.isProvided()) { @@ -219,7 +236,7 @@ LLNotificationForm::LLNotificationForm(const std::string& name, const LLNotifica } else { - LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Ignore notification with this name", TRUE); + LLUI::sSettingGroups["ignores"]->declareBOOL(name, show_notification, "Show notification with this name", TRUE); mIgnoreSetting = LLUI::sSettingGroups["ignores"]->getControl(name); } } @@ -357,15 +374,15 @@ LLControlVariablePtr LLNotificationForm::getIgnoreSetting() bool LLNotificationForm::getIgnored() { - bool ignored = false; + bool show = true; if (mIgnore != LLNotificationForm::IGNORE_NO && mIgnoreSetting) { - ignored = mIgnoreSetting->getValue().asBoolean(); - if (mInvertSetting) ignored = !ignored; + show = mIgnoreSetting->getValue().asBoolean(); + if (mInvertSetting) show = !show; } - return ignored; + return !show; } void LLNotificationForm::setIgnored(bool ignored) @@ -373,7 +390,7 @@ void LLNotificationForm::setIgnored(bool ignored) if (mIgnoreSetting) { if (mInvertSetting) ignored = !ignored; - mIgnoreSetting->setValue(ignored); + mIgnoreSetting->setValue(!ignored); } } @@ -406,10 +423,47 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par { mUniqueContext.push_back(it->key); } + + lldebugs << "notification \"" << mName << "\": tag count is " << p.tags.size() << llendl; + + for(LLInitParam::ParamIterator<LLNotificationTemplate::Tag>::const_iterator it = p.tags.begin(), + end_it = p.tags.end(); + it != end_it; + ++it) + { + lldebugs << " tag \"" << std::string(it->value) << "\"" << llendl; + mTags.push_back(it->value); + } mForm = LLNotificationFormPtr(new LLNotificationForm(p.name, p.form_ref.form)); } +LLNotificationVisibilityRule::LLNotificationVisibilityRule(const LLNotificationVisibilityRule::Rule &p) +{ + if (p.show.isChosen()) + { + mType = p.show.type; + mTag = p.show.tag; + mName = p.show.name; + mVisible = true; + } + else if (p.hide.isChosen()) + { + mType = p.hide.type; + mTag = p.hide.tag; + mName = p.hide.name; + mVisible = false; + } + else if (p.respond.isChosen()) + { + mType = p.respond.type; + mTag = p.respond.tag; + mName = p.respond.name; + mVisible = false; + mResponse = p.respond.response; + } +} + LLNotification::LLNotification(const LLNotification::Params& p) : mTimestamp(p.time_stamp), mSubstitutions(p.substitutions), @@ -679,6 +733,25 @@ bool LLNotification::hasUniquenessConstraints() const return (mTemplatep ? mTemplatep->mUnique : false); } +bool LLNotification::matchesTag(const std::string& tag) +{ + bool result = false; + + if(mTemplatep) + { + std::list<std::string>::iterator it; + for(it = mTemplatep->mTags.begin(); it != mTemplatep->mTags.end(); it++) + { + if((*it) == tag) + { + result = true; + break; + } + } + } + + return result; +} void LLNotification::setIgnored(bool ignore) { @@ -1064,12 +1137,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)); } @@ -1184,6 +1257,7 @@ LLNotificationChannelPtr LLNotifications::getChannel(const std::string& channelN void LLNotifications::initSingleton() { loadTemplates(); + loadVisibilityRules(); createDefaultChannels(); } @@ -1191,15 +1265,19 @@ void LLNotifications::createDefaultChannels() { // now construct the various channels AFTER loading the notifications, // because the history channel is going to rewrite the stored notifications file - LLNotificationChannel::buildChannel("Expiration", "", + LLNotificationChannel::buildChannel("Enabled", "", + !boost::bind(&LLNotifications::getIgnoreAllNotifications, this)); + LLNotificationChannel::buildChannel("Expiration", "Enabled", boost::bind(&LLNotifications::expirationFilter, this, _1)); - LLNotificationChannel::buildChannel("Unexpired", "", + LLNotificationChannel::buildChannel("Unexpired", "Enabled", !boost::bind(&LLNotifications::expirationFilter, this, _1)); // use negated bind LLNotificationChannel::buildChannel("Unique", "Unexpired", boost::bind(&LLNotifications::uniqueFilter, this, _1)); LLNotificationChannel::buildChannel("Ignore", "Unique", filterIgnoredNotifications); - LLNotificationChannel::buildChannel("Visible", "Ignore", + LLNotificationChannel::buildChannel("VisibilityRules", "Ignore", + boost::bind(&LLNotifications::isVisibleByRules, this, _1)); + LLNotificationChannel::buildChannel("Visible", "VisibilityRules", &LLNotificationFilters::includeEverything); // create special persistent notification channel @@ -1207,6 +1285,8 @@ void LLNotifications::createDefaultChannels() new LLPersistentNotificationChannel(); // connect action methods to these channels + LLNotifications::instance().getChannel("Enabled")-> + connectFailedFilter(&defaultResponse); LLNotifications::instance().getChannel("Expiration")-> connectChanged(boost::bind(&LLNotifications::expirationHandler, this, _1)); // uniqueHandler slot should be added as first slot of the signal due to @@ -1218,6 +1298,8 @@ void LLNotifications::createDefaultChannels() // connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1)); LLNotifications::instance().getChannel("Ignore")-> connectFailedFilter(&handleIgnoredNotification); + LLNotifications::instance().getChannel("VisibilityRules")-> + connectFailedFilter(&visibilityRuleMached); } bool LLNotifications::addTemplate(const std::string &name, @@ -1347,6 +1429,12 @@ bool LLNotifications::loadTemplates() LLXUIParser parser; parser.readXUI(root, params, full_filename); + if(!params.validateBlock()) + { + llerrs << "Problem reading UI Notifications file: " << full_filename << llendl; + return false; + } + mTemplates.clear(); for(LLInitParam::ParamIterator<LLNotificationTemplate::GlobalString>::const_iterator it = params.strings.begin(), end_it = params.strings.end(); @@ -1396,6 +1484,34 @@ bool LLNotifications::loadTemplates() return true; } +bool LLNotifications::loadVisibilityRules() +{ + const std::string xml_filename = "notification_visibility.xml"; + std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename); + + LLNotificationVisibilityRule::Rules params; + LLSimpleXUIParser parser; + parser.readXUI(full_filename, params); + + if(!params.validateBlock()) + { + llerrs << "Problem reading UI Notification Visibility Rules file: " << full_filename << llendl; + return false; + } + + mVisibilityRules.clear(); + + for(LLInitParam::ParamIterator<LLNotificationVisibilityRule::Rule>::iterator it = params.rules.begin(), + end_it = params.rules.end(); + it != end_it; + ++it) + { + mVisibilityRules.push_back(LLNotificationVisibilityRulePtr(new LLNotificationVisibilityRule(*it))); + } + + return true; +} + // Add a simple notification (from XUI) void LLNotifications::addFromCallback(const LLSD& name) { @@ -1546,6 +1662,94 @@ bool LLNotifications::getIgnoreAllNotifications() return mIgnoreAllNotifications; } +bool LLNotifications::isVisibleByRules(LLNotificationPtr n) +{ + if(n->isRespondedTo()) + { + // This avoids infinite recursion in the case where the filter calls respond() + return true; + } + + VisibilityRuleList::iterator it; + + for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++) + { + // An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule. + + lldebugs + << "notification \"" << n->getName() << "\" " + << "testing against " << ((*it)->mVisible?"show":"hide") << " rule, " + << "name = \"" << (*it)->mName << "\" " + << "tag = \"" << (*it)->mTag << "\" " + << "type = \"" << (*it)->mType << "\" " + << llendl; + + if(!(*it)->mType.empty()) + { + if((*it)->mType != n->getType()) + { + // Type doesn't match, so skip this rule. + continue; + } + } + + if(!(*it)->mTag.empty()) + { + // check this notification's tag(s) against it->mTag and continue if no match is found. + if(!n->matchesTag((*it)->mTag)) + { + // This rule's non-empty tag didn't match one of the notification's tags. Skip this rule. + continue; + } + } + + if(!(*it)->mName.empty()) + { + // check this notification's name against the notification's name and continue if no match is found. + if((*it)->mName != n->getName()) + { + // This rule's non-empty name didn't match the notification. Skip this rule. + continue; + } + } + + // If we got here, the rule matches. Don't evaluate subsequent rules. + if(!(*it)->mVisible) + { + // This notification is being hidden. + + if((*it)->mResponse.empty()) + { + // Response property is empty. Cancel this notification. + lldebugs << "cancelling notification " << n->getName() << llendl; + + n->cancel(); + } + else + { + // Response property is not empty. Return the specified response. + LLSD response = n->getResponseTemplate(LLNotification::WITHOUT_DEFAULT_BUTTON); + // TODO: verify that the response template has an item with the correct name + response[(*it)->mResponse] = true; + + lldebugs << "responding to notification " << n->getName() << " with response = " << response << llendl; + + n->respond(response); + } + + return false; + } + + // If we got here, exit the loop and return true. + break; + } + + lldebugs << "allowing notification " << n->getName() << llendl; + + return true; +} + + // --- // END OF LLNotifications implementation // ========================================================= diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h index 524cff70e8..f8f4469958 100644 --- a/indra/llui/llnotifications.h +++ b/indra/llui/llnotifications.h @@ -270,6 +270,11 @@ struct LLNotificationTemplate; // with smart pointers typedef boost::shared_ptr<LLNotificationTemplate> LLNotificationTemplatePtr; + +struct LLNotificationVisibilityRule; + +typedef boost::shared_ptr<LLNotificationVisibilityRule> LLNotificationVisibilityRulePtr; + /** * @class LLNotification * @brief The object that expresses the details of a notification @@ -506,7 +511,7 @@ public: std::string getLabel() const; std::string getURL() const; S32 getURLOption() const; - S32 getURLOpenExternally() const; + S32 getURLOpenExternally() const; const LLNotificationFormPtr getForm(); @@ -578,6 +583,8 @@ public: bool hasUniquenessConstraints() const; + bool matchesTag(const std::string& tag); + virtual ~LLNotification() {} }; @@ -859,6 +866,10 @@ public: // OK to call more than once because it will reload bool loadTemplates(); + // load visibility rules from file; + // OK to call more than once because it will reload + bool loadVisibilityRules(); + // Add a simple notification (from XUI) void addFromCallback(const LLSD& name); @@ -904,6 +915,8 @@ public: // test for existence bool templateExists(const std::string& name); + typedef std::list<LLNotificationVisibilityRulePtr> VisibilityRuleList; + void forceResponse(const LLNotification::Params& params, S32 option); void createDefaultChannels(); @@ -919,6 +932,8 @@ public: void setIgnoreAllNotifications(bool ignore); bool getIgnoreAllNotifications(); + bool isVisibleByRules(LLNotificationPtr pNotification); + private: // we're a singleton, so we don't have a public constructor LLNotifications(); @@ -938,6 +953,8 @@ private: bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate); TemplateMap mTemplates; + VisibilityRuleList mVisibilityRules; + std::string mFileName; LLNotificationMap mUniqueNotifications; diff --git a/indra/llui/llnotificationtemplate.h b/indra/llui/llnotificationtemplate.h index 6bc0d2aaff..5a6ab40a2e 100644 --- a/indra/llui/llnotificationtemplate.h +++ b/indra/llui/llnotificationtemplate.h @@ -156,6 +156,15 @@ struct LLNotificationTemplate {} }; + struct Tag : public LLInitParam::Block<Tag> + { + Mandatory<std::string> value; + + Tag() + : value("value") + {} + }; + struct Params : public LLInitParam::Block<Params> { Mandatory<std::string> name; @@ -173,6 +182,7 @@ struct LLNotificationTemplate Optional<FormRef> form_ref; Optional<ENotificationPriority, NotificationPriorityValues> priority; + Multiple<Tag> tags; Params() @@ -189,7 +199,8 @@ struct LLNotificationTemplate expire_option("expireOption", -1), url("url"), unique("unique"), - form_ref("") + form_ref(""), + tags("tag") {} }; @@ -276,6 +287,8 @@ struct LLNotificationTemplate // this is loaded as a name, but looked up to get the UUID upon template load. // If null, it wasn't specified. LLUUID mSoundEffect; + // List of tags that rules can match against. + std::list<std::string> mTags; }; #endif //LL_LLNOTIFICATION_TEMPLATE_H diff --git a/indra/llui/llnotificationvisibilityrule.h b/indra/llui/llnotificationvisibilityrule.h new file mode 100644 index 0000000000..78bdec2a8f --- /dev/null +++ b/indra/llui/llnotificationvisibilityrule.h @@ -0,0 +1,104 @@ +/** +* @file llnotificationvisibility.h +* @brief Rules for +* @author Monroe +* +* $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_LLNOTIFICATION_VISIBILITY_RULE_H +#define LL_LLNOTIFICATION_VISIBILITY_RULE_H + +#include "llinitparam.h" +//#include "llnotifications.h" + + + +// This is the class of object read from the XML file (notification_visibility.xml, +// from the appropriate local language directory). +struct LLNotificationVisibilityRule +{ + struct Filter : public LLInitParam::Block<Filter> + { + Optional<std::string> type, + tag, + name; + + Filter() + : type("type"), + tag("tag"), + name("name") + {} + }; + + struct Respond : public LLInitParam::Block<Respond, Filter> + { + Mandatory<std::string> response; + + Respond() + : response("response") + {} + }; + + struct Rule : public LLInitParam::Choice<Rule> + { + Alternative<Filter> show; + Alternative<Filter> hide; + Alternative<Respond> respond; + + Rule() + : show("show"), + hide("hide"), + respond("respond") + {} + }; + + struct Rules : public LLInitParam::Block<Rules> + { + Multiple<Rule> rules; + + Rules() + : rules("") + {} + }; + + LLNotificationVisibilityRule(const Rule& p); + + // If true, this rule makes matching notifications visible. Otherwise, it makes them invisible. + bool mVisible; + + // Which response to give when making a notification invisible. An empty string means the notification should be cancelled instead of responded to. + std::string mResponse; + + // String to match against the notification's "type". An empty string matches all notifications. + std::string mType; + + // String to match against the notification's tag(s). An empty string matches all notifications. + std::string mTag; + + // String to match against the notification's name. An empty string matches all notifications. + std::string mName; + +}; + +#endif //LL_LLNOTIFICATION_VISIBILITY_RULE_H + diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp index 900e2c789e..b2383106a8 100644 --- a/indra/llui/llpanel.cpp +++ b/indra/llui/llpanel.cpp @@ -194,6 +194,8 @@ void LLPanel::draw() // draw background if( mBgVisible ) { + alpha = getCurrentTransparency(); + LLRect local_rect = getLocalRect(); if (mBgOpaque ) { @@ -434,7 +436,7 @@ void LLPanel::initFromParams(const LLPanel::Params& p) //and LLView::initFromParams will use them to set visible and enabled setVisible(p.visible); setEnabled(p.enabled); - + setFocusRoot(p.focus_root); setSoundFlags(p.sound_flags); // control_name, tab_stop, focus_lost_callback, initial_value, rect, enabled, visible diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index aaa328754d..ead22686bc 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -50,7 +50,7 @@ LLProgressBar::Params::Params() LLProgressBar::LLProgressBar(const LLProgressBar::Params& p) -: LLView(p), +: LLUICtrl(p), mImageBar(p.image_bar), mImageFill(p.image_fill), mColorBackground(p.color_bg()), @@ -80,7 +80,7 @@ void LLProgressBar::draw() mImageFill->draw(progress_rect, bar_color); } -void LLProgressBar::setPercent(const F32 percent) +void LLProgressBar::setValue(const LLSD& value) { - mPercentDone = llclamp(percent, 0.f, 100.f); + mPercentDone = llclamp((F32)value.asReal(), 0.f, 100.f); } diff --git a/indra/llui/llprogressbar.h b/indra/llui/llprogressbar.h index 13297f7493..3f308e7496 100644 --- a/indra/llui/llprogressbar.h +++ b/indra/llui/llprogressbar.h @@ -27,14 +27,14 @@ #ifndef LL_LLPROGRESSBAR_H #define LL_LLPROGRESSBAR_H -#include "llview.h" +#include "lluictrl.h" #include "llframetimer.h" class LLProgressBar - : public LLView + : public LLUICtrl { public: - struct Params : public LLInitParam::Block<Params, LLView::Params> + struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { Optional<LLUIImage*> image_bar, image_fill; @@ -47,7 +47,7 @@ public: LLProgressBar(const Params&); virtual ~LLProgressBar(); - void setPercent(const F32 percent); + void setValue(const LLSD& value); /*virtual*/ void draw(); diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp index cc348fdc63..6e9586369f 100644 --- a/indra/llui/llradiogroup.cpp +++ b/indra/llui/llradiogroup.cpp @@ -69,7 +69,7 @@ protected: static LLWidgetNameRegistry::StaticRegistrar register_radio_item(&typeid(LLRadioGroup::ItemParams), "radio_item"); LLRadioGroup::Params::Params() -: has_border("draw_border"), +: allow_deselect("allow_deselect"), items("item") { addSynonym(items, "radio_item"); @@ -85,18 +85,8 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p) : LLUICtrl(p), mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()), mSelectedIndex(-1), - mHasBorder(p.has_border) -{ - if (mHasBorder) - { - LLViewBorder::Params params; - params.name("radio group border"); - params.rect(LLRect(0, getRect().getHeight(), getRect().getWidth(), 0)); - params.bevel_style(LLViewBorder::BEVEL_NONE); - LLViewBorder * vb = LLUICtrlFactory::create<LLViewBorder> (params); - addChild (vb); - } -} + mAllowDeselect(p.allow_deselect) +{} void LLRadioGroup::initFromParams(const Params& p) { @@ -184,7 +174,7 @@ void LLRadioGroup::setIndexEnabled(S32 index, BOOL enabled) BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event) { - if (index < 0 || (S32)mRadioButtons.size() <= index ) + if ((S32)mRadioButtons.size() <= index ) { return FALSE; } @@ -202,13 +192,16 @@ BOOL LLRadioGroup::setSelectedIndex(S32 index, BOOL from_event) mSelectedIndex = index; - LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex]; - radio_item->setTabStop(true); - radio_item->setValue( TRUE ); - - if (hasFocus()) + if (mSelectedIndex >= 0) { - mRadioButtons[mSelectedIndex]->focusFirstItem(FALSE, FALSE); + LLRadioCtrl* radio_item = mRadioButtons[mSelectedIndex]; + radio_item->setTabStop(true); + radio_item->setValue( TRUE ); + + if (hasFocus()) + { + radio_item->focusFirstItem(FALSE, FALSE); + } } if (!from_event) @@ -307,8 +300,15 @@ void LLRadioGroup::onClickButton(LLUICtrl* ctrl) LLRadioCtrl* radio = *iter; if (radio == clicked_radio) { - // llinfos << "clicked button " << index << llendl; - setSelectedIndex(index); + if (index == mSelectedIndex && mAllowDeselect) + { + // don't select anything + setSelectedIndex(-1); + } + else + { + setSelectedIndex(index); + } // BUG: Calls click callback even if button didn't actually change onCommit(); diff --git a/indra/llui/llradiogroup.h b/indra/llui/llradiogroup.h index 0588900600..8bd5698538 100644 --- a/indra/llui/llradiogroup.h +++ b/indra/llui/llradiogroup.h @@ -49,7 +49,7 @@ public: struct Params : public LLInitParam::Block<Params, LLUICtrl::Params> { - Optional<bool> has_border; + Optional<bool> allow_deselect; Multiple<ItemParams, AtLeast<1> > items; Params(); }; @@ -73,7 +73,6 @@ public: void setIndexEnabled(S32 index, BOOL enabled); // return the index value of the selected item S32 getSelectedIndex() const { return mSelectedIndex; } - // set the index value programatically BOOL setSelectedIndex(S32 index, BOOL from_event = FALSE); @@ -103,12 +102,13 @@ public: /*virtual*/ BOOL operateOnAll(EOperation op); private: - const LLFontGL* mFont; - S32 mSelectedIndex; + const LLFontGL* mFont; + S32 mSelectedIndex; + typedef std::vector<class LLRadioCtrl*> button_list_t; - button_list_t mRadioButtons; + button_list_t mRadioButtons; - BOOL mHasBorder; + bool mAllowDeselect; // user can click on an already selected option to deselect it }; #endif diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index 3146418a7d..380c477eb2 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -422,9 +422,10 @@ void LLScrollContainer::draw() // Draw background if( mIsOpaque ) { + F32 alpha = getCurrentTransparency(); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gGL.color4fv( mBackgroundColor.get().mV ); - gl_rect_2d( mInnerRect ); + gl_rect_2d(mInnerRect, mBackgroundColor.get() % alpha); } // Draw mScrolledViews and update scroll bars. diff --git a/indra/llui/llscrolllistcolumn.cpp b/indra/llui/llscrolllistcolumn.cpp index 2a4c1ca44c..696e4a2bb1 100644 --- a/indra/llui/llscrolllistcolumn.cpp +++ b/indra/llui/llscrolllistcolumn.cpp @@ -83,7 +83,14 @@ void LLScrollColumnHeader::draw() && (sort_column == mColumn->mSortingColumn || sort_column == mColumn->mName); BOOL is_ascending = mColumn->mParentCtrl->getSortAscending(); - setImageOverlay(is_ascending ? "up_arrow.tga" : "down_arrow.tga", LLFontGL::RIGHT, draw_arrow ? LLColor4::white : LLColor4::transparent); + if (draw_arrow) + { + setImageOverlay(is_ascending ? "up_arrow.tga" : "down_arrow.tga", LLFontGL::RIGHT, LLColor4::white); + } + else + { + setImageOverlay(LLUUID::null); + } // Draw children LLButton::draw(); diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp index 7df7c13dc0..b7848ec37c 100644 --- a/indra/llui/llscrolllistctrl.cpp +++ b/indra/llui/llscrolllistctrl.cpp @@ -322,6 +322,7 @@ LLScrollListCtrl::~LLScrollListCtrl() delete mSortCallback; std::for_each(mItemList.begin(), mItemList.end(), DeletePointer()); + std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer()); } @@ -1482,8 +1483,9 @@ void LLScrollListCtrl::draw() // Draw background if (mBackgroundVisible) { + F32 alpha = getCurrentTransparency(); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gl_rect_2d(background, getEnabled() ? mBgWriteableColor.get() : mBgReadOnlyColor.get() ); + gl_rect_2d(background, getEnabled() ? mBgWriteableColor.get() % alpha : mBgReadOnlyColor.get() % alpha ); } if (mColumnsDirty) @@ -2370,10 +2372,10 @@ void LLScrollListCtrl::onScrollChange( S32 new_pos, LLScrollbar* scrollbar ) void LLScrollListCtrl::sortByColumn(const std::string& name, BOOL ascending) { - std::map<std::string, LLScrollListColumn>::iterator itor = mColumns.find(name); + column_map_t::iterator itor = mColumns.find(name); if (itor != mColumns.end()) { - sortByColumnIndex((*itor).second.mIndex, ascending); + sortByColumnIndex((*itor).second->mIndex, ascending); } } @@ -2419,11 +2421,11 @@ void LLScrollListCtrl::dirtyColumns() // just in case someone indexes into it immediately mColumnsIndexed.resize(mColumns.size()); - std::map<std::string, LLScrollListColumn>::iterator column_itor; + column_map_t::iterator column_itor; for (column_itor = mColumns.begin(); column_itor != mColumns.end(); ++column_itor) { - LLScrollListColumn *column = &column_itor->second; - mColumnsIndexed[column_itor->second.mIndex] = column; + LLScrollListColumn *column = column_itor->second; + mColumnsIndexed[column_itor->second->mIndex] = column; } } @@ -2581,8 +2583,8 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params if (mColumns.find(name) == mColumns.end()) { // Add column - mColumns[name] = LLScrollListColumn(column_params, this); - LLScrollListColumn* new_column = &mColumns[name]; + mColumns[name] = new LLScrollListColumn(column_params, this); + LLScrollListColumn* new_column = mColumns[name]; new_column->mIndex = mColumns.size()-1; // Add button @@ -2604,14 +2606,14 @@ void LLScrollListCtrl::addColumn(const LLScrollListColumn::Params& column_params S32 top = mItemListRect.mTop; S32 left = mItemListRect.mLeft; - for (std::map<std::string, LLScrollListColumn>::iterator itor = mColumns.begin(); + for (column_map_t::iterator itor = mColumns.begin(); itor != mColumns.end(); ++itor) { - if (itor->second.mIndex < new_column->mIndex && - itor->second.getWidth() > 0) + if (itor->second->mIndex < new_column->mIndex && + itor->second->getWidth() > 0) { - left += itor->second.getWidth() + mColumnPadding; + left += itor->second->getWidth() + mColumnPadding; } } @@ -2667,8 +2669,8 @@ void LLScrollListCtrl::onClickColumn(void *userdata) if (column->mSortingColumn != column->mName && parent->mColumns.find(column->mSortingColumn) != parent->mColumns.end()) { - LLScrollListColumn& info_redir = parent->mColumns[column->mSortingColumn]; - column_index = info_redir.mIndex; + LLScrollListColumn* info_redir = parent->mColumns[column->mSortingColumn]; + column_index = info_redir->mIndex; } // if this column is the primary sort key, reverse the direction @@ -2701,16 +2703,17 @@ BOOL LLScrollListCtrl::hasSortOrder() const void LLScrollListCtrl::clearColumns() { - std::map<std::string, LLScrollListColumn>::iterator itor; + column_map_t::iterator itor; for (itor = mColumns.begin(); itor != mColumns.end(); ++itor) { - LLScrollColumnHeader *header = itor->second.mHeader; + LLScrollColumnHeader *header = itor->second->mHeader; if (header) { removeChild(header); delete header; } } + std::for_each(mColumns.begin(), mColumns.end(), DeletePairedPointer()); mColumns.clear(); mSortColumns.clear(); mTotalStaticColumnWidth = 0; @@ -2744,7 +2747,7 @@ LLScrollListColumn* LLScrollListCtrl::getColumn(const std::string& name) column_map_t::iterator column_itor = mColumns.find(name); if (column_itor != mColumns.end()) { - return &column_itor->second; + return column_itor->second; } return NULL; } @@ -2805,7 +2808,7 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS new_column.width.pixel_width = cell_p.width; } addColumn(new_column); - columnp = &mColumns[column]; + columnp = mColumns[column]; new_item->setNumColumns(mColumns.size()); } @@ -2842,7 +2845,7 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS LLScrollListCell* cell = LLScrollListCell::create(LLScrollListCell::Params().value(item_p.value)); if (cell) { - LLScrollListColumn* columnp = &(mColumns.begin()->second); + LLScrollListColumn* columnp = mColumns.begin()->second; new_item->setColumn(0, cell); if (columnp->mHeader @@ -2857,10 +2860,10 @@ LLScrollListItem* LLScrollListCtrl::addRow(LLScrollListItem *new_item, const LLS // add dummy cells for missing columns for (column_map_t::iterator column_it = mColumns.begin(); column_it != mColumns.end(); ++column_it) { - S32 column_idx = column_it->second.mIndex; + S32 column_idx = column_it->second->mIndex; if (new_item->getColumn(column_idx) == NULL) { - LLScrollListColumn* column_ptr = &column_it->second; + LLScrollListColumn* column_ptr = column_it->second; LLScrollListCell::Params cell_p; cell_p.width = column_ptr->getWidth(); diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h index 8a2f893ba2..09ab89960d 100644 --- a/indra/llui/llscrolllistctrl.h +++ b/indra/llui/llscrolllistctrl.h @@ -491,7 +491,7 @@ private: mutable bool mSorted; - typedef std::map<std::string, LLScrollListColumn> column_map_t; + typedef std::map<std::string, LLScrollListColumn*> column_map_t; column_map_t mColumns; BOOL mDirty; diff --git a/indra/llui/llsdparam.cpp b/indra/llui/llsdparam.cpp index f97f80ab6c..9ad13054cb 100644 --- a/indra/llui/llsdparam.cpp +++ b/indra/llui/llsdparam.cpp @@ -45,6 +45,7 @@ LLParamSDParser::LLParamSDParser() if (sReadFuncs.empty()) { + registerParserFuncs<LLInitParam::NoParamValue>(readNoValue, &LLParamSDParser::writeNoValue); registerParserFuncs<S32>(readS32, &LLParamSDParser::writeTypedValue<S32>); registerParserFuncs<U32>(readU32, &LLParamSDParser::writeU32Param); registerParserFuncs<F32>(readF32, &LLParamSDParser::writeTypedValue<F32>); @@ -71,6 +72,18 @@ bool LLParamSDParser::writeU32Param(LLParamSDParser::parser_t& parser, const voi return true; } +bool LLParamSDParser::writeNoValue(LLParamSDParser::parser_t& parser, const void* val_ptr, const parser_t::name_stack_t& name_stack) +{ + LLParamSDParser& sdparser = static_cast<LLParamSDParser&>(parser); + if (!sdparser.mWriteRootSD) return false; + + LLSD* sd_to_write = sdparser.getSDWriteNode(name_stack); + if (!sd_to_write) return false; + + return true; +} + + void LLParamSDParser::readSD(const LLSD& sd, LLInitParam::BaseBlock& block, bool silent) { mCurReadSD = NULL; @@ -87,6 +100,8 @@ void LLParamSDParser::writeSD(LLSD& sd, const LLInitParam::BaseBlock& block) block.serializeBlock(*this); } +const LLSD NO_VALUE_MARKER; + void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block) { if (sd.isMap()) @@ -110,6 +125,11 @@ void LLParamSDParser::readSDValues(const LLSD& sd, LLInitParam::BaseBlock& block readSDValues(*it, block); } } + else if (sd.isUndefined()) + { + mCurReadSD = &NO_VALUE_MARKER; + block.submitValue(mNameStack, *this); + } else { mCurReadSD = &sd; @@ -206,6 +226,13 @@ LLSD* LLParamSDParser::getSDWriteNode(const parser_t::name_stack_t& name_stack) return sd_to_write; } +bool LLParamSDParser::readNoValue(Parser& parser, void* val_ptr) +{ + LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); + return self.mCurReadSD == &NO_VALUE_MARKER; +} + + bool LLParamSDParser::readS32(Parser& parser, void* val_ptr) { LLParamSDParser& self = static_cast<LLParamSDParser&>(parser); diff --git a/indra/llui/llsdparam.h b/indra/llui/llsdparam.h index 97e8b58e49..69dab2b411 100644 --- a/indra/llui/llsdparam.h +++ b/indra/llui/llsdparam.h @@ -63,7 +63,9 @@ private: LLSD* getSDWriteNode(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 writeNoValue(Parser& parser, const void* value_ptr, const parser_t::name_stack_t& name_stack); + static bool readNoValue(Parser& parser, void* val_ptr); static bool readS32(Parser& parser, void* val_ptr); static bool readU32(Parser& parser, void* val_ptr); static bool readF32(Parser& parser, void* val_ptr); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 55a1d3ef41..333513d7d7 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -1005,6 +1005,7 @@ void LLTextBase::draw() if (mBGVisible) { + F32 alpha = getCurrentTransparency(); // clip background rect against extents, if we support scrolling LLRect bg_rect = mVisibleTextRect; if (mScroller) @@ -1016,7 +1017,7 @@ void LLTextBase::draw() : hasFocus() ? mFocusBgColor.get() : mWriteableBgColor.get(); - gl_rect_2d(doc_rect, bg_color, TRUE); + gl_rect_2d(doc_rect, bg_color % alpha, TRUE); } // draw document view diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp index ff9af21e54..c300fe55d9 100644 --- a/indra/llui/llui.cpp +++ b/indra/llui/llui.cpp @@ -950,7 +950,7 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor } // Draw gray and white checkerboard with black border -void gl_rect_2d_checkerboard(const LLRect& rect) +void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha) { // Initialize the first time this is called. const S32 PIXELS = 32; @@ -971,11 +971,11 @@ void gl_rect_2d_checkerboard(const LLRect& rect) gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); // ...white squares - gGL.color3f( 1.f, 1.f, 1.f ); + gGL.color4f( 1.f, 1.f, 1.f, alpha ); gl_rect_2d(rect); // ...gray squares - gGL.color3f( .7f, .7f, .7f ); + gGL.color4f( .7f, .7f, .7f, alpha ); gGL.flush(); glPolygonStipple( checkerboard ); @@ -1596,23 +1596,25 @@ void LLUI::initClass(const settings_map_t& settings, sWindow = NULL; // set later in startup LLFontGL::sShadowColor = LLUIColorTable::instance().getColor("ColorDropShadow"); + LLUICtrl::CommitCallbackRegistry::Registrar& reg = LLUICtrl::CommitCallbackRegistry::defaultRegistrar(); + // Callbacks for associating controls with floater visibilty: - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2)); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2)); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2)); - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2)); + reg.add("Floater.Toggle", boost::bind(&LLFloaterReg::toggleFloaterInstance, _2)); + reg.add("Floater.Show", boost::bind(&LLFloaterReg::showFloaterInstance, _2)); + reg.add("Floater.Hide", boost::bind(&LLFloaterReg::hideFloaterInstance, _2)); + reg.add("Floater.InitToVisibilityControl", boost::bind(&LLFloaterReg::initUICtrlToFloaterVisibilityControl, _1, _2)); // Button initialization callback for toggle buttons - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2)); + reg.add("Button.SetFloaterToggle", boost::bind(&LLButton::setFloaterToggle, _1, _2)); // Button initialization callback for toggle buttons on dockale floaters - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2)); + reg.add("Button.SetDockableFloaterToggle", boost::bind(&LLButton::setDockableFloaterToggle, _1, _2)); // Display the help topic for the current context - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2)); + reg.add("Button.ShowHelp", boost::bind(&LLButton::showHelp, _1, _2)); // Currently unused, but kept for reference: - LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2)); + reg.add("Button.ToggleFloater", boost::bind(&LLButton::toggleFloaterAndSetToggleState, _1, _2)); // Used by menus along with Floater.Toggle to display visibility as a checkmark LLUICtrl::EnableCallbackRegistry::defaultRegistrar().add("Floater.Visible", boost::bind(&LLFloaterReg::floaterInstanceVisible, _2)); @@ -1620,7 +1622,10 @@ void LLUI::initClass(const settings_map_t& settings, void LLUI::cleanupClass() { - sImageProvider->cleanUp(); + if(sImageProvider) + { + sImageProvider->cleanUp(); + } } void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups) diff --git a/indra/llui/llui.h b/indra/llui/llui.h index fc545c85d5..62d10df8b2 100644 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -79,7 +79,7 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LL void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset = 0, BOOL filled = TRUE ); void gl_rect_2d(const LLRect& rect, BOOL filled = TRUE ); void gl_rect_2d(const LLRect& rect, const LLColor4& color, BOOL filled = TRUE ); -void gl_rect_2d_checkerboard(const LLRect& rect); +void gl_rect_2d_checkerboard(const LLRect& rect, GLfloat alpha = 1.0f); void gl_drop_shadow(S32 left, S32 top, S32 right, S32 bottom, const LLColor4 &start_color, S32 lines); diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp index 0641f6d175..9455d09cc0 100644 --- a/indra/llui/lluicolortable.cpp +++ b/indra/llui/lluicolortable.cpp @@ -215,6 +215,12 @@ bool LLUIColorTable::loadFromSettings() result |= loadFromFilename(current_filename, mLoadedColors); } + current_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SKIN, "colors.xml"); + if(current_filename != default_filename) + { + result |= loadFromFilename(current_filename, mLoadedColors); + } + std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml"); loadFromFilename(user_filename, mUserSetColors); diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp index 3ac3bf8c41..afd60cbb3e 100644 --- a/indra/llui/lluictrl.cpp +++ b/indra/llui/lluictrl.cpp @@ -36,6 +36,9 @@ static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl"); +F32 LLUICtrl::sActiveControlTransparency = 1.0f; +F32 LLUICtrl::sInactiveControlTransparency = 1.0f; + // Compiler optimization, generate extern template template class LLUICtrl* LLView::getChild<class LLUICtrl>( const std::string& name, BOOL recurse) const; @@ -110,7 +113,8 @@ LLUICtrl::LLUICtrl(const LLUICtrl::Params& p, const LLViewModelPtr& viewmodel) mMouseUpSignal(NULL), mRightMouseDownSignal(NULL), mRightMouseUpSignal(NULL), - mDoubleClickSignal(NULL) + mDoubleClickSignal(NULL), + mTransparencyType(TT_DEFAULT) { mUICtrlHandle.bind(this); } @@ -923,6 +927,37 @@ BOOL LLUICtrl::getTentative() const void LLUICtrl::setColor(const LLColor4& color) { } +F32 LLUICtrl::getCurrentTransparency() +{ + F32 alpha = 0; + + switch(mTransparencyType) + { + case TT_DEFAULT: + alpha = getDrawContext().mAlpha; + break; + + case TT_ACTIVE: + alpha = sActiveControlTransparency; + break; + + case TT_INACTIVE: + alpha = sInactiveControlTransparency; + break; + + case TT_FADING: + alpha = sInactiveControlTransparency / 2; + break; + } + + return alpha; +} + +void LLUICtrl::setTransparencyType(ETypeTransparency type) +{ + mTransparencyType = type; +} + boost::signals2::connection LLUICtrl::setCommitCallback( const commit_signal_t::slot_type& cb ) { if (!mCommitSignal) mCommitSignal = new commit_signal_t(); diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h index 76dfdf754c..b37e9f6b1b 100644 --- a/indra/llui/lluictrl.h +++ b/indra/llui/lluictrl.h @@ -120,6 +120,13 @@ public: Params(); }; + enum ETypeTransparency + { + TT_DEFAULT, + TT_ACTIVE, // focused floater + TT_INACTIVE, // other floaters + TT_FADING, // fading toast + }; /*virtual*/ ~LLUICtrl(); void initFromParams(const Params& p); @@ -202,6 +209,11 @@ public: virtual void setColor(const LLColor4& color); + F32 getCurrentTransparency(); + + void setTransparencyType(ETypeTransparency type); + ETypeTransparency getTransparencyType() const {return mTransparencyType;} + BOOL focusNextItem(BOOL text_entry_only); BOOL focusPrevItem(BOOL text_entry_only); BOOL focusFirstItem(BOOL prefer_text_fields = FALSE, BOOL focus_flash = TRUE ); @@ -283,6 +295,10 @@ protected: boost::signals2::connection mMakeVisibleControlConnection; LLControlVariable* mMakeInvisibleControlVariable; boost::signals2::connection mMakeInvisibleControlConnection; + + static F32 sActiveControlTransparency; + static F32 sInactiveControlTransparency; + private: BOOL mTabStop; @@ -290,6 +306,8 @@ private: BOOL mTentative; LLRootHandle<LLUICtrl> mUICtrlHandle; + ETypeTransparency mTransparencyType; + class DefaultTabGroupFirstSorter; }; diff --git a/indra/llui/lluistring.h b/indra/llui/lluistring.h index 4faa0e070e..cb40c85582 100644 --- a/indra/llui/lluistring.h +++ b/indra/llui/lluistring.h @@ -61,7 +61,6 @@ public: LLUIString() : mArgs(NULL), mNeedsResult(false), mNeedsWResult(false) {} LLUIString(const std::string& instring, const LLStringUtil::format_map_t& args); LLUIString(const std::string& instring) : mArgs(NULL) { assign(instring); } - ~LLUIString() { delete mArgs; } void assign(const std::string& instring); diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp index 84678ef4db..e51f28e2e9 100644 --- a/indra/llui/llurlentry.cpp +++ b/indra/llui/llurlentry.cpp @@ -27,6 +27,7 @@ #include "linden_common.h" #include "llurlentry.h" +#include "lluictrl.h" #include "lluri.h" #include "llurlmatch.h" #include "llurlregistry.h" @@ -167,6 +168,15 @@ void LLUrlEntryBase::callObservers(const std::string &id, } } +/// is this a match for a URL that should not be hyperlinked? +bool LLUrlEntryBase::isLinkDisabled() const +{ + // this allows us to have a global setting to turn off text hyperlink highlighting/action + bool globally_disabled = LLUI::sSettingGroups["config"]->getBOOL("DisableTextHyperlinkActions"); + + return globally_disabled; +} + static std::string getStringAfterToken(const std::string str, const std::string token) { size_t pos = str.find(token); @@ -209,7 +219,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 @@ -450,8 +466,8 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa 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"); + style_params.color = LLUIColorTable::instance().getColor("HTMLLinkColor"); + style_params.readonly_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); return style_params; } diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h index f6424c28b8..43a667c390 100644 --- a/indra/llui/llurlentry.h +++ b/indra/llui/llurlentry.h @@ -94,6 +94,8 @@ public: virtual LLUUID getID(const std::string &string) const { return LLUUID::null; } + bool isLinkDisabled() const; + protected: std::string getIDStringFromUrl(const std::string &url) const; std::string escapeUrl(const std::string &url) const; @@ -133,6 +135,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; }; @@ -182,7 +185,7 @@ private: /// 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 +class LLUrlEntryAgentName : public LLUrlEntryBase, public boost::signals2::trackable { public: LLUrlEntryAgentName(); diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 6d36cf54c8..e32b349df4 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -102,6 +102,7 @@ LLView::Params::Params() left_pad("left_pad"), left_delta("left_delta", S32_MAX), from_xui("from_xui", false), + focus_root("focus_root", false), needs_translate("translate"), xmlns("xmlns"), xmlns_xsi("xmlns:xsi"), @@ -118,7 +119,7 @@ LLView::LLView(const LLView::Params& p) mParentView(NULL), mReshapeFlags(FOLLOWS_NONE), mFromXUI(p.from_xui), - mIsFocusRoot(FALSE), + mIsFocusRoot(p.focus_root), mLastVisible(FALSE), mNextInsertionOrdinal(0), mHoverCursor(getCursorFromString(p.hover_cursor)), @@ -163,8 +164,6 @@ LLView::~LLView() if (mDefaultWidgets) { - std::for_each(mDefaultWidgets->begin(), mDefaultWidgets->end(), - DeletePairedPointer()); delete mDefaultWidgets; mDefaultWidgets = NULL; } @@ -1688,18 +1687,7 @@ BOOL LLView::hasChild(const std::string& childname, BOOL recurse) const //----------------------------------------------------------------------------- LLView* LLView::getChildView(const std::string& name, BOOL recurse) const { - LLView* child = findChildView(name, recurse); - if (!child) - { - child = getDefaultWidget<LLView>(name); - if (!child) - { - LLView::Params view_params; - view_params.name = name; - child = LLUICtrlFactory::create<LLView>(view_params); - } - } - return child; + return getChild<LLView>(name, recurse); } static LLFastTimer::DeclareTimer FTM_FIND_VIEWS("Find Widgets"); @@ -2810,11 +2798,14 @@ LLView::root_to_view_iterator_t LLView::endRootToView() // only create maps on demand, as they incur heap allocation/deallocation cost // when a view is constructed/deconstructed -LLView::default_widget_map_t& LLView::getDefaultWidgetMap() const +LLView& LLView::getDefaultWidgetContainer() const { if (!mDefaultWidgets) { - mDefaultWidgets = new default_widget_map_t(); + LLView::Params p; + p.name = "default widget container"; + p.visible = false; // ensures default widgets can't steal focus, etc. + mDefaultWidgets = new LLView(p); } return *mDefaultWidgets; } diff --git a/indra/llui/llview.h b/indra/llui/llview.h index cc1e9e3583..b7cd87e269 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -116,7 +116,8 @@ public: visible, mouse_opaque, use_bounding_rect, - from_xui; + from_xui, + focus_root; Optional<S32> tab_group, default_tab_group; @@ -466,12 +467,8 @@ public: template <class T> T* getDefaultWidget(const std::string& name) const { - default_widget_map_t::const_iterator found_it = getDefaultWidgetMap().find(name); - if (found_it == getDefaultWidgetMap().end()) - { - return NULL; - } - return dynamic_cast<T*>(found_it->second); + LLView* widgetp = getDefaultWidgetContainer().findChildView(name); + return dynamic_cast<T*>(widgetp); } ////////////////////////////////////////////// @@ -585,9 +582,9 @@ private: typedef std::map<std::string, LLView*> default_widget_map_t; // allocate this map no demand, as it is rarely needed - mutable default_widget_map_t* mDefaultWidgets; + mutable LLView* mDefaultWidgets; - default_widget_map_t& getDefaultWidgetMap() const; + LLView& getDefaultWidgetContainer() const; public: // Depth in view hierarchy during rendering @@ -654,7 +651,7 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co return NULL; } - getDefaultWidgetMap()[name] = result; + getDefaultWidgetContainer().addChild(result); } } return result; diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp index 5c6623da61..59c0826ad7 100644 --- a/indra/llui/tests/llurlentry_test.cpp +++ b/indra/llui/tests/llurlentry_test.cpp @@ -27,6 +27,7 @@ #include "linden_common.h" #include "../llurlentry.h" +#include "../lluictrl.h" #include "llurlentry_stub.cpp" #include "lltut.h" #include "../lluicolortable.h" @@ -34,6 +35,14 @@ #include <boost/regex.hpp> +typedef std::map<std::string, LLControlGroup*> settings_map_t; +settings_map_t LLUI::sSettingGroups; + +BOOL LLControlGroup::getBOOL(const std::string& name) +{ + return false; +} + LLUIColor LLUIColorTable::getColor(const std::string& name, const LLColor4& default_color) const { return LLUIColor(); diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index 938fb008c9..64556bcb4c 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(); @@ -382,11 +382,7 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd break; case LL_PATH_USER_SKIN: - prefix = getOSUserAppDir(); - prefix += mDirDelimiter; - prefix += "user_settings"; - prefix += mDirDelimiter; - prefix += "skins"; + prefix = getUserSkinDir(); break; case LL_PATH_SKINS: 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 a1c6669b97..73f2336f94 100644 --- a/indra/llvfs/lldir_linux.cpp +++ b/indra/llvfs/lldir_linux.cpp @@ -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 52d864e26f..33718e520d 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -206,14 +206,6 @@ void LLDir_Win32::initAppDirs(const std::string &app_name, } } - res = LLFile::mkdir(getExpandedFilename(LL_PATH_USER_SKIN,"")); - if (res == -1) - { - if (errno != EEXIST) - { - llwarns << "Couldn't create LL_PATH_SKINS dir " << getExpandedFilename(LL_PATH_USER_SKIN,"") << llendl; - } - } mCAFile = getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem"); } @@ -246,21 +238,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 +257,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..8788bd63e8 100644 --- a/indra/llvfs/tests/lldir_test.cpp +++ b/indra/llvfs/tests/lldir_test.cpp @@ -256,5 +256,160 @@ 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 ); + // Harbison & Steele, 4th ed., p. 366: "If an error occurs, fputs + // returns EOF; otherwise, it returns some other, nonnegative value." + ensure("failed to write to test file '"+path+"'", fputs("test file", handle) >= 0); + 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/llwindow/llkeyboard.h b/indra/llwindow/llkeyboard.h index be16f31abc..ba472cfde5 100644 --- a/indra/llwindow/llkeyboard.h +++ b/indra/llwindow/llkeyboard.h @@ -40,7 +40,7 @@ enum EKeystate KEYSTATE_UP }; -typedef void (*LLKeyFunc)(EKeystate keystate); +typedef boost::function<void(EKeystate keystate)> LLKeyFunc; typedef std::string (LLKeyStringTranslatorFunc)(const char *label); enum EKeyboardInsertMode diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index 87075c7318..ab089081e6 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -544,7 +544,27 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks, if (closest_refresh == 0) { LL_WARNS("Window") << "Couldn't find display mode " << width << " by " << height << " at " << BITS_PER_PIXEL << " bits per pixel" << LL_ENDL; - success = FALSE; + //success = FALSE; + + if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dev_mode)) + { + success = FALSE; + } + else + { + if (dev_mode.dmBitsPerPel == BITS_PER_PIXEL) + { + LL_WARNS("Window") << "Current BBP is OK falling back to that" << LL_ENDL; + window_rect.right=width=dev_mode.dmPelsWidth; + window_rect.bottom=height=dev_mode.dmPelsHeight; + success = TRUE; + } + else + { + LL_WARNS("Window") << "Current BBP is BAD" << LL_ENDL; + success = FALSE; + } + } } // If we found a good resolution, use it. diff --git a/indra/llxml/llcontrol.cpp b/indra/llxml/llcontrol.cpp index f9a39826f5..6c72609122 100644 --- a/indra/llxml/llcontrol.cpp +++ b/indra/llxml/llcontrol.cpp @@ -170,6 +170,20 @@ LLSD LLControlVariable::getComparableValue(const LLSD& value) storable_value = false; } } + else if (TYPE_LLSD == type() && value.isString()) + { + LLPointer<LLSDNotationParser> parser = new LLSDNotationParser; + LLSD result; + std::stringstream value_stream(value.asString()); + if (parser->parse(value_stream, result, LLSDSerialize::SIZE_UNLIMITED) != LLSDParser::PARSE_FAILURE) + { + storable_value = result; + } + else + { + storable_value = value; + } + } else { storable_value = value; @@ -1107,7 +1121,7 @@ bool convert_from_llsd<bool>(const LLSD& sd, eControlType type, const std::strin return sd.asBoolean(); else { - CONTROL_ERRS << "Invalid BOOL value" << llendl; + CONTROL_ERRS << "Invalid BOOL value for " << control_name << ": " << sd << llendl; return FALSE; } } @@ -1119,7 +1133,7 @@ S32 convert_from_llsd<S32>(const LLSD& sd, eControlType type, const std::string& return sd.asInteger(); else { - CONTROL_ERRS << "Invalid S32 value" << llendl; + CONTROL_ERRS << "Invalid S32 value for " << control_name << ": " << sd << llendl; return 0; } } @@ -1131,7 +1145,7 @@ U32 convert_from_llsd<U32>(const LLSD& sd, eControlType type, const std::string& return sd.asInteger(); else { - CONTROL_ERRS << "Invalid U32 value" << llendl; + CONTROL_ERRS << "Invalid U32 value for " << control_name << ": " << sd << llendl; return 0; } } @@ -1143,7 +1157,7 @@ F32 convert_from_llsd<F32>(const LLSD& sd, eControlType type, const std::string& return (F32) sd.asReal(); else { - CONTROL_ERRS << "Invalid F32 value" << llendl; + CONTROL_ERRS << "Invalid F32 value for " << control_name << ": " << sd << llendl; return 0.0f; } } @@ -1155,7 +1169,7 @@ std::string convert_from_llsd<std::string>(const LLSD& sd, eControlType type, co return sd.asString(); else { - CONTROL_ERRS << "Invalid string value" << llendl; + CONTROL_ERRS << "Invalid string value for " << control_name << ": " << sd << llendl; return LLStringUtil::null; } } @@ -1173,7 +1187,7 @@ LLVector3 convert_from_llsd<LLVector3>(const LLSD& sd, eControlType type, const return (LLVector3)sd; else { - CONTROL_ERRS << "Invalid LLVector3 value" << llendl; + CONTROL_ERRS << "Invalid LLVector3 value for " << control_name << ": " << sd << llendl; return LLVector3::zero; } } @@ -1185,7 +1199,7 @@ LLVector3d convert_from_llsd<LLVector3d>(const LLSD& sd, eControlType type, cons return (LLVector3d)sd; else { - CONTROL_ERRS << "Invalid LLVector3d value" << llendl; + CONTROL_ERRS << "Invalid LLVector3d value for " << control_name << ": " << sd << llendl; return LLVector3d::zero; } } @@ -1197,7 +1211,7 @@ LLRect convert_from_llsd<LLRect>(const LLSD& sd, eControlType type, const std::s return LLRect(sd); else { - CONTROL_ERRS << "Invalid rect value" << llendl; + CONTROL_ERRS << "Invalid rect value for " << control_name << ": " << sd << llendl; return LLRect::null; } } @@ -1211,19 +1225,19 @@ LLColor4 convert_from_llsd<LLColor4>(const LLSD& sd, eControlType type, const st LLColor4 color(sd); if (color.mV[VRED] < 0.f || color.mV[VRED] > 1.f) { - llwarns << "Color " << control_name << " value out of range " << llendl; + llwarns << "Color " << control_name << " red value out of range: " << color << llendl; } else if (color.mV[VGREEN] < 0.f || color.mV[VGREEN] > 1.f) { - llwarns << "Color " << control_name << " value out of range " << llendl; + llwarns << "Color " << control_name << " green value out of range: " << color << llendl; } else if (color.mV[VBLUE] < 0.f || color.mV[VBLUE] > 1.f) { - llwarns << "Color " << control_name << " value out of range " << llendl; + llwarns << "Color " << control_name << " blue value out of range: " << color << llendl; } else if (color.mV[VALPHA] < 0.f || color.mV[VALPHA] > 1.f) { - llwarns << "Color " << control_name << " value out of range " << llendl; + llwarns << "Color " << control_name << " alpha value out of range: " << color << llendl; } return LLColor4(sd); @@ -1242,7 +1256,7 @@ LLColor3 convert_from_llsd<LLColor3>(const LLSD& sd, eControlType type, const st return sd; else { - CONTROL_ERRS << "Invalid LLColor3 value" << llendl; + CONTROL_ERRS << "Invalid LLColor3 value for " << control_name << ": " << sd << llendl; return LLColor3::white; } } diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 2c92539387..fcdbaa4309 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -312,6 +312,14 @@ namespace LLInitParam } } + // if no match, and no names left on stack, this is just an existence assertion of this block + // verify by calling readValue with NoParamValue type, an inherently unparseable type + if (!names_left) + { + NoParamValue no_value; + return p.readValue(no_value); + } + return false; } diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 8cb5bd80fc..1f9045754a 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -278,6 +278,9 @@ namespace LLInitParam S32 mParseGeneration; }; + // used to indicate no matching value to a given name when parsing + struct NoParamValue{}; + class BaseBlock; class Param @@ -303,8 +306,8 @@ namespace LLInitParam private: friend class BaseBlock; - bool mIsProvided; U16 mEnclosingBlockOffset; + bool mIsProvided; }; // various callbacks and constraints associated with an individual param diff --git a/indra/llxuixml/llregistry.h b/indra/llxuixml/llregistry.h index eee9933739..36ce6a97b7 100644 --- a/indra/llxuixml/llregistry.h +++ b/indra/llxuixml/llregistry.h @@ -343,4 +343,9 @@ private: ScopedRegistrar* mStaticScope; }; +// helper macro for doing static registration +#define GLUED_TOKEN(x, y) x ## y +#define GLUE_TOKENS(x, y) GLUED_TOKEN(x, y) +#define LLREGISTER_STATIC(REGISTRY, KEY, VALUE) static REGISTRY::StaticRegistrar GLUE_TOKENS(reg, __LINE__)(KEY, VALUE); + #endif diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp index 9942af6b37..72a7bb7af5 100644 --- a/indra/llxuixml/llxuiparser.cpp +++ b/indra/llxuixml/llxuiparser.cpp @@ -388,6 +388,7 @@ LLXUIParser::LLXUIParser() { if (sXUIReadFuncs.empty()) { + registerParserFuncs<LLInitParam::NoParamValue>(readNoValue, writeNoValue); registerParserFuncs<bool>(readBoolValue, writeBoolValue); registerParserFuncs<std::string>(readStringValue, writeStringValue); registerParserFuncs<U8>(readU8Value, writeU8Value); @@ -406,6 +407,7 @@ LLXUIParser::LLXUIParser() } static LLFastTimer::DeclareTimer FTM_PARSE_XUI("XUI Parsing"); +const LLXMLNodePtr DUMMY_NODE = new LLXMLNode(); void LLXUIParser::readXUI(LLXMLNodePtr node, LLInitParam::BaseBlock& block, const std::string& filename, bool silent) { @@ -432,6 +434,17 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) boost::char_separator<char> sep("."); bool values_parsed = false; + bool silent = mCurReadDepth > 0; + + if (nodep->getFirstChild().isNull() + && nodep->mAttributes.empty() + && nodep->getSanitizedValue().empty()) + { + // empty node, just parse as NoValue + mCurReadNode = DUMMY_NODE; + return block.submitValue(mNameStack, *this, silent); + } + // submit attributes for current node values_parsed |= readAttributes(nodep, block); @@ -444,7 +457,6 @@ bool LLXUIParser::readXUIImpl(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block) mNameStack.push_back(std::make_pair(std::string("value"), newParseGeneration())); // child nodes are not necessarily valid parameters (could be a child widget) // so don't complain once we've recursed - bool silent = mCurReadDepth > 0; if (!block.submitValue(mNameStack, *this, true)) { mNameStack.pop_back(); @@ -549,6 +561,7 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo boost::char_separator<char> sep("."); bool any_parsed = false; + bool silent = mCurReadDepth > 0; for(LLXMLAttribList::const_iterator attribute_it = nodep->mAttributes.begin(); attribute_it != nodep->mAttributes.end(); @@ -567,7 +580,6 @@ bool LLXUIParser::readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& blo } // child nodes are not necessarily valid attributes, so don't complain once we've recursed - bool silent = mCurReadDepth > 0; any_parsed |= block.submitValue(mNameStack, *this, silent); while(num_tokens_pushed-- > 0) @@ -634,6 +646,19 @@ LLXMLNodePtr LLXUIParser::getNode(const name_stack_t& stack) return (out_node == mWriteRootNode ? LLXMLNodePtr(NULL) : out_node); } +bool LLXUIParser::readNoValue(Parser& parser, void* val_ptr) +{ + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + return self.mCurReadNode == DUMMY_NODE; +} + +bool LLXUIParser::writeNoValue(Parser& parser, const void* val_ptr, const name_stack_t& stack) +{ + // just create node + LLXUIParser& self = static_cast<LLXUIParser&>(parser); + LLXMLNodePtr node = self.getNode(stack); + return node.notNull(); +} bool LLXUIParser::readBoolValue(Parser& parser, void* val_ptr) { @@ -1049,6 +1074,8 @@ 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; +const char* NO_VALUE_MARKER = "no_value"; + LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t element_cb) : Parser(sSimpleXUIReadFuncs, sSimpleXUIWriteFuncs, sSimpleXUIInspectFuncs), mLastWriteGeneration(-1), @@ -1057,6 +1084,7 @@ LLSimpleXUIParser::LLSimpleXUIParser(LLSimpleXUIParser::element_start_callback_t { if (sSimpleXUIReadFuncs.empty()) { + registerParserFuncs<LLInitParam::NoParamValue>(readNoValue); registerParserFuncs<bool>(readBoolValue); registerParserFuncs<std::string>(readStringValue); registerParserFuncs<U8>(readU8Value); @@ -1120,6 +1148,8 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl return false; } + mEmptyLeafNode.push_back(false); + if( !XML_ParseBuffer(mParser, bytes_read, TRUE ) ) { LL_WARNS("ReadXUI") << "Error while parsing file " << filename << LL_ENDL; @@ -1127,6 +1157,8 @@ bool LLSimpleXUIParser::readXUI(const std::string& filename, LLInitParam::BaseBl return false; } + mEmptyLeafNode.pop_back(); + XML_ParserFree( mParser ); return true; } @@ -1211,8 +1243,14 @@ void LLSimpleXUIParser::startElement(const char *name, const char **atts) } } + // parent node is not empty + mEmptyLeafNode.back() = false; + // we are empty if we have no attributes + mEmptyLeafNode.push_back(atts[0] == NULL); + mTokenSizeStack.push_back(num_tokens_pushed); readAttributes(atts); + } bool LLSimpleXUIParser::readAttributes(const char **atts) @@ -1246,7 +1284,7 @@ bool LLSimpleXUIParser::readAttributes(const char **atts) return any_parsed; } -void LLSimpleXUIParser::processText() +bool LLSimpleXUIParser::processText() { if (!mTextContents.empty()) { @@ -1259,12 +1297,22 @@ void LLSimpleXUIParser::processText() mNameStack.pop_back(); } mTextContents.clear(); + return true; } + return false; } void LLSimpleXUIParser::endElement(const char *name) { - processText(); + bool has_text = processText(); + + // no text, attributes, or children + if (!has_text && mEmptyLeafNode.back()) + { + // submit this as a valueless name (even though there might be text contents we haven't seen yet) + mCurAttributeValueBegin = NO_VALUE_MARKER; + mOutputStack.back().first->submitValue(mNameStack, *this, mParseSilently); + } if (--mOutputStack.back().second == 0) { @@ -1282,6 +1330,7 @@ void LLSimpleXUIParser::endElement(const char *name) mNameStack.pop_back(); } mScope.pop_back(); + mEmptyLeafNode.pop_back(); } void LLSimpleXUIParser::characterData(const char *s, int len) @@ -1328,6 +1377,12 @@ void LLSimpleXUIParser::parserError(const std::string& message) #endif } +bool LLSimpleXUIParser::readNoValue(Parser& parser, void* val_ptr) +{ + LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); + return self.mCurAttributeValueBegin == NO_VALUE_MARKER; +} + bool LLSimpleXUIParser::readBoolValue(Parser& parser, void* val_ptr) { LLSimpleXUIParser& self = static_cast<LLSimpleXUIParser&>(parser); diff --git a/indra/llxuixml/llxuiparser.h b/indra/llxuixml/llxuiparser.h index 5c613b0c69..7a748d8aea 100644 --- a/indra/llxuixml/llxuiparser.h +++ b/indra/llxuixml/llxuiparser.h @@ -116,6 +116,7 @@ private: bool readAttributes(LLXMLNodePtr nodep, LLInitParam::BaseBlock& block); //reader helper functions + static bool readNoValue(Parser& parser, 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); @@ -132,6 +133,7 @@ private: static bool readSDValue(Parser& parser, void* val_ptr); //writer helper functions + static bool writeNoValue(Parser& parser, 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&); @@ -194,6 +196,7 @@ public: private: //reader helper functions + static bool readNoValue(Parser&, void* val_ptr); static bool readBoolValue(Parser&, void* val_ptr); static bool readStringValue(Parser&, void* val_ptr); static bool readU8Value(Parser&, void* val_ptr); @@ -218,7 +221,7 @@ private: void endElement(const char *name); void characterData(const char *s, int len); bool readAttributes(const char **atts); - void processText(); + bool processText(); Parser::name_stack_t mNameStack; struct XML_ParserStruct* mParser; @@ -230,6 +233,7 @@ private: const char* mCurAttributeValueBegin; std::vector<S32> mTokenSizeStack; std::vector<std::string> mScope; + std::vector<bool> mEmptyLeafNode; 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 23980ffac2..5d19e8a889 100644 --- a/indra/mac_updater/mac_updater.cpp +++ b/indra/mac_updater/mac_updater.cpp @@ -26,6 +26,9 @@ #include "linden_common.h" +#include <boost/format.hpp> + +#include <libgen.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> @@ -62,6 +65,8 @@ Boolean gCancelled = false; const char *gUpdateURL; const char *gProductName; const char *gBundleID; +const char *gDmgFile; +const char *gMarkerPath; void *updatethreadproc(void*); @@ -334,6 +339,14 @@ int parse_args(int argc, char **argv) { gBundleID = argv[j]; } + else if ((!strcmp(argv[j], "-dmg")) && (++j < argc)) + { + gDmgFile = argv[j]; + } + else if ((!strcmp(argv[j], "-marker")) && (++j < argc)) + { + gMarkerPath = argv[j];; + } } return 0; @@ -361,10 +374,12 @@ int main(int argc, char **argv) gUpdateURL = NULL; gProductName = NULL; gBundleID = NULL; + gDmgFile = NULL; + gMarkerPath = NULL; parse_args(argc, argv); - if (!gUpdateURL) + if ((gUpdateURL == NULL) && (gDmgFile == NULL)) { - llinfos << "Usage: mac_updater -url <url> [-name <product_name>] [-program <program_name>]" << llendl; + llinfos << "Usage: mac_updater -url <url> | -dmg <dmg file> [-name <product_name>] [-program <program_name>]" << llendl; exit(1); } else @@ -488,11 +503,18 @@ int main(int argc, char **argv) NULL, &retval_mac); } - + + if(gMarkerPath != 0) + { + // Create a install fail marker that can be used by the viewer to + // detect install problems. + std::ofstream stream(gMarkerPath); + if(stream) stream << -1; + } + exit(-1); + } else { + exit(0); } - - // Don't dispose of things, just exit. This keeps the update thread from potentially getting hosed. - exit(0); if(gWindow != NULL) { @@ -700,17 +722,26 @@ static OSErr findAppBundleOnDiskImage(FSRef *parent, FSRef *app) // Looks promising. Check to see if it has the right bundle identifier. if(isFSRefViewerBundle(&ref)) { + llinfos << name << " is the one" << llendl; // This is the one. Return it. *app = ref; found = true; + break; + } else { + llinfos << name << " is not the bundle we are looking for; move along" << llendl; } + } } } } - while(!err && !found); + while(!err); + + llinfos << "closing the iterator" << llendl; FSCloseIterator(iterator); + + llinfos << "closed" << llendl; } if(!err && !found) @@ -921,6 +952,22 @@ void *updatethreadproc(void*) #endif // 0 *HACK for DEV-11935 + // Skip downloading the file if the dmg was passed on the command line. + std::string dmgName; + if(gDmgFile != NULL) { + dmgName = basename((char *)gDmgFile); + char * dmgDir = dirname((char *)gDmgFile); + strncpy(tempDir, dmgDir, sizeof(tempDir)); + err = FSPathMakeRef((UInt8*)tempDir, &tempDirRef, NULL); + if(err != noErr) throw 0; + chdir(tempDir); + goto begin_install; + } else { + // Continue on to download file. + dmgName = "SecondLife.dmg"; + } + + strncat(temp, "/SecondLifeUpdate_XXXXXX", (sizeof(temp) - strlen(temp)) - 1); if(mkdtemp(temp) == NULL) { @@ -979,14 +1026,17 @@ void *updatethreadproc(void*) fclose(downloadFile); downloadFile = NULL; } - + + begin_install: sendProgress(0, 0, CFSTR("Mounting image...")); LLFile::mkdir("mnt", 0700); // NOTE: we could add -private at the end of this command line to keep the image from showing up in the Finder, // but if our cleanup fails, this makes it much harder for the user to unmount the image. std::string mountOutput; - FILE* mounter = popen("hdiutil attach SecondLife.dmg -mountpoint mnt", "r"); /* Flawfinder: ignore */ + boost::format cmdFormat("hdiutil attach %s -mountpoint mnt"); + cmdFormat % dmgName; + FILE* mounter = popen(cmdFormat.str().c_str(), "r"); /* Flawfinder: ignore */ if(mounter == NULL) { @@ -1052,12 +1102,19 @@ void *updatethreadproc(void*) throw 0; } + sendProgress(0, 0, CFSTR("Searching for the app bundle...")); err = findAppBundleOnDiskImage(&mountRef, &sourceRef); if(err != noErr) { llinfos << "Couldn't find application bundle on mounted disk image." << llendl; throw 0; } + else + { + llinfos << "found the bundle." << llendl; + } + + sendProgress(0, 0, CFSTR("Preparing to copy files...")); FSRef asideRef; char aside[MAX_PATH]; /* Flawfinder: ignore */ @@ -1077,7 +1134,11 @@ void *updatethreadproc(void*) // Move aside old version (into work directory) err = FSMoveObject(&targetRef, &tempDirRef, &asideRef); if(err != noErr) + { + llwarns << "failed to move aside old version (error code " << + err << ")" << llendl; throw 0; + } // Grab the path for later use. err = FSRefMakePath(&asideRef, (UInt8*)aside, sizeof(aside)); @@ -1175,6 +1236,10 @@ void *updatethreadproc(void*) llinfos << "Moving work directory to the trash." << llendl; err = FSMoveObject(&tempDirRef, &trashFolderRef, NULL); + if(err != noErr) { + llwarns << "failed to move files to trash, (error code " << + err << ")" << llendl; + } // snprintf(temp, sizeof(temp), "rm -rf '%s'", tempDir); // printf("%s\n", temp); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 2b4a2dfdb0..fe3e850a03 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -68,6 +68,7 @@ include_directories( ${LSCRIPT_INCLUDE_DIRS} ${LSCRIPT_INCLUDE_DIRS}/lscript_compile ${LLLOGIN_INCLUDE_DIRS} + ${UPDATER_INCLUDE_DIRS} ${LIBS_PREBUILT_DIR}/include/collada ${LIBS_PREBUILT_DIR}/include/collada/1.4 ) @@ -149,6 +150,7 @@ set(viewer_SOURCE_FILES lleventnotifier.cpp lleventpoll.cpp llexpandabletextbox.cpp + llexternaleditor.cpp llface.cpp llfasttimerview.cpp llfavoritesbar.cpp @@ -199,6 +201,7 @@ set(viewer_SOURCE_FILES llfloatermediasettings.cpp llfloatermemleak.cpp llfloatermodelpreview.cpp + llfloatermodelwizard.cpp llfloaternamedesc.cpp llfloaternotificationsconsole.cpp llfloateropenobject.cpp @@ -291,6 +294,7 @@ set(viewer_SOURCE_FILES llloginhandler.cpp lllogininstance.cpp llmachineid.cpp + llmainlooprepeater.cpp llmanip.cpp llmaniprotate.cpp llmanipscale.cpp @@ -301,7 +305,6 @@ set(viewer_SOURCE_FILES llmenucommands.cpp llmeshrepository.cpp llmeshreduction.cpp - llmetricperformancetester.cpp llmimetypes.cpp llmorphview.cpp llmoveview.cpp @@ -456,6 +459,7 @@ set(viewer_SOURCE_FILES lltoastimpanel.cpp lltoastnotifypanel.cpp lltoastpanel.cpp + lltoastscripttextbox.cpp lltool.cpp lltoolbrush.cpp lltoolcomp.cpp @@ -687,6 +691,7 @@ set(viewer_HEADER_FILES lleventnotifier.h lleventpoll.h llexpandabletextbox.h + llexternaleditor.h llface.h llfasttimerview.h llfavoritesbar.h @@ -737,6 +742,7 @@ set(viewer_HEADER_FILES llfloatermediasettings.h llfloatermemleak.h llfloatermodelpreview.h + llfloatermodelwizard.h llfloaternamedesc.h llfloaternotificationsconsole.h llfloateropenobject.h @@ -829,6 +835,7 @@ set(viewer_HEADER_FILES llloginhandler.h lllogininstance.h llmachineid.h + llmainlooprepeater.h llmanip.h llmaniprotate.h llmanipscale.h @@ -839,7 +846,6 @@ set(viewer_HEADER_FILES llmenucommands.h llmeshrepository.h llmeshreduction.h - llmetricperformancetester.h llmimetypes.h llmorphview.h llmoveview.h @@ -991,6 +997,7 @@ set(viewer_HEADER_FILES lltoastimpanel.h lltoastnotifypanel.h lltoastpanel.h + lltoastscripttextbox.h lltool.h lltoolbrush.h lltoolcomp.h @@ -1336,7 +1343,7 @@ set(viewer_APPSETTINGS_FILES app_settings/grass.xml app_settings/high_graphics.xml app_settings/ignorable_dialogs.xml - app_settings/keys.ini + app_settings/keys.xml app_settings/keywords.ini app_settings/logcontrol.xml app_settings/low_graphics.xml @@ -1674,7 +1681,14 @@ if (WINDOWS) endif (PACKAGE) endif (WINDOWS) +# *NOTE - this list is very sensitive to ordering, test carefully on all +# platforms if you change the releative order of the entries here. +# In particular, cmake 2.6.4 (when buidling with linux/makefile generators) +# appears to sometimes de-duplicate redundantly listed dependencies improperly. +# To work around this, higher level modules should be listed before the modules +# that they depend upon. -brad target_link_libraries(${VIEWER_BINARY_NAME} + ${UPDATER_LIBRARIES} ${GOOGLE_PERFTOOLS_LIBRARIES} ${LLAUDIO_LIBRARIES} ${LLCHARACTER_LIBRARIES} @@ -1864,10 +1878,18 @@ if (PACKAGE) set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) endif (LINUX) + if(CMAKE_CFG_INTDIR STREQUAL ".") + set(LLBUILD_CONFIG ${CMAKE_BUILD_TYPE}) + else(CMAKE_CFG_INTDIR STREQUAL ".") + # set LLBUILD_CONFIG to be a shell variable evaluated at build time + # reflecting the configuration we are currently building. + set(LLBUILD_CONFIG ${CMAKE_CFG_INTDIR}) + endif(CMAKE_CFG_INTDIR STREQUAL ".") add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}" COMMAND "${PYTHON_EXECUTABLE}" ARGS "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py" + "${LLBUILD_CONFIG}" "${VIEWER_DIST_DIR}" "${VIEWER_EXE_GLOBS}" "${VIEWER_LIB_GLOB}" @@ -1876,7 +1898,7 @@ if (PACKAGE) DEPENDS generate_breakpad_symbols.py VERBATIM ) - add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}") + add_custom_target(generate_breakpad_symbols DEPENDS "${VIEWER_SYMBOL_FILE}") add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}") add_dependencies(package generate_breakpad_symbols) endif (PACKAGE) @@ -1890,7 +1912,9 @@ if (LL_TESTS) lldateutil.cpp llmediadataclient.cpp lllogininstance.cpp + llremoteparcelrequest.cpp llviewerhelputil.cpp + llversioninfo.cpp ) ################################################## diff --git a/indra/newview/app_settings/cmd_line.xml b/indra/newview/app_settings/cmd_line.xml index ba3b6a42a4..e4ac455e7c 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> @@ -361,8 +363,7 @@ <map> <key>count</key> <integer>1</integer> - <key>map-to</key> - <string>VersionChannelName</string> + <!-- Special case. Not mapped to a setting. --> </map> <key>loginpage</key> @@ -398,6 +399,5 @@ <key>map-to</key> <string>DisableCrashLogger</string> </map> - </map> </llsd> diff --git a/indra/newview/app_settings/high_graphics.xml b/indra/newview/app_settings/high_graphics.xml index 4da2b0fd00..587b2f2a89 100644 --- a/indra/newview/app_settings/high_graphics.xml +++ b/indra/newview/app_settings/high_graphics.xml @@ -24,8 +24,6 @@ <RenderTerrainLODFactor value="2"/> <!--Default for now--> <RenderTreeLODFactor value="0.5"/> - <!--Default for now--> - <RenderUseFBO value="1"/> <!--Try Impostors--> <RenderUseImpostors value="TRUE"/> <!--Default for now--> diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml index 9ddf007ce7..89fd4e5935 100644 --- a/indra/newview/app_settings/ignorable_dialogs.xml +++ b/indra/newview/app_settings/ignorable_dialogs.xml @@ -23,6 +23,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>FirstNotUseAvatarPicker</key> + <map> + <key>Comment</key> + <string>Shows hint when resident doesn't activate avatar picker</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> @@ -56,6 +67,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>FirstViewPopup</key> + <map> + <key>Comment</key> + <string>Shows hint when resident opens view popup</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> diff --git a/indra/newview/app_settings/keys.ini b/indra/newview/app_settings/keys.ini deleted file mode 100644 index b79e5bf508..0000000000 --- a/indra/newview/app_settings/keys.ini +++ /dev/null @@ -1,357 +0,0 @@ -# keys.ini -# -# keyboard binding initialization -# -# comments must have # in the first column -# blank lines OK -# -# Format: -# mode key mask function -# -# mode must be one of FIRST_PERSON, THIRD_PERSON, EDIT, EDIT_AVATAR, or CONVERSATION -# key must be upper case, or SPACE, HOME, END, PGUP, PGDN, LEFT, RIGHT, UP, DOWN, -# or one of ,.;'[] -# mask must be NONE, SHIFT, ALT, ALT_SHIFT. -# Control is reserved for user commands. -# function must be a function named in llkeyboard.cpp - -FIRST_PERSON A NONE slide_left -FIRST_PERSON D NONE slide_right -FIRST_PERSON W NONE push_forward -FIRST_PERSON S NONE push_backward -FIRST_PERSON E NONE jump -FIRST_PERSON C NONE push_down -FIRST_PERSON F NONE toggle_fly - -FIRST_PERSON LEFT NONE slide_left -FIRST_PERSON RIGHT NONE slide_right -FIRST_PERSON UP NONE push_forward -FIRST_PERSON DOWN NONE push_backward -FIRST_PERSON PGUP NONE jump -FIRST_PERSON PGDN NONE push_down -FIRST_PERSON HOME NONE toggle_fly - -FIRST_PERSON PAD_LEFT NONE slide_left -FIRST_PERSON PAD_RIGHT NONE slide_right -FIRST_PERSON PAD_UP NONE push_forward -FIRST_PERSON PAD_DOWN NONE push_backward -FIRST_PERSON PAD_PGUP NONE jump -FIRST_PERSON PAD_PGDN NONE push_down -FIRST_PERSON PAD_HOME NONE toggle_fly -FIRST_PERSON PAD_CENTER NONE stop_moving -FIRST_PERSON PAD_ENTER NONE start_chat -FIRST_PERSON PAD_DIVIDE NONE start_gesture - -FIRST_PERSON A SHIFT slide_left -FIRST_PERSON D SHIFT slide_right -FIRST_PERSON W SHIFT push_forward -FIRST_PERSON S SHIFT push_backward -FIRST_PERSON E SHIFT jump -FIRST_PERSON C SHIFT push_down -FIRST_PERSON F SHIFT toggle_fly - -FIRST_PERSON SPACE NONE stop_moving -FIRST_PERSON ENTER NONE start_chat -FIRST_PERSON DIVIDE NONE start_gesture - -FIRST_PERSON LEFT SHIFT slide_left -FIRST_PERSON RIGHT SHIFT slide_right -FIRST_PERSON UP SHIFT push_forward -FIRST_PERSON DOWN SHIFT push_backward -FIRST_PERSON PGUP SHIFT jump -FIRST_PERSON PGDN SHIFT push_down - -FIRST_PERSON PAD_LEFT SHIFT slide_left -FIRST_PERSON PAD_RIGHT SHIFT slide_right -FIRST_PERSON PAD_UP SHIFT push_forward -FIRST_PERSON PAD_DOWN SHIFT push_backward -FIRST_PERSON PAD_PGUP SHIFT jump -FIRST_PERSON PAD_PGDN SHIFT push_down -FIRST_PERSON PAD_HOME SHIFT toggle_fly -FIRST_PERSON PAD_ENTER SHIFT start_chat -FIRST_PERSON PAD_DIVIDE SHIFT start_gesture - -THIRD_PERSON A NONE turn_left -THIRD_PERSON D NONE turn_right -THIRD_PERSON A SHIFT slide_left -THIRD_PERSON D SHIFT slide_right -THIRD_PERSON W NONE push_forward -THIRD_PERSON S NONE push_backward -THIRD_PERSON W SHIFT push_forward -THIRD_PERSON S SHIFT push_backward -THIRD_PERSON E NONE jump -THIRD_PERSON C NONE push_down -THIRD_PERSON E SHIFT jump -THIRD_PERSON C SHIFT push_down - -THIRD_PERSON F NONE toggle_fly -THIRD_PERSON F SHIFT toggle_fly - -THIRD_PERSON SPACE NONE stop_moving -THIRD_PERSON ENTER NONE start_chat -THIRD_PERSON DIVIDE NONE start_gesture - -THIRD_PERSON LEFT NONE turn_left -THIRD_PERSON LEFT SHIFT slide_left -THIRD_PERSON RIGHT NONE turn_right -THIRD_PERSON RIGHT SHIFT slide_right -THIRD_PERSON UP NONE push_forward -THIRD_PERSON DOWN NONE push_backward -THIRD_PERSON UP SHIFT push_forward -THIRD_PERSON DOWN SHIFT push_backward -THIRD_PERSON PGUP NONE jump -THIRD_PERSON PGDN NONE push_down -THIRD_PERSON PGUP SHIFT jump -THIRD_PERSON PGDN SHIFT push_down -THIRD_PERSON HOME SHIFT toggle_fly -THIRD_PERSON HOME NONE toggle_fly - -THIRD_PERSON PAD_LEFT NONE turn_left -THIRD_PERSON PAD_LEFT SHIFT slide_left -THIRD_PERSON PAD_RIGHT NONE turn_right -THIRD_PERSON PAD_RIGHT SHIFT slide_right -THIRD_PERSON PAD_UP NONE push_forward -THIRD_PERSON PAD_DOWN NONE push_backward -THIRD_PERSON PAD_UP SHIFT push_forward -THIRD_PERSON PAD_DOWN SHIFT push_backward -THIRD_PERSON PAD_PGUP NONE jump -THIRD_PERSON PAD_PGDN NONE push_down -THIRD_PERSON PAD_PGUP SHIFT jump -THIRD_PERSON PAD_PGDN SHIFT push_down -THIRD_PERSON PAD_HOME NONE toggle_fly -THIRD_PERSON PAD_HOME SHIFT toggle_fly -THIRD_PERSON PAD_CENTER NONE stop_moving -THIRD_PERSON PAD_CENTER SHIFT stop_moving -THIRD_PERSON PAD_ENTER NONE start_chat -THIRD_PERSON PAD_ENTER SHIFT start_chat -THIRD_PERSON PAD_DIVIDE NONE start_gesture -THIRD_PERSON PAD_DIVIDE SHIFT start_gesture - -# Camera controls in third person on Alt -THIRD_PERSON LEFT ALT spin_around_cw -THIRD_PERSON RIGHT ALT spin_around_ccw -THIRD_PERSON UP ALT move_forward -THIRD_PERSON DOWN ALT move_backward -THIRD_PERSON PGUP ALT spin_over -THIRD_PERSON PGDN ALT spin_under - -THIRD_PERSON A ALT spin_around_cw -THIRD_PERSON D ALT spin_around_ccw -THIRD_PERSON W ALT move_forward -THIRD_PERSON S ALT move_backward -THIRD_PERSON E ALT spin_over -THIRD_PERSON C ALT spin_under - -THIRD_PERSON PAD_LEFT ALT spin_around_cw -THIRD_PERSON PAD_RIGHT ALT spin_around_ccw -THIRD_PERSON PAD_UP ALT move_forward -THIRD_PERSON PAD_DOWN ALT move_backward -THIRD_PERSON PAD_PGUP ALT spin_over -THIRD_PERSON PAD_PGDN ALT spin_under -THIRD_PERSON PAD_ENTER ALT start_chat -THIRD_PERSON PAD_DIVIDE ALT start_gesture - -# mimic alt zoom behavior with keyboard only -THIRD_PERSON A CTL_ALT spin_around_cw -THIRD_PERSON D CTL_ALT spin_around_ccw -THIRD_PERSON W CTL_ALT spin_over -THIRD_PERSON S CTL_ALT spin_under -THIRD_PERSON E CTL_ALT spin_over -THIRD_PERSON C CTL_ALT spin_under - -THIRD_PERSON LEFT CTL_ALT spin_around_cw -THIRD_PERSON RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON UP CTL_ALT spin_over -THIRD_PERSON DOWN CTL_ALT spin_under -THIRD_PERSON PGUP CTL_ALT spin_over -THIRD_PERSON PGDN CTL_ALT spin_under - -THIRD_PERSON PAD_LEFT CTL_ALT spin_around_cw -THIRD_PERSON PAD_RIGHT CTL_ALT spin_around_ccw -THIRD_PERSON PAD_UP CTL_ALT spin_over -THIRD_PERSON PAD_DOWN CTL_ALT spin_under -THIRD_PERSON PAD_PGUP CTL_ALT spin_over -THIRD_PERSON PAD_PGDN CTL_ALT spin_under -THIRD_PERSON PAD_ENTER CTL_ALT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT start_gesture - -# Therefore pan on Alt-Shift -THIRD_PERSON A CTL_ALT_SHIFT pan_left -THIRD_PERSON D CTL_ALT_SHIFT pan_right -THIRD_PERSON W CTL_ALT_SHIFT pan_up -THIRD_PERSON S CTL_ALT_SHIFT pan_down - -THIRD_PERSON LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON UP CTL_ALT_SHIFT pan_up -THIRD_PERSON DOWN CTL_ALT_SHIFT pan_down - -THIRD_PERSON PAD_LEFT CTL_ALT_SHIFT pan_left -THIRD_PERSON PAD_RIGHT CTL_ALT_SHIFT pan_right -THIRD_PERSON PAD_UP CTL_ALT_SHIFT pan_up -THIRD_PERSON PAD_DOWN CTL_ALT_SHIFT pan_down -THIRD_PERSON PAD_ENTER CTL_ALT_SHIFT start_chat -THIRD_PERSON PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -# Basic editing camera control -EDIT A NONE spin_around_cw -EDIT D NONE spin_around_ccw -EDIT W NONE move_forward -EDIT S NONE move_backward -EDIT E NONE spin_over -EDIT C NONE spin_under -EDIT ENTER NONE start_chat -EDIT DIVIDE NONE start_gesture -EDIT PAD_ENTER NONE start_chat -EDIT PAD_DIVIDE NONE start_gesture - -EDIT LEFT NONE spin_around_cw -EDIT RIGHT NONE spin_around_ccw -EDIT UP NONE move_forward -EDIT DOWN NONE move_backward -EDIT PGUP NONE spin_over -EDIT PGDN NONE spin_under - -EDIT A SHIFT pan_left -EDIT D SHIFT pan_right -EDIT W SHIFT pan_up -EDIT S SHIFT pan_down - -EDIT LEFT SHIFT pan_left -EDIT RIGHT SHIFT pan_right -EDIT UP SHIFT pan_up -EDIT DOWN SHIFT pan_down - -# Walking works with ALT held down. -EDIT A ALT slide_left -EDIT D ALT slide_right -EDIT W ALT push_forward -EDIT S ALT push_backward -EDIT E ALT jump -EDIT C ALT push_down - -EDIT LEFT ALT slide_left -EDIT RIGHT ALT slide_right -EDIT UP ALT push_forward -EDIT DOWN ALT push_backward -EDIT PGUP ALT jump -EDIT PGDN ALT push_down -EDIT HOME ALT toggle_fly - -EDIT PAD_LEFT ALT slide_left -EDIT PAD_RIGHT ALT slide_right -EDIT PAD_UP ALT push_forward -EDIT PAD_DOWN ALT push_backward -EDIT PAD_PGUP ALT jump -EDIT PAD_PGDN ALT push_down -EDIT PAD_ENTER ALT start_chat -EDIT PAD_DIVIDE ALT start_gesture - -SITTING A ALT spin_around_cw -SITTING D ALT spin_around_ccw -SITTING W ALT move_forward -SITTING S ALT move_backward -SITTING E ALT spin_over_sitting -SITTING C ALT spin_under_sitting - -SITTING LEFT ALT spin_around_cw -SITTING RIGHT ALT spin_around_ccw -SITTING UP ALT move_forward -SITTING DOWN ALT move_backward -SITTING PGUP ALT spin_over -SITTING PGDN ALT spin_under - -SITTING A CTL_ALT spin_around_cw -SITTING D CTL_ALT spin_around_ccw -SITTING W CTL_ALT spin_over -SITTING S CTL_ALT spin_under -SITTING E CTL_ALT spin_over -SITTING C CTL_ALT spin_under - -SITTING LEFT CTL_ALT spin_around_cw -SITTING RIGHT CTL_ALT spin_around_ccw -SITTING UP CTL_ALT spin_over -SITTING DOWN CTL_ALT spin_under -SITTING PGUP CTL_ALT spin_over -SITTING PGDN CTL_ALT spin_under - - -SITTING A NONE spin_around_cw_sitting -SITTING D NONE spin_around_ccw_sitting -SITTING W NONE move_forward_sitting -SITTING S NONE move_backward_sitting -SITTING E NONE spin_over_sitting -SITTING C NONE spin_under_sitting - -SITTING LEFT NONE spin_around_cw_sitting -SITTING RIGHT NONE spin_around_ccw_sitting -SITTING UP NONE move_forward_sitting -SITTING DOWN NONE move_backward_sitting -SITTING PGUP NONE spin_over_sitting -SITTING PGDN NONE spin_under_sitting - -SITTING PAD_LEFT NONE spin_around_cw_sitting -SITTING PAD_RIGHT NONE spin_around_ccw_sitting -SITTING PAD_UP NONE move_forward_sitting -SITTING PAD_DOWN NONE move_backward_sitting -SITTING PAD_PGUP NONE spin_over_sitting -SITTING PAD_PGDN NONE spin_under_sitting -SITTING PAD_CENTER NONE stop_moving -SITTING PAD_ENTER NONE start_chat -SITTING PAD_DIVIDE NONE start_gesture - -# these are for passing controls when sitting on vehicles -SITTING A SHIFT slide_left -SITTING D SHIFT slide_right -SITTING LEFT SHIFT slide_left -SITTING RIGHT SHIFT slide_right - -SITTING PAD_LEFT SHIFT slide_left -SITTING PAD_RIGHT SHIFT slide_right -SITTING PAD_ENTER SHIFT start_chat -SITTING PAD_DIVIDE SHIFT start_gesture - -# pan on Alt-Shift -SITTING A CTL_ALT_SHIFT pan_left -SITTING D CTL_ALT_SHIFT pan_right -SITTING W CTL_ALT_SHIFT pan_up -SITTING S CTL_ALT_SHIFT pan_down - -SITTING LEFT CTL_ALT_SHIFT pan_left -SITTING RIGHT CTL_ALT_SHIFT pan_right -SITTING UP CTL_ALT_SHIFT pan_up -SITTING DOWN CTL_ALT_SHIFT pan_down - -SITTING PAD_LEFT CTL_ALT_SHIFT pan_left -SITTING PAD_RIGHT CTL_ALT_SHIFT pan_right -SITTING PAD_UP CTL_ALT_SHIFT pan_up -SITTING PAD_DOWN CTL_ALT_SHIFT pan_down -SITTING PAD_ENTER CTL_ALT_SHIFT start_chat -SITTING PAD_DIVIDE CTL_ALT_SHIFT start_gesture - -SITTING ENTER NONE start_chat -SITTING DIVIDE NONE start_gesture - -# Avatar editing camera controls -EDIT_AVATAR A NONE edit_avatar_spin_cw -EDIT_AVATAR D NONE edit_avatar_spin_ccw -EDIT_AVATAR W NONE edit_avatar_move_forward -EDIT_AVATAR S NONE edit_avatar_move_backward -EDIT_AVATAR E NONE edit_avatar_spin_over -EDIT_AVATAR C NONE edit_avatar_spin_under -EDIT_AVATAR LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR UP NONE edit_avatar_move_forward -EDIT_AVATAR DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PGDN NONE edit_avatar_spin_under -EDIT_AVATAR ENTER NONE start_chat -EDIT_AVATAR DIVIDE NONE start_gesture -EDIT_AVATAR PAD_LEFT NONE edit_avatar_spin_cw -EDIT_AVATAR PAD_RIGHT NONE edit_avatar_spin_ccw -EDIT_AVATAR PAD_UP NONE edit_avatar_move_forward -EDIT_AVATAR PAD_DOWN NONE edit_avatar_move_backward -EDIT_AVATAR PAD_PGUP NONE edit_avatar_spin_over -EDIT_AVATAR PAD_PGDN NONE edit_avatar_spin_under -EDIT_AVATAR PAD_ENTER NONE start_chat -EDIT_AVATAR PAD_DIVIDE NONE start_gesture diff --git a/indra/newview/app_settings/keys.xml b/indra/newview/app_settings/keys.xml new file mode 100644 index 0000000000..d085475c6c --- /dev/null +++ b/indra/newview/app_settings/keys.xml @@ -0,0 +1,350 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<keys> + <first_person> + <binding key="A" mask="NONE" command="slide_left"/> + <binding key="D" mask="NONE" command="slide_right"/> + <binding key="W" mask="NONE" command="push_forward"/> + <binding key="S" mask="NONE" command="push_backward"/> + <binding key="E" mask="NONE" command="jump"/> + <binding key="C" mask="NONE" command="push_down"/> + <binding key="F" mask="NONE" command="toggle_fly"/> + + <binding key="LEFT" mask="NONE" command="slide_left"/> + <binding key="RIGHT" mask="NONE" command="slide_right"/> + <binding key="UP" mask="NONE" command="push_forward"/> + <binding key="DOWN" mask="NONE" command="push_backward"/> + <binding key="PGUP" mask="NONE" command="jump"/> + <binding key="PGDN" mask="NONE" command="push_down"/> + <binding key="HOME" mask="NONE" command="toggle_fly"/> + + <binding key="PAD_LEFT" mask="NONE" command="slide_left"/> + <binding key="PAD_RIGHT" mask="NONE" command="slide_right"/> + <binding key="PAD_UP" mask="NONE" command="push_forward"/> + <binding key="PAD_DOWN" mask="NONE" command="push_backward"/> + <binding key="PAD_PGUP" mask="NONE" command="jump"/> + <binding key="PAD_PGDN" mask="NONE" command="push_down"/> + <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/> + <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="A" mask="SHIFT" command="slide_left"/> + <binding key="D" mask="SHIFT" command="slide_right"/> + <binding key="W" mask="SHIFT" command="push_forward"/> + <binding key="S" mask="SHIFT" command="push_backward"/> + <binding key="E" mask="SHIFT" command="jump"/> + <binding key="C" mask="SHIFT" command="push_down"/> + <binding key="F" mask="SHIFT" command="toggle_fly"/> + + <binding key="SPACE" mask="NONE" command="stop_moving"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="LEFT" mask="SHIFT" command="slide_left"/> + <binding key="RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="UP" mask="SHIFT" command="push_forward"/> + <binding key="DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PGUP" mask="SHIFT" command="jump"/> + <binding key="PGDN" mask="SHIFT" command="push_down"/> + + <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="PAD_UP" mask="SHIFT" command="push_forward"/> + <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PAD_PGUP" mask="SHIFT" command="jump"/> + <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/> + <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/> + <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> + </first_person> + <third_person> + <binding key="A" mask="NONE" command="turn_left"/> + <binding key="D" mask="NONE" command="turn_right"/> + <binding key="A" mask="SHIFT" command="slide_left"/> + <binding key="D" mask="SHIFT" command="slide_right"/> + <binding key="W" mask="NONE" command="push_forward"/> + <binding key="S" mask="NONE" command="push_backward"/> + <binding key="W" mask="SHIFT" command="push_forward"/> + <binding key="S" mask="SHIFT" command="push_backward"/> + <binding key="E" mask="NONE" command="jump"/> + <binding key="C" mask="NONE" command="push_down"/> + <binding key="E" mask="SHIFT" command="jump"/> + <binding key="C" mask="SHIFT" command="push_down"/> + + <binding key="F" mask="NONE" command="toggle_fly"/> + <binding key="F" mask="SHIFT" command="toggle_fly"/> + + <binding key="SPACE" mask="NONE" command="stop_moving"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="LEFT" mask="NONE" command="turn_left"/> + <binding key="LEFT" mask="SHIFT" command="slide_left"/> + <binding key="RIGHT" mask="NONE" command="turn_right"/> + <binding key="RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="UP" mask="NONE" command="push_forward"/> + <binding key="DOWN" mask="NONE" command="push_backward"/> + <binding key="UP" mask="SHIFT" command="push_forward"/> + <binding key="DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PGUP" mask="NONE" command="jump"/> + <binding key="PGDN" mask="NONE" command="push_down"/> + <binding key="PGUP" mask="SHIFT" command="jump"/> + <binding key="PGDN" mask="SHIFT" command="push_down"/> + <binding key="HOME" mask="SHIFT" command="toggle_fly"/> + <binding key="HOME" mask="NONE" command="toggle_fly"/> + + <binding key="PAD_LEFT" mask="NONE" command="turn_left"/> + <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="NONE" command="turn_right"/> + <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="PAD_UP" mask="NONE" command="push_forward"/> + <binding key="PAD_DOWN" mask="NONE" command="push_backward"/> + <binding key="PAD_UP" mask="SHIFT" command="push_forward"/> + <binding key="PAD_DOWN" mask="SHIFT" command="push_backward"/> + <binding key="PAD_PGUP" mask="NONE" command="jump"/> + <binding key="PAD_PGDN" mask="NONE" command="push_down"/> + <binding key="PAD_PGUP" mask="SHIFT" command="jump"/> + <binding key="PAD_PGDN" mask="SHIFT" command="push_down"/> + <binding key="PAD_HOME" mask="NONE" command="toggle_fly"/> + <binding key="PAD_HOME" mask="SHIFT" command="toggle_fly"/> + <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> + <binding key="PAD_CENTER" mask="SHIFT" command="stop_moving"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> + + <!--Camera controls in third person on Alt--> + <binding key="LEFT" mask="ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/> + <binding key="UP" mask="ALT" command="move_forward"/> + <binding key="DOWN" mask="ALT" command="move_backward"/> + <binding key="PGUP" mask="ALT" command="spin_over"/> + <binding key="PGDN" mask="ALT" command="spin_under"/> + + <binding key="A" mask="ALT" command="spin_around_cw"/> + <binding key="D" mask="ALT" command="spin_around_ccw"/> + <binding key="W" mask="ALT" command="move_forward"/> + <binding key="S" mask="ALT" command="move_backward"/> + <binding key="E" mask="ALT" command="spin_over"/> + <binding key="C" mask="ALT" command="spin_under"/> + + <binding key="PAD_LEFT" mask="ALT" command="spin_around_cw"/> + <binding key="PAD_RIGHT" mask="ALT" command="spin_around_ccw"/> + <binding key="PAD_UP" mask="ALT" command="move_forward"/> + <binding key="PAD_DOWN" mask="ALT" command="move_backward"/> + <binding key="PAD_PGUP" mask="ALT" command="spin_over"/> + <binding key="PAD_PGDN" mask="ALT" command="spin_under"/> + <binding key="PAD_ENTER" mask="ALT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/> + + <!--mimic alt zoom behavior with keyboard only--> + <binding key="A" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="W" mask="CTL_ALT" command="spin_over"/> + <binding key="S" mask="CTL_ALT" command="spin_under"/> + <binding key="E" mask="CTL_ALT" command="spin_over"/> + <binding key="C" mask="CTL_ALT" command="spin_under"/> + + <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="UP" mask="CTL_ALT" command="spin_over"/> + <binding key="DOWN" mask="CTL_ALT" command="spin_under"/> + <binding key="PGUP" mask="CTL_ALT" command="spin_over"/> + <binding key="PGDN" mask="CTL_ALT" command="spin_under"/> + + <binding key="PAD_LEFT" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="PAD_RIGHT" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="PAD_UP" mask="CTL_ALT" command="spin_over"/> + <binding key="PAD_DOWN" mask="CTL_ALT" command="spin_under"/> + <binding key="PAD_PGUP" mask="CTL_ALT" command="spin_over"/> + <binding key="PAD_PGDN" mask="CTL_ALT" command="spin_under"/> + <binding key="PAD_ENTER" mask="CTL_ALT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="CTL_ALT" command="start_gesture"/> + + <!--Therefore pan on Alt-Shift--> + <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> + </third_person> + + # Basic editing camera control + <edit> + <binding key="A" mask="NONE" command="spin_around_cw"/> + <binding key="D" mask="NONE" command="spin_around_ccw"/> + <binding key="W" mask="NONE" command="move_forward"/> + <binding key="S" mask="NONE" command="move_backward"/> + <binding key="E" mask="NONE" command="spin_over"/> + <binding key="C" mask="NONE" command="spin_under"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + + <binding key="LEFT" mask="NONE" command="spin_around_cw"/> + <binding key="RIGHT" mask="NONE" command="spin_around_ccw"/> + <binding key="UP" mask="NONE" command="move_forward"/> + <binding key="DOWN" mask="NONE" command="move_backward"/> + <binding key="PGUP" mask="NONE" command="spin_over"/> + <binding key="PGDN" mask="NONE" command="spin_under"/> + + <binding key="A" mask="SHIFT" command="pan_left"/> + <binding key="D" mask="SHIFT" command="pan_right"/> + <binding key="W" mask="SHIFT" command="pan_up"/> + <binding key="S" mask="SHIFT" command="pan_down"/> + + <binding key="LEFT" mask="SHIFT" command="pan_left"/> + <binding key="RIGHT" mask="SHIFT" command="pan_right"/> + <binding key="UP" mask="SHIFT" command="pan_up"/> + <binding key="DOWN" mask="SHIFT" command="pan_down"/> + + <!--Walking works with ALT held down.--> + <binding key="A" mask="ALT" command="slide_left"/> + <binding key="D" mask="ALT" command="slide_right"/> + <binding key="W" mask="ALT" command="push_forward"/> + <binding key="S" mask="ALT" command="push_backward"/> + <binding key="E" mask="ALT" command="jump"/> + <binding key="C" mask="ALT" command="push_down"/> + + <binding key="LEFT" mask="ALT" command="slide_left"/> + <binding key="RIGHT" mask="ALT" command="slide_right"/> + <binding key="UP" mask="ALT" command="push_forward"/> + <binding key="DOWN" mask="ALT" command="push_backward"/> + <binding key="PGUP" mask="ALT" command="jump"/> + <binding key="PGDN" mask="ALT" command="push_down"/> + <binding key="HOME" mask="ALT" command="toggle_fly"/> + + <binding key="PAD_LEFT" mask="ALT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="ALT" command="slide_right"/> + <binding key="PAD_UP" mask="ALT" command="push_forward"/> + <binding key="PAD_DOWN" mask="ALT" command="push_backward"/> + <binding key="PAD_PGUP" mask="ALT" command="jump"/> + <binding key="PAD_PGDN" mask="ALT" command="push_down"/> + <binding key="PAD_ENTER" mask="ALT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="ALT" command="start_gesture"/> + </edit> + <sitting> + <binding key="A" mask="ALT" command="spin_around_cw"/> + <binding key="D" mask="ALT" command="spin_around_ccw"/> + <binding key="W" mask="ALT" command="move_forward"/> + <binding key="S" mask="ALT" command="move_backward"/> + <binding key="E" mask="ALT" command="spin_over_sitting"/> + <binding key="C" mask="ALT" command="spin_under_sitting"/> + + <binding key="LEFT" mask="ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="ALT" command="spin_around_ccw"/> + <binding key="UP" mask="ALT" command="move_forward"/> + <binding key="DOWN" mask="ALT" command="move_backward"/> + <binding key="PGUP" mask="ALT" command="spin_over"/> + <binding key="PGDN" mask="ALT" command="spin_under"/> + + <binding key="A" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="D" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="W" mask="CTL_ALT" command="spin_over"/> + <binding key="S" mask="CTL_ALT" command="spin_under"/> + <binding key="E" mask="CTL_ALT" command="spin_over"/> + <binding key="C" mask="CTL_ALT" command="spin_under"/> + + <binding key="LEFT" mask="CTL_ALT" command="spin_around_cw"/> + <binding key="RIGHT" mask="CTL_ALT" command="spin_around_ccw"/> + <binding key="UP" mask="CTL_ALT" command="spin_over"/> + <binding key="DOWN" mask="CTL_ALT" command="spin_under"/> + <binding key="PGUP" mask="CTL_ALT" command="spin_over"/> + <binding key="PGDN" mask="CTL_ALT" command="spin_under"/> + + + <binding key="A" mask="NONE" command="spin_around_cw_sitting"/> + <binding key="D" mask="NONE" command="spin_around_ccw_sitting"/> + <binding key="W" mask="NONE" command="move_forward_sitting"/> + <binding key="S" mask="NONE" command="move_backward_sitting"/> + <binding key="E" mask="NONE" command="spin_over_sitting"/> + <binding key="C" mask="NONE" command="spin_under_sitting"/> + + <binding key="LEFT" mask="NONE" command="spin_around_cw_sitting"/> + <binding key="RIGHT" mask="NONE" command="spin_around_ccw_sitting"/> + <binding key="UP" mask="NONE" command="move_forward_sitting"/> + <binding key="DOWN" mask="NONE" command="move_backward_sitting"/> + <binding key="PGUP" mask="NONE" command="spin_over_sitting"/> + <binding key="PGDN" mask="NONE" command="spin_under_sitting"/> + + <binding key="PAD_LEFT" mask="NONE" command="spin_around_cw_sitting"/> + <binding key="PAD_RIGHT" mask="NONE" command="spin_around_ccw_sitting"/> + <binding key="PAD_UP" mask="NONE" command="move_forward_sitting"/> + <binding key="PAD_DOWN" mask="NONE" command="move_backward_sitting"/> + <binding key="PAD_PGUP" mask="NONE" command="spin_over_sitting"/> + <binding key="PAD_PGDN" mask="NONE" command="spin_under_sitting"/> + <binding key="PAD_CENTER" mask="NONE" command="stop_moving"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + + <!--these are for passing controls when sitting on vehicles--> + <binding key="A" mask="SHIFT" command="slide_left"/> + <binding key="D" mask="SHIFT" command="slide_right"/> + <binding key="LEFT" mask="SHIFT" command="slide_left"/> + <binding key="RIGHT" mask="SHIFT" command="slide_right"/> + + <binding key="PAD_LEFT" mask="SHIFT" command="slide_left"/> + <binding key="PAD_RIGHT" mask="SHIFT" command="slide_right"/> + <binding key="PAD_ENTER" mask="SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="SHIFT" command="start_gesture"/> + + <!--pan on Alt-Shift--> + <binding key="A" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="D" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="W" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="S" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + + <binding key="PAD_LEFT" mask="CTL_ALT_SHIFT" command="pan_left"/> + <binding key="PAD_RIGHT" mask="CTL_ALT_SHIFT" command="pan_right"/> + <binding key="PAD_UP" mask="CTL_ALT_SHIFT" command="pan_up"/> + <binding key="PAD_DOWN" mask="CTL_ALT_SHIFT" command="pan_down"/> + <binding key="PAD_ENTER" mask="CTL_ALT_SHIFT" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="CTL_ALT_SHIFT" command="start_gesture"/> + + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + </sitting> + <edit_avatar> + <!--Avatar editing camera controls--> + <binding key="A" mask="NONE" command="edit_avatar_spin_cw"/> + <binding key="D" mask="NONE" command="edit_avatar_spin_ccw"/> + <binding key="W" mask="NONE" command="edit_avatar_move_forward"/> + <binding key="S" mask="NONE" command="edit_avatar_move_backward"/> + <binding key="E" mask="NONE" command="edit_avatar_spin_over"/> + <binding key="C" mask="NONE" command="edit_avatar_spin_under"/> + <binding key="LEFT" mask="NONE" command="edit_avatar_spin_cw"/> + <binding key="RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/> + <binding key="UP" mask="NONE" command="edit_avatar_move_forward"/> + <binding key="DOWN" mask="NONE" command="edit_avatar_move_backward"/> + <binding key="PGUP" mask="NONE" command="edit_avatar_spin_over"/> + <binding key="PGDN" mask="NONE" command="edit_avatar_spin_under"/> + <binding key="ENTER" mask="NONE" command="start_chat"/> + <binding key="DIVIDE" mask="NONE" command="start_gesture"/> + <binding key="PAD_LEFT" mask="NONE" command="edit_avatar_spin_cw"/> + <binding key="PAD_RIGHT" mask="NONE" command="edit_avatar_spin_ccw"/> + <binding key="PAD_UP" mask="NONE" command="edit_avatar_move_forward"/> + <binding key="PAD_DOWN" mask="NONE" command="edit_avatar_move_backward"/> + <binding key="PAD_PGUP" mask="NONE" command="edit_avatar_spin_over"/> + <binding key="PAD_PGDN" mask="NONE" command="edit_avatar_spin_under"/> + <binding key="PAD_ENTER" mask="NONE" command="start_chat"/> + <binding key="PAD_DIVIDE" mask="NONE" command="start_gesture"/> + </edit_avatar> +</keys>
\ No newline at end of file diff --git a/indra/newview/app_settings/llsd.xsd b/indra/newview/app_settings/llsd.xsd new file mode 100644 index 0000000000..34612d9faa --- /dev/null +++ b/indra/newview/app_settings/llsd.xsd @@ -0,0 +1,131 @@ +<?xml version="1.0"?> +<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + + <!-- LLSD document has exactly one value --> + <xsd:element name="llsd"> + <xsd:complexType> + <xsd:group ref="llsd-value" /> + </xsd:complexType> + </xsd:element> + + <!-- Value is one of undef, boolean, integer, real, + uuid, string, date, binary, array, or map --> + <xsd:group name="llsd-value"> + <xsd:choice> + <xsd:element ref="undef"/> + <xsd:element ref="boolean"/> + <xsd:element ref="integer"/> + <xsd:element ref="real"/> + <xsd:element ref="uuid"/> + <xsd:element ref="string"/> + <xsd:element ref="date"/> + <xsd:element ref="uri"/> + <xsd:element ref="binary"/> + <xsd:element ref="array"/> + <xsd:element ref="map"/> + </xsd:choice> + </xsd:group> + + <!-- Undefined is an empty eleemnt --> + <xsd:element name="undef"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:length value="0" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- Boolean is true or false --> + <xsd:element name="boolean"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:enumeration value="true" /> + <xsd:enumeration value="false" /> + + <!-- In practice, these other serializations are seen: --> + <xsd:enumeration value="" /> + <xsd:enumeration value="1" /> + <xsd:enumeration value="0" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- Integer is restricted to 32-bit signed values --> + <xsd:element name="integer"> + <xsd:simpleType> + <xsd:restriction base="xsd:int" /> + </xsd:simpleType> + </xsd:element> + + <!-- Real is an IEEE 754 "double" value, including Infinities and NaN --> + <xsd:element name="real"> + <xsd:simpleType> + <!-- TODO: xsd:double uses "INF", "-INF", and "NaN", + whereas LLSD prefers "Infinity", "-Infinity" and "NaN" --> + <xsd:restriction base="xsd:double" /> + </xsd:simpleType> + </xsd:element> + + <!-- UUID per RFC 4122 --> + <xsd:element name="uuid"> + <xsd:simpleType> + <xsd:restriction base="xsd:string"> + <xsd:pattern value="[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- String is any sequence of Unicode characters --> + <xsd:element name="string"> + <xsd:simpleType> + <xsd:restriction base="xsd:string" /> + </xsd:simpleType> + </xsd:element> + + <!-- Date is ISO 8601 in UTC --> + <xsd:element name="date"> + <xsd:simpleType> + <xsd:restriction base="xsd:dateTime"> + <!-- Restrict to UTC (Z) times --> + <xsd:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?Z" /> + </xsd:restriction> + </xsd:simpleType> + </xsd:element> + + <!-- URI per RFC 3986 --> + <xsd:element name="uri"> + <xsd:simpleType> + <xsd:restriction base="xsd:anyURI" /> + </xsd:simpleType> + </xsd:element> + + <!-- Binary data is base64 encoded --> + <xsd:element name="binary"> + <xsd:simpleType> + <!-- TODO: Require encoding attribute? --> + <xsd:restriction base="xsd:base64Binary" /> + </xsd:simpleType> + </xsd:element> + + <!-- Array is a sequence of zero or more values --> + <xsd:element name="array"> + <xsd:complexType> + <xsd:group minOccurs="0" maxOccurs="unbounded" ref="llsd-value" /> + </xsd:complexType> + </xsd:element> + + <!-- Map is a sequence of zero or more key/value pairs --> + <xsd:element name="map"> + <xsd:complexType> + <xsd:sequence minOccurs="0" maxOccurs="unbounded"> + <xsd:element name="key"> + <xsd:simpleType> + <xsd:restriction base="xsd:string" /> + </xsd:simpleType> + </xsd:element> + <xsd:group ref="llsd-value" /> + </xsd:sequence> + </xsd:complexType> + </xsd:element> + +</xsd:schema> diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml index 136087f69b..a5bbdfc1d0 100644 --- a/indra/newview/app_settings/low_graphics.xml +++ b/indra/newview/app_settings/low_graphics.xml @@ -26,8 +26,6 @@ <RenderTerrainLODFactor value="1.0"/> <!--Default for now--> <RenderTreeLODFactor value="0.5"/> - <!--Default for now--> - <RenderUseFBO value="0"/> <!--Try Impostors--> <RenderUseImpostors value="TRUE"/> <!--Default for now--> diff --git a/indra/newview/app_settings/mid_graphics.xml b/indra/newview/app_settings/mid_graphics.xml index c150a87cdf..a1430a58f9 100644 --- a/indra/newview/app_settings/mid_graphics.xml +++ b/indra/newview/app_settings/mid_graphics.xml @@ -24,8 +24,6 @@ <RenderTerrainLODFactor value="1.0"/> <!--Default for now--> <RenderTreeLODFactor value="0.5"/> - <!--Default for now--> - <RenderUseFBO value="0"/> <!--Try Impostors--> <RenderUseImpostors value="TRUE"/> <!--Default for now--> diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5cc8c34cd5..f295867559 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1,5 +1,6 @@ <?xml version="1.0" ?> -<llsd> +<llsd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="llsd.xsd"> <map> <key>CrashHostUrl</key> <map> @@ -35,6 +36,17 @@ <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> @@ -596,6 +608,17 @@ <key>Value</key> <integer>2</integer> </map> + <key>AvatarPickerURL</key> + <map> + <key>Comment</key> + <string>Avatar picker contents</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://interest.secondlife.com/viewer/avatar</string> + </map> <key>AvatarBakedTextureUploadTimeout</key> <map> <key>Comment</key> @@ -1161,13 +1184,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> @@ -1332,7 +1355,56 @@ <key>Value</key> <integer>0</integer> </map> - <key>CertStore</key> + + <key>CameraFNumber</key> + <map> + <key>Comment</key> + <string>Camera f-number value for DoF effect</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>9.0</real> + </map> + + <key>CameraFocalLength</key> + <map> + <key>Comment</key> + <string>Camera focal length for DoF effect (in millimeters)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>50</real> + </map> + + <key>CameraFieldOfView</key> + <map> + <key>Comment</key> + <string>Vertical camera field of view for DoF effect (in degrees)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>60.0</real> + </map> + + <key>CameraAspectRatio</key> + <map> + <key>Comment</key> + <string>Camera aspect ratio for DoF effect</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>1.5</real> + </map> + + <key>CertStore</key> <map> <key>Comment</key> <string>Specifies the Certificate Store for certificate trust verification</string> @@ -1354,6 +1426,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> @@ -2545,7 +2628,18 @@ <key>Value</key> <integer>10</integer> </map> - <key>DisableCameraConstraints</key> + <key>DestinationGuideURL</key> + <map> + <key>Comment</key> + <string>Destination guide contents</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>http://www.secondlife.com</string> + </map> + <key>DisableCameraConstraints</key> <map> <key>Comment</key> <string>Disable the normal bounds put on the camera by avatar position</string> @@ -2567,6 +2661,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DisableExternalBrowser</key> + <map> + <key>Comment</key> + <string>Disable opening an external browser.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DisableRendering</key> <map> <key>Comment</key> @@ -2578,6 +2683,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>DisableTextHyperlinkActions</key> + <map> + <key>Comment</key> + <string>Disable highlighting and linking of URLs in XUI text boxes</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>DisableVerticalSync</key> <map> <key>Comment</key> @@ -2721,6 +2837,28 @@ <key>Value</key> <integer>1</integer> </map> + <key>ClickActionBuyEnabled</key> + <map> + <key>Comment</key> + <string>Enable click to buy actions in tool pie menu</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>ClickActionPayEnabled</key> + <map> + <key>Comment</key> + <string>Enable click to pay actions in tool pie menu</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>DoubleClickAutoPilot</key> <map> <key>Comment</key> @@ -2864,6 +3002,39 @@ <key>Value</key> <integer>1</integer> </map> + <key>EnableGrab</key> + <map> + <key>Comment</key> + <string>Use Ctrl+mouse to grab and manipulate objects</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableAltZoom</key> + <map> + <key>Comment</key> + <string>Use Alt+mouse to look at and zoom in on objects</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>EnableMouselook</key> + <map> + <key>Comment</key> + <string>Allow first person perspective and mouse control of camera</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>EnableRippleWater</key> <map> <key>Comment</key> @@ -3557,72 +3728,6 @@ <key>Value</key> <real>0.5</real> </map> - <key>FontMonospace</key> - <map> - <key>Comment</key> - <string>Name of monospace font that definitely exists (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>DejaVuSansMono.ttf</string> - </map> - <key>FontSansSerif</key> - <map> - <key>Comment</key> - <string>Name of primary sans-serif font that definitely exists (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>MtBkLfRg.ttf</string> - </map> - <key>FontSansSerifBundledFallback</key> - <map> - <key>Comment</key> - <string>Name of secondary sans-serif font that definitely exists (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>DejaVuSansCondensed.ttf</string> - </map> - <key>FontSansSerifBold</key> - <map> - <key>Comment</key> - <string>Name of bold font (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string>MtBdLfRg.ttf</string> - </map> - <key>FontSansSerifFallback</key> - <map> - <key>Comment</key> - <string>Name of sans-serif font (Truetype file name)</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string /> - </map> - <key>FontSansSerifFallbackScale</key> - <map> - <key>Comment</key> - <string>Scale of fallback font relative to huge font (fraction of huge font size)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>1.0</real> - </map> <key>FontScreenDPI</key> <map> <key>Comment</key> @@ -3634,61 +3739,6 @@ <key>Value</key> <real>96.0</real> </map> - <key>FontSizeHuge</key> - <map> - <key>Comment</key> - <string>Size of huge font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>16.0</real> - </map> - <key>FontSizeLarge</key> - <map> - <key>Comment</key> - <string>Size of large font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>12.0</real> - </map> - <key>FontSizeMedium</key> - <map> - <key>Comment</key> - <string>Size of medium font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>10.0</real> - </map> - <key>FontSizeMonospace</key> - <map> - <key>Comment</key> - <string>Size of monospaced font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>8.1</real> - </map> - <key>FontSizeSmall</key> - <map> - <key>Comment</key> - <string>Size of small font (points, or 1/72 of an inch)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>9.0</real> - </map> <key>ForceAssetFail</key> <map> <key>Comment</key> @@ -3881,7 +3931,7 @@ <key>Comment</key> <string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>String</string> <key>Value</key> @@ -3931,6 +3981,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>HostID</key> + <map> + <key>Comment</key> + <string>Machine identifier for hosted Second Life instances</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string /> + </map> <key>HtmlHelpLastPage</key> <map> <key>Comment</key> @@ -3969,7 +4030,7 @@ <key>Comment</key> <string>Ignore all notifications so we never need user input on them.</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> @@ -3997,6 +4058,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.65</real> + </map> <key>InBandwidth</key> <map> <key>Comment</key> @@ -4592,6 +4664,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>LocalFileSystemBrowsingEnabled</key> + <map> + <key>Comment</key> + <string>Enable/disable access to the local file system via the file picker</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>LoginSRVTimeout</key> <map> <key>Comment</key> @@ -5219,61 +5302,6 @@ <key>Value</key> <real>60.0</real> </map> - <key>MeanCollisionBump</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse of being bumped by an object or avatar</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionPhysical</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse from a physical object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionPushObject</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse of being pushed by a scripted object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionScripted</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse from a scripted object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>MeanCollisionSelected</key> - <map> - <key>Comment</key> - <string>You have experienced an abuse of being pushed via a selected object</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>MediaControlFadeTime</key> <map> <key>Comment</key> @@ -6419,7 +6447,177 @@ <key>Value</key> <integer>13</integer> </map> - <key>PrimMediaMasterEnabled</key> + + <key>PreviewAmbientColor</key> + <map> + <key>Comment</key> + <string>Ambient color of preview render.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>0.0</real> + <real>0.0</real> + <real>0.0</real> + <real>1.0</real> + </array> + </map> + + + <key>PreviewDiffuse0</key> + <map> + <key>Comment</key> + <string>Diffise color of preview light 0.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + </array> + </map> + + <key>PreviewDiffuse1</key> + <map> + <key>Comment</key> + <string>Diffise color of preview light 1.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>0.25</real> + <real>0.25</real> + <real>0.25</real> + <real>1.0</real> + </array> + </map> + + <key>PreviewDiffuse2</key> + <map> + <key>Comment</key> + <string>Diffise color of preview light 2.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + </array> + </map> + + <key>PreviewSpecular0</key> + <map> + <key>Comment</key> + <string>Diffise color of preview light 0.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + </array> + </map> + + <key>PreviewSpecular1</key> + <map> + <key>Comment</key> + <string>Diffise color of preview light 1.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + </array> + </map> + + <key>PreviewSpecular2</key> + <map> + <key>Comment</key> + <string>Diffise color of preview light 2.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Color4</string> + <key>Value</key> + <array> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + <real>1.0</real> + </array> + </map> + + + <key>PreviewDirection0</key> + <map> + <key>Comment</key> + <string>Direction of light 0 for preview render.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>-0.75</real> + <real>1</real> + <real>1.0</real> + </array> + </map> + + <key>PreviewDirection1</key> + <map> + <key>Comment</key> + <string>Direction of light 1 for preview render.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.5</real> + <real>-0.6</real> + <real>0.4</real> + </array> + </map> + + <key>PreviewDirection2</key> + <map> + <key>Comment</key> + <string>Direction of light 2 for preview render.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Vector3</string> + <key>Value</key> + <array> + <real>0.5</real> + <real>-0.8</real> + <real>0.3</real> + </array> + </map> + + <key>PrimMediaMasterEnabled</key> <map> <key>Comment</key> <string>Whether or not Media on a Prim is enabled.</string> @@ -6617,6 +6815,28 @@ <key>Value</key> <real>0.0</real> </map> + <key>QuitAfterSecondsOfAFK</key> + <map> + <key>Comment</key> + <string>The duration allowed after being AFK before quitting.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> + <real>0.0</real> + </map> + <key>QuitOnLoginActivated</key> + <map> + <key>Comment</key> + <string>Quit if login page is activated (used when auto login is on and users must not be able to login manually)</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>RadioLandBrushAction</key> <map> <key>Comment</key> @@ -7922,17 +8142,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>RenderFastUI</key> - <map> - <key>Comment</key> - <string>[NOT USED]</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>RenderFlexTimeFactor</key> <map> <key>Comment</key> @@ -8448,6 +8657,28 @@ <key>Value</key> <real>1.0</real> </map> + <key>RenderTrackerBeacon</key> + <map> + <key>Comment</key> + <string>Display tracking arrow and beacon to target avatar, teleport destination</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </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> @@ -8492,17 +8723,6 @@ <key>Value</key> <integer>0</integer> </map> - <key>RenderUseFBO</key> - <map> - <key>Comment</key> - <string>Whether we want to use GL_EXT_framebuffer_objects.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>1</integer> - </map> <key>RenderUseTriStrips</key> <map> <key>Comment</key> @@ -8635,6 +8855,17 @@ <key>Value</key> <integer>512</integer> </map> + <key>RenderParcelSelection</key> + <map> + <key>Comment</key> + <string>Display selected parcel outline</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>RotateRight</key> <map> <key>Comment</key> @@ -8767,6 +8998,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>ScriptsCanShowUI</key> + <map> + <key>Comment</key> + <string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> <key>SecondLifeEnterprise</key> <map> <key>Comment</key> @@ -11231,7 +11473,62 @@ <key>Value</key> <integer>15</integer> </map> - <key>UploadBakedTexOld</key> + <key>UpdaterServiceActive</key> + <map> + <key>Comment</key> + <string>Enable or disable the updater service.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>1</integer> + </map> + <key>UpdaterServiceCheckPeriod</key> + <map> + <key>Comment</key> + <string>Default period between update checking.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>3600</integer> + </map> + <key>UpdaterServiceURL</key> + <map> + <key>Comment</key> + <string>Default location for the updater service.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>https://update.secondlife.com</string> + </map> + <key>UpdaterServicePath</key> + <map> + <key>Comment</key> + <string>Path on the update server host.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>update</string> + </map> + <key>UpdaterServiceProtocolVersion</key> + <map> + <key>Comment</key> + <string>The update protocol version to use.</string> + <key>Persist</key> + <integer>0</integer> + <key>Type</key> + <string>String</string> + <key>Value</key> + <string>v1.0</string> + </map> + <key>UploadBakedTexOld</key> <map> <key>Comment</key> <string>Forces the baked texture pipeline to upload using the old method.</string> @@ -11551,27 +11848,38 @@ <key>Value</key> <integer>1</integer> </map> - <key>VerboseLogs</key> + <key>InterpolationTime</key> <map> <key>Comment</key> - <string>Display source file and line number for each log item for debugging purposes</string> + <string>How long to extrapolate object motion after last packet received</string> <key>Persist</key> <integer>1</integer> <key>Type</key> - <string>Boolean</string> + <string>F32</string> <key>Value</key> - <integer>0</integer> + <integer>3.0</integer> </map> - <key>VersionChannelName</key> + <key>InterpolationPhaseOut</key> <map> <key>Comment</key> - <string>Versioning Channel Name.</string> + <string>Seconds to phase out interpolated motion</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> - <string>String</string> + <string>F32</string> <key>Value</key> - <string>Second Life Release</string> + <integer>1.0</integer> + </map> + <key>VerboseLogs</key> + <map> + <key>Comment</key> + <string>Display source file and line number for each log item for debugging purposes</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> </map> <key>VertexShaderEnable</key> <map> @@ -11672,6 +11980,28 @@ <key>Value</key> <integer>0</integer> </map> + <key>VoiceCallsRejectAll</key> + <map> + <key>Comment</key> + <string>Silently reject all incoming voice calls.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> + <key>VoiceDisableMic</key> + <map> + <key>Comment</key> + <string>Completely disable the ability to open the mic.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>VoiceEffectExpiryWarningTime</key> <map> <key>Comment</key> @@ -11980,6 +12310,17 @@ <key>Value</key> <integer>1</integer> </map> + <key>WindowFullScreen</key> + <map> + <key>Comment</key> + <string>SL viewer window full screen</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>WindowHeight</key> <map> <key>Comment</key> @@ -12046,10 +12387,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> @@ -12277,6 +12618,7 @@ <key>Comment</key> <string>Maximum texture width for user uploaded textures</string> <key>Persist</key> + <integer>1</integer> <key>Type</key> <string>S32</string> <key>Value</key> @@ -12316,6 +12658,7 @@ <key>Value</key> <array> <string>snapshot</string> + <string>postcard</string> <string>mini_map</string> </array> </map> @@ -12383,6 +12726,17 @@ <key>Type</key> <string>F32</string> <key>Value</key> + <real>1200.0</real> + </map> + <key>AvatarPickerHintTimeout</key> + <map> + <key>Comment</key> + <string>Number of seconds to wait before telling resident about avatar picker.</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>F32</string> + <key>Value</key> <real>600.0</real> </map> <key>SidePanelHintTimeout</key> 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/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 03c2e63fb1..7c89c01ea4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -17,6 +17,10 @@ uniform sampler2D bloomMap; uniform float depth_cutoff; uniform float norm_cutoff; +uniform float focal_distance; +uniform float blur_constant; +uniform float tan_pixel_angle; +uniform float magnification; uniform mat4 inv_proj; uniform vec2 screen_res; @@ -32,55 +36,92 @@ float getDepth(vec2 pos_screen) return p.z/p.w; } +void dofSample(inout vec4 diff, inout float w, float fd, float x, float y) +{ + vec2 tc = vary_fragcoord.xy+vec2(x,y); + float d = getDepth(tc); + + float wg = 1.0; + //if (d < fd) + //{ + // diff += texture2DRect(diffuseRect, tc); + // w = 1.0; + //} + if (d > fd) + { + wg = max(d/fd, 0.1); + } + + diff += texture2DRect(diffuseRect, tc+vec2(0.5,0.5))*wg*0.25; + diff += texture2DRect(diffuseRect, tc+vec2(-0.5,0.5))*wg*0.25; + diff += texture2DRect(diffuseRect, tc+vec2(0.5,-0.5))*wg*0.25; + diff += texture2DRect(diffuseRect, tc+vec2(-0.5,-0.5))*wg*0.25; + w += wg; +} + +void dofSampleNear(inout vec4 diff, inout float w, float x, float y) +{ + vec2 tc = vary_fragcoord.xy+vec2(x,y); + + diff += texture2DRect(diffuseRect, tc); + w += 1.0; +} + void main() { vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm - float depth = getDepth(vary_fragcoord.xy); + vec2 tc = vary_fragcoord.xy; float sc = 0.75; - vec2 de; - de.x = (depth-getDepth(tc+vec2(sc, sc))) + (depth-getDepth(tc+vec2(-sc, -sc))); - de.y = (depth-getDepth(tc+vec2(-sc, sc))) + (depth-getDepth(tc+vec2(sc, -sc))); - de /= depth; - de *= de; - de = step(depth_cutoff, de); - - vec2 ne; - vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb; - nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm - ne.x = dot(nexnorm, norm); - vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb; - neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm - ne.y = dot(neynorm, norm); - - ne = 1.0-ne; - - ne = step(norm_cutoff, ne); - - float edge_weight = clamp(dot(de,de)+dot(ne,ne), 0.0, 1.0); - //edge_weight *= 0.0; - - vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); + float depth; + depth = getDepth(tc); + vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,-1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,-1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,0))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,0))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,-1))*edge_weight; - - diff /= 1.0+edge_weight*8.0; - vec4 blur = texture2DRect(edgeMap, vary_fragcoord.xy); - - //gl_FragColor = vec4(edge_weight,edge_weight,edge_weight, 1.0); + { //pixel is behind far focal plane + float w = 1.0; + + sc = (abs(depth-focal_distance)/-depth)*blur_constant; + + sc /= magnification; + + // tan_pixel_angle = pixel_length/-depth; + float pixel_length = tan_pixel_angle*-focal_distance; + + sc = sc/pixel_length; + + //diff.r = sc; + + sc = min(abs(sc), 8.0); + + //sc = 4.0; + + float fd = depth*0.5f; + + while (sc > 1.0) + { + dofSample(diff,w, fd, sc,sc); + dofSample(diff,w, fd, -sc,sc); + dofSample(diff,w, fd, sc,-sc); + dofSample(diff,w, fd, -sc,-sc); + + sc -= 0.5; + float sc2 = sc*1.414; + dofSample(diff,w, fd, 0,sc2); + dofSample(diff,w, fd, 0,-sc2); + dofSample(diff,w, fd, -sc2,0); + dofSample(diff,w, fd, sc2,0); + sc -= 0.5; + } + + diff /= w; + } + + vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); gl_FragColor = diff + bloom; - //gl_FragColor.r = edge_weight; } diff --git a/indra/newview/app_settings/ultra_graphics.xml b/indra/newview/app_settings/ultra_graphics.xml index e7dce3b989..f741089ca2 100644 --- a/indra/newview/app_settings/ultra_graphics.xml +++ b/indra/newview/app_settings/ultra_graphics.xml @@ -24,8 +24,6 @@ <RenderTerrainLODFactor value="2.0"/> <!--Default for now--> <RenderTreeLODFactor value="1.0"/> - <!--Default for now--> - <RenderUseFBO value="1"/> <!--Try Impostors--> <RenderUseImpostors value="TRUE"/> <!--Default for now--> diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index 8dd4b62a37..e658f86627 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -43,6 +43,7 @@ RenderLocalLights 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 @@ -60,10 +61,8 @@ RenderDeferred 1 1 SkyUseClassicClouds 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 -RenderUseFBO 1 1 WatchdogDisabled 1 1 RenderUseStreamVBO 1 1 -RenderUseFBO 1 1 // // Low Graphics Settings @@ -83,6 +82,7 @@ RenderLocalLights 1 0 RenderReflectionDetail 1 0 RenderTerrainDetail 1 0 RenderTerrainLODFactor 1 1 +RenderTransparentWater 1 0 RenderTreeLODFactor 1 0 RenderUseImpostors 1 1 RenderVolumeLODFactor 1 0.5 @@ -93,7 +93,6 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Mid Graphics Settings @@ -112,6 +111,7 @@ RenderLocalLights 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 @@ -121,7 +121,6 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // High Graphics Settings (purty) @@ -140,6 +139,7 @@ RenderLocalLights 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 @@ -149,7 +149,6 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -168,6 +167,7 @@ RenderLocalLights 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 @@ -177,7 +177,6 @@ WLSkyDetail 1 128 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 -RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) @@ -254,7 +253,6 @@ WindLightUseAtmosShaders 0 0 RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 -RenderUseFBO 1 0 // diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt index 1114104d84..087fb828f6 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 @@ -60,7 +61,6 @@ RenderDeferred 1 0 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 -RenderUseFBO 1 1 // // Low Graphics Settings @@ -79,6 +79,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 @@ -89,7 +90,6 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Mid Graphics Settings @@ -107,6 +107,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 @@ -116,7 +117,6 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // High Graphics Settings (purty) @@ -134,6 +134,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 +144,6 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -161,6 +161,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 +171,6 @@ WLSkyDetail 1 128 RenderDeferred 1 1 RenderDeferredSSAO 1 1 RenderShadowDetail 1 2 -RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) @@ -245,7 +245,6 @@ WindLightUseAtmosShaders 0 0 RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 -RenderUseFBO 1 0 // diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index 2fa47c38d5..8a76b1cf34 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 @@ -60,7 +61,6 @@ Disregard128DefaultDrawDistance 1 1 Disregard96DefaultDrawDistance 1 1 SkyUseClassicClouds 1 1 WatchdogDisabled 1 1 -RenderUseFBO 1 1 // // Low Graphics Settings @@ -80,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 @@ -88,7 +89,6 @@ VertexShaderEnable 1 0 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 SkyUseClassicClouds 1 0 -RenderUseFBO 1 0 // // Mid Graphics Settings @@ -107,6 +107,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 @@ -114,7 +115,6 @@ RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 0 WLSkyDetail 1 48 -RenderUseFBO 1 0 // // High Graphics Settings (purty) @@ -133,6 +133,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 +141,6 @@ RenderWaterReflections 1 0 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 48 -RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -159,6 +159,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 +167,6 @@ RenderWaterReflections 1 1 VertexShaderEnable 1 1 WindLightUseAtmosShaders 1 1 WLSkyDetail 1 128 -RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) @@ -232,7 +232,6 @@ RenderUseImpostors 0 0 RenderVBOEnable 1 0 RenderWaterReflections 0 0 WindLightUseAtmosShaders 0 0 -RenderUseFBO 1 0 // // CPU based feature masks @@ -377,7 +376,6 @@ list ATI_Radeon_X1500 Disregard128DefaultDrawDistance 1 0 list ATI_Radeon_X1600 Disregard128DefaultDrawDistance 1 0 -RenderUseFBO 0 0 list ATI_Radeon_X1700 Disregard128DefaultDrawDistance 1 0 list ATI_Mobility_Radeon_X1xxx diff --git a/indra/newview/featuretable_xp.txt b/indra/newview/featuretable_xp.txt index a6807e6dc1..527a194fdf 100644 --- a/indra/newview/featuretable_xp.txt +++ b/indra/newview/featuretable_xp.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 @@ -59,7 +60,6 @@ SkyUseClassicClouds 1 1 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 1 WatchdogDisabled 1 1 RenderUseStreamVBO 1 1 @@ -80,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 @@ -90,7 +91,6 @@ SkyUseClassicClouds 1 0 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Mid Graphics Settings @@ -108,6 +108,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 @@ -117,7 +118,6 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // High Graphics Settings (purty) @@ -135,6 +135,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 +145,6 @@ WLSkyDetail 1 48 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Ultra graphics (REALLY PURTY!) @@ -162,6 +162,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 +172,6 @@ WLSkyDetail 1 128 RenderDeferred 1 0 RenderDeferredSSAO 1 0 RenderShadowDetail 1 0 -RenderUseFBO 1 0 // // Class Unknown Hardware (unknown) @@ -246,7 +246,6 @@ WindLightUseAtmosShaders 0 0 RenderDeferred 0 0 RenderDeferredSSAO 0 0 RenderShadowDetail 0 0 -RenderUseFBO 1 0 // // CPU based feature masks diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py index 8f2dfd2348..4fd04d780e 100644 --- a/indra/newview/generate_breakpad_symbols.py +++ b/indra/newview/generate_breakpad_symbols.py @@ -31,6 +31,7 @@ import fnmatch import itertools import operator import os +import re import sys import shlex import subprocess @@ -45,8 +46,12 @@ class MissingModuleError(Exception): Exception.__init__(self, "Failed to find required modules: %r" % modules) self.modules = modules -def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): - print "generate_breakpad_symbols run with args: %s" % str((viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) +def main(configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file): + print "generate_breakpad_symbols run with args: %s" % str((configuration, viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file)) + + if not re.match("release", configuration, re.IGNORECASE): + print "skipping breakpad symbol generation for non-release build." + return 0 # split up list of viewer_exes # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin'] @@ -122,7 +127,7 @@ def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_fil return 0 if __name__ == "__main__": - if len(sys.argv) != 6: + if len(sys.argv) != 7: usage() sys.exit(1) sys.exit(main(*sys.argv[1:])) diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index da888bc64d..bf604d6805 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -207,6 +207,7 @@ NVIDIA GTX 280 .*NVIDIA.*GeForce GTX 28.* 3 1 NVIDIA GTX 290 .*NVIDIA.*GeForce GTX 29.* 3 1 NVIDIA GTX 470 .*NVIDIA.*GeForce GTX 47.* 3 1 NVIDIA GTX 480 .*NVIDIA.*GeForce GTX 48.* 3 1 +NVIDIA GTX 580 .*NVIDIA.*GeForce GTX 58.* 3 1 NVIDIA C51 .*NVIDIA.*C51.* 0 1 NVIDIA G72 .*NVIDIA.*G72.* 1 1 NVIDIA G73 .*NVIDIA.*G73.* 1 1 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index d5712f80cf..4e8ed807ee 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -85,6 +85,8 @@ AutoCloseWindow true ; after all files install, close window InstallDir "$PROGRAMFILES\${INSTNAME}" InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "" DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) +Page directory dirPre +Page instfiles ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Variables @@ -95,6 +97,8 @@ Var INSTFLAGS Var INSTSHORTCUT Var COMMANDLINE ; command line passed to this installer, set in .onInit Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer +Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall + ; GUI and the defaults. ;;; Function definitions should go before file includes, because calls to ;;; DLLs like LangDLL trigger an implicit file include, so if that call is at @@ -110,6 +114,9 @@ Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function .onInstSuccess Push $R0 # Option value, unused + + StrCmp $SKIP_DIALOGS "true" label_launch + ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0 # If parameter was there (no error) just launch # Otherwise ask @@ -128,6 +135,13 @@ label_no_launch: Pop $R0 FunctionEnd +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Pre-directory page callback +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function dirPre + StrCmp $SKIP_DIALOGS "true" 0 +2 + Abort +FunctionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Make sure we're not on Windows 98 / ME @@ -145,7 +159,8 @@ Function CheckWindowsVersion StrCmp $R0 "NT" win_ver_bad Return win_ver_bad: - MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort + StrCmp $SKIP_DIALOGS "true" +2 ; If skip_dialogs is set just install + MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort Return win_ver_abort: Quit @@ -184,13 +199,13 @@ FunctionEnd ; If it has, allow user to bail out of install process. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function CheckIfAlreadyCurrent - Push $0 - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" - StrCmp $0 ${VERSION_LONG} 0 DONE - MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK DONE + Push $0 + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\$INSTPROG" "Version" + StrCmp $0 ${VERSION_LONG} 0 continue_install + StrCmp $SKIP_DIALOGS "true" continue_install + MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK continue_install Quit - - DONE: +continue_install: Pop $0 Return FunctionEnd @@ -203,7 +218,9 @@ Function CloseSecondLife Push $0 FindWindow $0 "Second Life" "" IntCmp $0 0 DONE - MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL + + StrCmp $SKIP_DIALOGS "true" CLOSE + MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL CANCEL_INSTALL: Quit @@ -659,23 +676,29 @@ FunctionEnd Function .onInit Push $0 ${GetParameters} $COMMANDLINE ; get our command line + + ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0 + IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS + StrCpy $SKIP_DIALOGS "true" + ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English ; If no language (error), then proceed - IfErrors lbl_check_silent + IfErrors lbl_configure_default_lang ; No error means we got a language, so use it StrCpy $LANGUAGE $0 Goto lbl_return -lbl_check_silent: - ; For silent installs, no language prompt, use default - IfSilent lbl_return - - ; If we currently have a version of SL installed, default to the language of that install +lbl_configure_default_lang: + ; If we currently have a version of SL installed, default to the language of that install ; Otherwise don't change $LANGUAGE and it will default to the OS UI language. - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" - IfErrors lbl_build_menu + ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Linden Research, Inc.\${INSTNAME}" "InstallerLanguage" + IfErrors +2 0 ; If error skip the copy instruction StrCpy $LANGUAGE $0 + ; For silent installs, no language prompt, use default + IfSilent lbl_return + StrCmp $SKIP_DIALOGS "true" lbl_return + lbl_build_menu: Push "" # Use separate file so labels can be UTF-16 but we can still merge changes diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index da3ee7cb2b..4a23081069 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -56,9 +56,9 @@ #include "llparcel.h" #include "llrendersphere.h" #include "llsdutil.h" -#include "llsidetray.h" #include "llsky.h" #include "llsmoothstep.h" +#include "llstartup.h" #include "llstatusbar.h" #include "llteleportflags.h" #include "lltool.h" @@ -1726,9 +1726,6 @@ void LLAgent::endAnimationUpdateUI() LLBottomTray::getInstance()->onMouselookModeOut(); - LLSideTray::getInstance()->getButtonsPanel()->setVisible(TRUE); - LLSideTray::getInstance()->updateSidetrayVisibility(); - LLPanelStandStopFlying::getInstance()->setVisible(TRUE); LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset); @@ -1828,9 +1825,6 @@ void LLAgent::endAnimationUpdateUI() LLBottomTray::getInstance()->onMouselookModeIn(); - LLSideTray::getInstance()->getButtonsPanel()->setVisible(FALSE); - LLSideTray::getInstance()->updateSidetrayVisibility(); - LLPanelStandStopFlying::getInstance()->setVisible(FALSE); // clear out camera lag effect @@ -2452,7 +2446,7 @@ BOOL LLAgent::setUserGroupFlags(const LLUUID& group_id, BOOL accept_notices, BOO BOOL LLAgent::canJoinGroups() const { - return mGroups.count() < MAX_AGENT_GROUPS; + return mGroups.count() < gMaxAgentGroups; } LLQuaternion LLAgent::getHeadRotation() diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 6c598d5d71..aebebad96a 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -33,6 +33,7 @@ #include "llagentconstants.h" #include "llagentdata.h" // gAgentID, gAgentSessionID #include "llcharacter.h" // LLAnimPauseRequest +#include "llcoordframe.h" // for mFrameAgent #include "llpointer.h" #include "lluicolor.h" #include "llvoavatardefines.h" diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 29d26a117f..c49a878648 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2043,7 +2043,7 @@ void LLAgentCamera::resetCamera() //----------------------------------------------------------------------------- void LLAgentCamera::changeCameraToMouselook(BOOL animate) { - if (LLViewerJoystick::getInstance()->getOverrideCamera()) + if (!gSavedSettings.getBOOL("EnableMouselook") || LLViewerJoystick::getInstance()->getOverrideCamera()) { return; } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 62074ddcd5..80734b0d41 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -2437,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 @@ -2941,3 +2947,32 @@ void wear_multiple(const uuid_vec_t& ids, bool replace) } } +// SLapp for easy-wearing of a stock (library) avatar +// +class LLWearFolderHandler : public LLCommandHandler +{ +public: + // not allowed from outside the app + LLWearFolderHandler() : LLCommandHandler("wear_folder", UNTRUSTED_BLOCK) { } + + bool handle(const LLSD& tokens, const LLSD& query_map, + LLMediaCtrl* web) + { + LLPointer<LLInventoryCategory> category = new LLInventoryCategory(query_map["folder_id"], + LLUUID::null, + LLFolderType::FT_CLOTHING, + "Quick Appearance"); + LLSD::UUID folder_uuid = query_map["folder_id"].asUUID(); + if ( gInventory.getCategory( folder_uuid ) != NULL ) + { + LLAppearanceMgr::getInstance()->wearInventoryCategory(category, true, false); + + // *TODOw: This may not be necessary if initial outfit is chosen already -- josh + gAgent.setGenderChosen(TRUE); + } + + return true; + } +}; + +LLWearFolderHandler gWearFolderHandler; diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 4f80ba3aeb..ea2348ea25 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -86,6 +86,7 @@ #include "llweb.h" #include "llsecondlifeurls.h" +#include "llupdaterservice.h" // Linden library includes #include "llavatarnamecache.h" @@ -198,6 +199,7 @@ // Include for security api initialization #include "llsecapi.h" #include "llmachineid.h" +#include "llmainlooprepeater.h" // *FIX: These extern globals should be cleaned up. // The globals either represent state/config/resource-storage of either @@ -466,7 +468,7 @@ static void settings_to_globals() static void settings_modify() { - LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderUseFBO"); + LLRenderTarget::sUseFBO = gSavedSettings.getBOOL("RenderDeferred"); LLVOAvatar::sUseImpostors = gSavedSettings.getBOOL("RenderUseImpostors"); LLVOSurfacePatch::sLODFactor = gSavedSettings.getF32("RenderTerrainLODFactor"); LLVOSurfacePatch::sLODFactor *= LLVOSurfacePatch::sLODFactor; //square lod factor to get exponential range of [1,4] @@ -505,6 +507,9 @@ static void settings_modify() gSavedSettings.setBOOL("VectorizeEnable", FALSE ); gSavedSettings.setU32("VectorizeProcessor", 0 ); gSavedSettings.setBOOL("VectorizeSkin", FALSE); + + // disable fullscreen mode, unsupported + gSavedSettings.setBOOL("WindowFullScreen", FALSE); #endif } @@ -513,16 +518,10 @@ class LLFastTimerLogThread : public LLThread public: std::string mFile; - LLFastTimerLogThread() : 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"); - } + LLFastTimerLogThread(std::string& test_name) : LLThread("fast timer log") + { + std::string file_name = test_name + std::string(".slp"); + mFile = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, file_name); } void run() @@ -584,7 +583,8 @@ LLAppViewer::LLAppViewer() : mAgentRegionLastAlive(false), mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)), mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)), - mFastTimerLogThread(NULL) + mFastTimerLogThread(NULL), + mUpdater(new LLUpdaterService()) { if(NULL != sInstance) { @@ -663,10 +663,13 @@ bool LLAppViewer::init() initThreads(); writeSystemInfo(); - // Build a string representing the current version number. - gCurrentVersion = llformat("%s %s", - gSavedSettings.getString("VersionChannelName").c_str(), - LLVersionInfo::getVersion().c_str()); + // Initialize updater service (now that we have an io pump) + initUpdater(); + if(isQuitting()) + { + // Early out here because updater set the quitting flag. + return true; + } ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -810,6 +813,9 @@ bool LLAppViewer::init() return 1; } + // Initialize the repeater service. + LLMainLoopRepeater::instance().start(); + // // Initialize the window // @@ -824,16 +830,22 @@ bool LLAppViewer::init() gGLManager.getGLInfo(gDebugInfo); gGLManager.printGLInfoString(); - //load key settings - bind_keyboard_functions(); - // Load Default bindings - if (!gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"keys.ini"))) + std::string key_bindings_file = gDirUtilp->findFile("keys.xml", + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""), + gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + + + if (!gViewerKeyboard.loadBindingsXML(key_bindings_file)) { - LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL; + std::string key_bindings_file = gDirUtilp->findFile("keys.ini", + gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, ""), + gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "")); + if (!gViewerKeyboard.loadBindings(key_bindings_file)) + { + LL_ERRS("InitInfo") << "Unable to open keys.ini" << LL_ENDL; + } } - // Load Custom bindings (override defaults) - gViewerKeyboard.loadBindings(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS,"custom_keys.ini")); // If we don't have the right GL requirements, exit. if (!gGLManager.mHasRequirements && !gNoRender) @@ -906,7 +918,8 @@ bool LLAppViewer::init() gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString(); // Save the current version to the prefs file - gSavedSettings.setString("LastRunVersion", gCurrentVersion); + gSavedSettings.setString("LastRunVersion", + LLVersionInfo::getChannelAndVersion()); gSimLastTime = gRenderStartTime.getElapsedTimeF32(); gSimFrames = (F32)gFrameCount; @@ -1310,6 +1323,21 @@ bool LLAppViewer::mainLoop() return true; } +void LLAppViewer::flushVFSIO() +{ + while (1) + { + S32 pending = LLVFSThread::updateClass(0); + pending += LLLFSThread::updateClass(0); + if (!pending) + { + break; + } + llinfos << "Waiting for pending IO to finish: " << pending << llendflush; + ms_sleep(100); + } +} + bool LLAppViewer::cleanup() { // workaround for DEV-35406 crash on shutdown @@ -1318,22 +1346,16 @@ bool LLAppViewer::cleanup() if (LLFastTimerView::sAnalyzePerformance) { 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)); } + LLMetricPerformanceTesterBasic::cleanClass(); // remove any old breakpad minidump files from the log directory if (! isError()) @@ -1387,11 +1409,14 @@ bool LLAppViewer::cleanup() gMeshRepo.shutdown(); // Must clean up texture references before viewer window is destroyed. - LLHUDManager::getInstance()->updateEffects(); - LLHUDObject::updateAll(); - LLHUDManager::getInstance()->cleanupEffects(); - LLHUDObject::cleanupHUDObjects(); - llinfos << "HUD Objects cleaned up" << llendflush; + if(LLHUDManager::instanceExists()) + { + LLHUDManager::getInstance()->updateEffects(); + LLHUDObject::updateAll(); + LLHUDManager::getInstance()->cleanupEffects(); + LLHUDObject::cleanupHUDObjects(); + llinfos << "HUD Objects cleaned up" << llendflush; + } LLKeyframeDataCache::clear(); @@ -1403,8 +1428,10 @@ bool LLAppViewer::cleanup() // Note: this is where gWorldMap used to be deleted. // Note: this is where gHUDManager used to be deleted. - LLHUDManager::getInstance()->shutdownClass(); - + if(LLHUDManager::instanceExists()) + { + LLHUDManager::getInstance()->shutdownClass(); + } delete gAssetStorage; gAssetStorage = NULL; @@ -1467,17 +1494,7 @@ bool LLAppViewer::cleanup() llinfos << "Cache files removed" << llendflush; // Wait for any pending VFS IO - while (1) - { - S32 pending = LLVFSThread::updateClass(0); - pending += LLLFSThread::updateClass(0); - if (!pending) - { - break; - } - llinfos << "Waiting for pending IO to finish: " << pending << llendflush; - ms_sleep(100); - } + flushVFSIO(); llinfos << "Shutting down Views" << llendflush; // Destroy the UI @@ -1670,7 +1687,21 @@ bool LLAppViewer::cleanup() delete mFastTimerLogThread; mFastTimerLogThread = NULL; - LLMetricPerformanceTester::cleanClass() ; + if (LLFastTimerView::sAnalyzePerformance) + { + llinfos << "Analyzing performance" << llendl; + + 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)); + } + + LLMetricPerformanceTesterBasic::cleanClass() ; llinfos << "Cleaning up Media and Textures" << llendflush; @@ -1689,7 +1720,10 @@ bool LLAppViewer::cleanup() #ifndef LL_RELEASE_FOR_DOWNLOAD llinfos << "Auditing VFS" << llendl; - gVFS->audit(); + if(gVFS) + { + gVFS->audit(); + } #endif llinfos << "Misc Cleanup" << llendflush; @@ -1730,6 +1764,8 @@ bool LLAppViewer::cleanup() llinfos << "File launched." << llendflush; } + LLMainLoopRepeater::instance().stop(); + ll_close_fail_log(); llinfos << "Goodbye!" << llendflush; @@ -1777,7 +1813,7 @@ bool LLAppViewer::initThreads() if (LLFastTimer::sLog || LLFastTimer::sMetricLog) { LLFastTimer::sLogLock = new LLMutex(NULL); - mFastTimerLogThread = new LLFastTimerLogThread(); + mFastTimerLogThread = new LLFastTimerLogThread(LLFastTimer::sLogName); mFastTimerLogThread->start(); } @@ -2123,6 +2159,10 @@ bool LLAppViewer::initConfiguration() } } + if(clp.hasOption("channel")) + { + LLVersionInfo::resetChannel(clp.getOption("channel")[0]); + } // If we have specified crash on startup, set the global so we'll trigger the crash at the right time if(clp.hasOption("crashonstartup")) @@ -2133,12 +2173,26 @@ bool LLAppViewer::initConfiguration() if (clp.hasOption("logperformance")) { LLFastTimer::sLog = TRUE; + LLFastTimer::sLogName = std::string("performance"); } - if(clp.hasOption("logmetrics")) - { - LLFastTimer::sMetricLog = TRUE ; - } + 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")) { @@ -2186,7 +2240,7 @@ bool LLAppViewer::initConfiguration() if (clp.hasOption("nonotifications")) { - gSavedSettings.setBOOL("IgnoreAllNotifications", TRUE); + gSavedSettings.getControl("IgnoreAllNotifications")->setValue(true, false); } if (clp.hasOption("debugsession")) @@ -2233,8 +2287,8 @@ bool LLAppViewer::initConfiguration() if(skinfolder && LLStringUtil::null != skinfolder->getValue().asString()) { // hack to force the skin to default. - //gDirUtilp->setSkinFolder(skinfolder->getValue().asString()); - gDirUtilp->setSkinFolder("default"); + gDirUtilp->setSkinFolder(skinfolder->getValue().asString()); + //gDirUtilp->setSkinFolder("default"); } mYieldTime = gSavedSettings.getS32("YieldTime"); @@ -2378,6 +2432,58 @@ bool LLAppViewer::initConfiguration() return true; // Config was successful. } +namespace { + // *TODO - decide if there's a better place for this function. + // do we need a file llupdaterui.cpp or something? -brad + bool notify_update(LLSD const & evt) + { + switch (evt["type"].asInteger()) + { + case LLUpdaterService::DOWNLOAD_COMPLETE: + LLNotificationsUtil::add("DownloadBackground"); + break; + case LLUpdaterService::INSTALL_ERROR: + LLNotificationsUtil::add("FailedUpdateInstall"); + break; + default: + llinfos << "unhandled update event " << evt << llendl; + break; + } + + // let others also handle this event by default + return false; + } +}; + +void LLAppViewer::initUpdater() +{ + // Initialize the updater service. + // Generate URL to the udpater service + // Get Channel + // Get Version + std::string url = gSavedSettings.getString("UpdaterServiceURL"); + std::string channel = LLVersionInfo::getChannel(); + std::string version = LLVersionInfo::getVersion(); + std::string protocol_version = gSavedSettings.getString("UpdaterServiceProtocolVersion"); + std::string service_path = gSavedSettings.getString("UpdaterServicePath"); + U32 check_period = gSavedSettings.getU32("UpdaterServiceCheckPeriod"); + + mUpdater->setAppExitCallback(boost::bind(&LLAppViewer::forceQuit, this)); + mUpdater->initialize(protocol_version, + url, + service_path, + channel, + version); + mUpdater->setCheckPeriod(check_period); + if(gSavedSettings.getBOOL("UpdaterServiceActive")) + { + bool install_if_ready = true; + mUpdater->startChecking(install_if_ready); + } + + LLEventPump & updater_pump = LLEventPumps::instance().obtain(LLUpdaterService::pumpName()); + updater_pump.listen("notify_update", ¬ify_update); +} void LLAppViewer::checkForCrash(void) { @@ -2437,7 +2543,7 @@ bool LLAppViewer::initWindow() VIEWER_WINDOW_CLASSNAME, gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"), gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"), - FALSE, ignorePixelDepth); + gSavedSettings.getBOOL("WindowFullScreen"), ignorePixelDepth); // Need to load feature table before cheking to start watchdog. const S32 NEVER_SUBMIT_REPORT = 2; @@ -2539,15 +2645,18 @@ void LLAppViewer::cleanupSavedSettings() // save window position if not maximized // as we don't track it in callbacks - BOOL maximized = gViewerWindow->mWindow->getMaximized(); - if (!maximized) + if(NULL != gViewerWindow) { - LLCoordScreen window_pos; - - if (gViewerWindow->mWindow->getPosition(&window_pos)) + BOOL maximized = gViewerWindow->mWindow->getMaximized(); + if (!maximized) { - gSavedSettings.setS32("WindowX", window_pos.mX); - gSavedSettings.setS32("WindowY", window_pos.mY); + LLCoordScreen window_pos; + + if (gViewerWindow->mWindow->getPosition(&window_pos)) + { + gSavedSettings.setS32("WindowX", window_pos.mX); + gSavedSettings.setS32("WindowY", window_pos.mY); + } } } @@ -2570,7 +2679,7 @@ void LLAppViewer::writeSystemInfo() { gDebugInfo["SLLog"] = LLError::logFileName(); - gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); + gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel(); gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor(); gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch(); @@ -2673,7 +2782,7 @@ void LLAppViewer::handleViewerCrash() //We already do this in writeSystemInfo(), but we do it again here to make /sure/ we have a version //to check against no matter what - gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); + gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel(); gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor(); gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); @@ -2930,6 +3039,23 @@ void LLAppViewer::forceQuit() LLApp::setQuitting(); } +//TODO: remove +void LLAppViewer::fastQuit(S32 error_code) +{ + // finish pending transfers + flushVFSIO(); + // let sim know we're logging out + sendLogoutRequest(); + // flush network buffers by shutting down messaging system + end_messaging_system(); + // figure out the error code + S32 final_error_code = error_code ? error_code : (S32)isError(); + // this isn't a crash + removeMarkerFile(); + // get outta here + _exit(final_error_code); +} + void LLAppViewer::requestQuit() { llinfos << "requestQuit" << llendl; @@ -2938,6 +3064,13 @@ void LLAppViewer::requestQuit() if( (LLStartUp::getStartupState() < STATE_STARTED) || !region ) { + // If we have a region, make some attempt to send a logout request first. + // This prevents the halfway-logged-in avatar from hanging around inworld for a couple minutes. + if(region) + { + sendLogoutRequest(); + } + // Quit immediately forceQuit(); return; @@ -3002,12 +3135,12 @@ void LLAppViewer::earlyExit(const std::string& name, const LLSD& substitutions) LLNotificationsUtil::add(name, substitutions, LLSD(), finish_early_exit); } -void LLAppViewer::forceExit(S32 arg) +// case where we need the viewer to exit without any need for notifications +void LLAppViewer::earlyExitNoNotify() { - removeMarkerFile(); - - // *FIX:Mani - This kind of exit hardly seems appropriate. - exit(arg); + llwarns << "app_early_exit with no notification: " << llendl; + gDoDisconnect = TRUE; + finish_early_exit( LLSD(), LLSD() ); } void LLAppViewer::abortQuit() @@ -3051,7 +3184,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; @@ -3270,7 +3403,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; @@ -3607,6 +3740,18 @@ void LLAppViewer::idle() } } + // debug setting to quit after N seconds of being AFK - 0 to never do this + F32 qas_afk = gSavedSettings.getF32("QuitAfterSecondsOfAFK"); + if (qas_afk > 0.f) + { + // idle time is more than setting + if ( gAwayTriggerTimer.getElapsedTimeF32() > qas_afk ) + { + // go ahead and just quit gracefully + LLAppViewer::instance()->requestQuit(); + } + } + // Must wait until both have avatar object and mute list, so poll // here. request_initial_instant_messages(); @@ -3632,7 +3777,7 @@ void LLAppViewer::idle() if (!gDisconnected) { - LLFastTimer t(FTM_AGENT_NETWORK); + LLFastTimer t(FTM_NETWORK); // Update spaceserver timeinfo LLWorld::getInstance()->setSpaceTimeUSec(LLWorld::getInstance()->getSpaceTimeUSec() + (U32)(dt_raw * SEC_TO_MICROSEC)); @@ -3830,7 +3975,7 @@ void LLAppViewer::idle() // { - LLFastTimer t(FTM_VLMANAGER); + LLFastTimer t(FTM_NETWORK); gVLManager.unpackData(); } @@ -4043,7 +4188,10 @@ void LLAppViewer::sendLogoutRequest() gLogoutMaxTime = LOGOUT_REQUEST_TIME; mLogoutRequestSent = TRUE; - LLVoiceClient::getInstance()->leaveChannel(); + if(LLVoiceClient::instanceExists()) + { + LLVoiceClient::getInstance()->leaveChannel(); + } //Set internal status variables and marker files gLogoutInProgress = TRUE; @@ -4183,10 +4331,7 @@ void LLAppViewer::idleNetwork() } // Handle per-frame message system processing. - { - LLFastTimer ftm(FTM_MESSAGE_ACKS); - gMessageSystem->processAcks(); - } + gMessageSystem->processAcks(); #ifdef TIME_THROTTLE_MESSAGES if (total_time >= CheckMessagesMaxTime) @@ -4223,39 +4368,24 @@ void LLAppViewer::idleNetwork() LLViewerStats::getInstance()->mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects); // Retransmit unacknowledged packets. - { - LLFastTimer ftm(FTM_RETRANSMIT); - gXferManager->retransmitUnackedPackets(); - } - - { - LLFastTimer ftm(FTM_TIMEOUT_CHECK); - gAssetStorage->checkForTimeouts(); - } - - - { - LLFastTimer ftm(FTM_DYNAMIC_THROTTLE); - gViewerThrottle.updateDynamicThrottle(); - } + gXferManager->retransmitUnackedPackets(); + gAssetStorage->checkForTimeouts(); + gViewerThrottle.updateDynamicThrottle(); // Check that the circuit between the viewer and the agent's current // region is still alive + LLViewerRegion *agent_region = gAgent.getRegion(); + if (agent_region && (LLStartUp::getStartupState()==STATE_STARTED)) { - LLFastTimer ftm(FTM_CHECK_REGION_CIRCUIT); - LLViewerRegion *agent_region = gAgent.getRegion(); - if (agent_region && (LLStartUp::getStartupState()==STATE_STARTED)) + LLUUID this_region_id = agent_region->getRegionID(); + bool this_region_alive = agent_region->isAlive(); + if ((mAgentRegionLastAlive && !this_region_alive) // newly dead + && (mAgentRegionLastID == this_region_id)) // same region { - LLUUID this_region_id = agent_region->getRegionID(); - bool this_region_alive = agent_region->isAlive(); - if ((mAgentRegionLastAlive && !this_region_alive) // newly dead - && (mAgentRegionLastID == this_region_id)) // same region - { - forceDisconnect(LLTrans::getString("AgentLostConnection")); - } - mAgentRegionLastID = this_region_id; - mAgentRegionLastAlive = this_region_alive; + forceDisconnect(LLTrans::getString("AgentLostConnection")); } + mAgentRegionLastID = this_region_id; + mAgentRegionLastAlive = this_region_alive; } } @@ -4313,7 +4443,10 @@ void LLAppViewer::disconnectViewer() // This is where we used to call gObjectList.destroy() and then delete gWorldp. // Now we just ask the LLWorld singleton to cleanly shut down. - LLWorld::getInstance()->destroyClass(); + if(LLWorld::instanceExists()) + { + LLWorld::getInstance()->destroyClass(); + } // call all self-registered classes LLDestroyClassList::instance().fireCallbacks(); @@ -4427,7 +4560,7 @@ void LLAppViewer::handleLoginComplete() initMainloopTimeout("Mainloop Init"); // Store some data to DebugInfo in case of a freeze. - gDebugInfo["ClientInfo"]["Name"] = gSavedSettings.getString("VersionChannelName"); + gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel(); gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor(); gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); @@ -4533,7 +4666,7 @@ void LLAppViewer::launchUpdater() // *TODO change userserver to be grid on both viewer and sim, since // userserver no longer exists. query_map["userserver"] = LLGridManager::getInstance()->getGridLabel(); - query_map["channel"] = gSavedSettings.getString("VersionChannelName"); + query_map["channel"] = LLVersionInfo::getChannel(); // *TODO constantize this guy // *NOTE: This URL is also used in win_setup/lldownloader.cpp LLURI update_url = LLURI::buildHTTP("secondlife.com", 80, "update.php", query_map); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index a40cd83182..7c946b04a5 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -39,7 +39,7 @@ class LLTextureCache; class LLImageDecodeThread; class LLTextureFetch; class LLWatchdogTimeout; -class LLCommandLineParser; +class LLUpdaterService; struct apr_dso_handle_t; @@ -65,12 +65,14 @@ public: virtual bool mainLoop(); // Override for the application main loop. Needs to at least gracefully notice the QUITTING state and exit. // Application control + void flushVFSIO(); // waits for vfs transfers to complete void forceQuit(); // Puts the viewer into 'shutting down without error' mode. + void fastQuit(S32 error_code = 0); // Shuts down the viewer immediately after sending a logout message void requestQuit(); // Request a quit. A kinder, gentler quit. void userQuit(); // The users asks to quit. Confirm, then requestQuit() void earlyExit(const std::string& name, const LLSD& substitutions = LLSD()); // Display an error dialog and forcibly quit. - void forceExit(S32 arg); // exit() immediately (after some cleanup). + void earlyExitNoNotify(); // Do not display error dialog then forcibly quit. void abortQuit(); // Called to abort a quit request. bool quitRequested() { return mQuitRequested; } @@ -186,7 +188,7 @@ private: bool initThreads(); // Initialize viewer threads, return false on failure. bool initConfiguration(); // Initialize settings from the command line/config file. - + void initUpdater(); // Initialize the updater service. bool initCache(); // Initialize local client cache. @@ -251,7 +253,9 @@ private: LLWatchdogTimeout* mMainloopTimeout; + // For performance and metric gathering LLThread* mFastTimerLogThread; + // for tracking viewer<->region circuit death bool mAgentRegionLastAlive; LLUUID mAgentRegionLastID; @@ -262,7 +266,14 @@ private: U32 mAvailPhysicalMemInKB ; U32 mAvailVirtualMemInKB ; + + boost::scoped_ptr<LLUpdaterService> mUpdater; + + //--------------------------------------------- + //*NOTE: Mani - legacy updater stuff + // Still useable? public: + //some information for updater typedef struct { @@ -272,6 +283,7 @@ public: static LLUpdaterInfo *sUpdaterInfo ; void launchUpdater(); + //--------------------------------------------- }; // consts from viewer.h 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/llbottomtray.cpp b/indra/newview/llbottomtray.cpp index 29c2b7565e..35e4548483 100644 --- a/indra/newview/llbottomtray.cpp +++ b/indra/newview/llbottomtray.cpp @@ -65,31 +65,42 @@ LLDefaultChildRegistry::Register<LLBottomtrayButton> bottomtray_button("bottomtr // virtual BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask) { + if (mCanDrag) + { S32 screenX, screenY; localPointToScreen(x, y, &screenX, &screenY); // pass hover to bottomtray LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY); - return FALSE; + return TRUE; + } + else + { + return LLButton::handleHover(x, y, mask); + } } //virtual BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask) { + if (mCanDrag) + { S32 screenX, screenY; localPointToScreen(x, y, &screenX, &screenY); // pass mouse up to bottomtray LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY); - LLButton::handleMouseUp(x, y, mask); - return FALSE; + } + return LLButton::handleMouseUp(x, y, mask); } //virtual BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask) { + if (mCanDrag) + { S32 screenX, screenY; localPointToScreen(x, y, &screenX, &screenY); // pass mouse up to bottomtray LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY); - LLButton::handleMouseDown(x, y, mask); - return FALSE; + } + return LLButton::handleMouseDown(x, y, mask); } static void update_build_button_enable_state() @@ -150,8 +161,6 @@ public: { mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL); buildFromFile("panel_bottomtray_lite.xml"); - // Necessary for focus movement among child controls - setFocusRoot(TRUE); } BOOL postBuild() @@ -218,9 +227,6 @@ LLBottomTray::LLBottomTray(const LLSD&) //destroyed LLBottomTray requires some subsystems that are long gone //LLUI::getRootView()->addChild(this); - // Necessary for focus movement among child controls - setFocusRoot(TRUE); - { mBottomTrayLite = new LLBottomTrayLite(); mBottomTrayLite->setFollowsAll(); @@ -513,6 +519,9 @@ void LLBottomTray::toggleCameraControls() BOOL LLBottomTray::postBuild() { + LLHints::registerHintTarget("bottom_tray", LLView::getHandle()); + LLHints::registerHintTarget("dest_guide_btn", getChild<LLUICtrl>("destination_btn")->getHandle()); + LLHints::registerHintTarget("avatar_picker_btn", getChild<LLUICtrl>("avatar_btn")->getHandle()); LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("NearbyChatBar.Action", boost::bind(&LLBottomTray::onContextMenuItemClicked, this, _2)); LLUICtrl::EnableCallbackRegistry::currentRegistrar().add("NearbyChatBar.EnableMenuItem", boost::bind(&LLBottomTray::onContextMenuItemEnabled, this, _2)); @@ -1365,20 +1374,33 @@ void LLBottomTray::processExtendButtons(S32& available_width) processExtendButton(*it, available_width); } + const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth(); + static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth(); + const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width; + // then try to extend Speak button - if (available_width > 0) + if (available_width > 0 || available_width_chiclet > 0) { S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK]; S32 panel_width = mSpeakPanel->getRect().getWidth(); S32 possible_extend_width = panel_max_width - panel_width; - if (possible_extend_width >= 0 && possible_extend_width <= available_width) // HACK: this button doesn't change size so possible_extend_width will be 0 + + if (possible_extend_width >= 0 && possible_extend_width <= available_width + available_width_chiclet) // HACK: this button doesn't change size so possible_extend_width will be 0 { mSpeakBtn->setLabelVisible(true); mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight()); log(mSpeakBtn, "speak button is extended"); - available_width -= possible_extend_width; - + if( available_width > possible_extend_width) + { + available_width -= possible_extend_width; + } + else + { + S32 required_width = possible_extend_width - available_width; + available_width = 0; + mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_width, mChicletPanel->getParent()->getRect().getHeight()); + } lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName() << ", extended width: " << possible_extend_width << ", rest width to process: " << available_width diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h index 8d8a42c553..dc98170049 100644 --- a/indra/newview/llbottomtray.h +++ b/indra/newview/llbottomtray.h @@ -54,7 +54,9 @@ class LLBottomtrayButton : public LLButton public: struct Params : public LLInitParam::Block<Params, LLButton::Params> { - Params(){} + Optional<bool> can_drag; + Params() + : can_drag("can_drag", true){} }; /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask); /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask); @@ -62,11 +64,14 @@ public: protected: LLBottomtrayButton(const Params& p) - : LLButton(p) + : LLButton(p), + mCanDrag(p.can_drag) { } friend class LLUICtrlFactory; + + bool mCanDrag; }; class LLBottomTray diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp index b2e9564f7d..328c326278 100644 --- a/indra/newview/llcallfloater.cpp +++ b/indra/newview/llcallfloater.cpp @@ -167,6 +167,7 @@ BOOL LLCallFloater::postBuild() //chrome="true" hides floater caption if (mDragHandle) mDragHandle->setTitleVisible(TRUE); + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) updateSession(); @@ -206,6 +207,17 @@ void LLCallFloater::draw() } // virtual +void LLCallFloater::setFocus( BOOL b ) +{ + LLTransientDockableFloater::setFocus(b); + + // Force using active floater transparency (STORM-730). + // We have to override setFocus() for LLCallFloater because selecting an item + // of the voice morphing combobox causes the floater to lose focus and thus become transparent. + updateTransparency(TT_ACTIVE); +} + +// virtual void LLCallFloater::onParticipantsChanged() { if (NULL == mParticipants) return; diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h index 3bc7043353..00a3f76e56 100644 --- a/indra/newview/llcallfloater.h +++ b/indra/newview/llcallfloater.h @@ -64,6 +64,7 @@ public: /*virtual*/ BOOL postBuild(); /*virtual*/ void onOpen(const LLSD& key); /*virtual*/ void draw(); + /*virtual*/ void setFocus( BOOL b ); /** * Is called by LLVoiceClient::notifyParticipantObservers when voice participant list is changed. diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index 3dc6e786d3..6e778de2d8 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -335,7 +335,7 @@ public: LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); - if(mSourceType != CHAT_SOURCE_AGENT) + if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull()) icon->setDrawTooltip(false); switch (mSourceType) @@ -789,9 +789,12 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL // set the link for the object name to be the objectim SLapp // (don't let object names with hyperlinks override our objectim Url) LLStyle::Params link_params(style_params); - link_params.color.control = "HTMLLinkColor"; + LLColor4 link_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); + link_params.color = link_color; + link_params.readonly_color = link_color; link_params.is_link = true; link_params.link_href = url; + mEditor->appendText(chat.mFromName + delimiter, false, link_params); } @@ -799,9 +802,9 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL { LLStyle::Params link_params(style_params); link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID)); + // Add link to avatar's inspector and delimiter to message. - mEditor->appendText(link_params.link_href, false, style_params); - mEditor->appendText(delimiter, false, style_params); + mEditor->appendText(std::string(link_params.link_href) + delimiter, false, link_params); } else { diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index d353c809ca..899e0431e7 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -213,7 +213,6 @@ void LLNearbyChatToastPanel::init(LLSD& notification) { LLStyle::Params style_params_name; - LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor"); std::string href; if (mSourceType == CHAT_SOURCE_AGENT) @@ -225,7 +224,8 @@ void LLNearbyChatToastPanel::init(LLSD& notification) href = LLSLURL("object", mFromID, "inspect").getSLURLString(); } - style_params_name.color(userNameColor); + LLColor4 user_name_color = LLUIColorTable::instance().getColor("HTMLLinkColor"); + style_params_name.color(user_name_color); std::string font_name = LLFontGL::nameFromFont(messageFont); std::string font_style_size = LLFontGL::sizeFromFont(messageFont); diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp index 8f385160e9..885d553524 100644 --- a/indra/newview/llchiclet.cpp +++ b/indra/newview/llchiclet.cpp @@ -1092,9 +1092,11 @@ LLChicletPanel::LLChicletPanel(const Params&p) LLChicletPanel::~LLChicletPanel() { - LLTransientFloaterMgr::getInstance()->removeControlView(mLeftScrollButton); - LLTransientFloaterMgr::getInstance()->removeControlView(mRightScrollButton); - + if(LLTransientFloaterMgr::instanceExists()) + { + LLTransientFloaterMgr::getInstance()->removeControlView(mLeftScrollButton); + LLTransientFloaterMgr::getInstance()->removeControlView(mRightScrollButton); + } } void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){ diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp index c9a526a3be..4a1ba6f1b5 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); @@ -191,10 +195,12 @@ BOOL LLColorSwatchCtrl::handleMouseUp(S32 x, S32 y, MASK mask) // assumes GL state is set for 2D void LLColorSwatchCtrl::draw() { - F32 alpha = getDrawContext().mAlpha; + // If we're in a focused floater, don't apply the floater's alpha to the color swatch (STORM-676). + F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); + 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; @@ -203,19 +209,29 @@ void LLColorSwatchCtrl::draw() // Check state if ( mValid ) { + if (!mColor.isOpaque()) + { + // Draw checker board. + gl_rect_2d_checkerboard(interior, alpha); + } + // Draw the color swatch - gl_rect_2d_checkerboard( interior ); - gl_rect_2d(interior, mColor, TRUE); - LLColor4 opaque_color = mColor; - opaque_color.mV[VALPHA] = 1.f; - gGL.color4fv(opaque_color.mV); - if (mAlphaGradientImage.notNull()) + gl_rect_2d(interior, mColor % alpha, TRUE); + + if (!mColor.isOpaque()) { - gGL.pushMatrix(); + // Draw semi-transparent center area in filled with mColor. + LLColor4 opaque_color = mColor; + opaque_color.mV[VALPHA] = alpha; + gGL.color4fv(opaque_color.mV); + if (mAlphaGradientImage.notNull()) { - mAlphaGradientImage->draw(interior, mColor); + gGL.pushMatrix(); + { + mAlphaGradientImage->draw(interior, mColor % alpha); + } + gGL.popMatrix(); } - gGL.popMatrix(); } } else 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 fb3db94c25..65c61c4a8b 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -53,7 +53,7 @@ namespace po = boost::program_options; -// *NTOE:MEP - Currently the boost object reside in file scope. +// *NOTE:MEP - Currently the boost object reside in file scope. // This has a couple of negatives, they are always around and // there can be only one instance of each. // The plus is that the boost-ly-ness of this implementation is @@ -156,6 +156,12 @@ public: return mIsComposing; } + // Needed for boost 1.42 + virtual bool is_required() const + { + return false; // All our command line options are optional. + } + virtual bool apply_default(boost::any& value_store) const { return false; // No defaults. @@ -169,7 +175,6 @@ public: { mNotifyCallback(*value); } - } protected: @@ -340,7 +345,10 @@ bool LLCommandLineParser::parseCommandLine(int argc, char **argv) bool LLCommandLineParser::parseCommandLineString(const std::string& str) { // Split the string content into tokens - boost::escaped_list_separator<char> sep("\\", "\r\n ", "\"'"); + const char* escape_chars = "\\"; + const char* separator_chars = "\r\n "; + const char* quote_chars = "\"'"; + boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars); boost::tokenizer< boost::escaped_list_separator<char> > tok(str, sep); std::vector<std::string> tokens; // std::copy(tok.begin(), tok.end(), std::back_inserter(tokens)); diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp index 2b92b228b3..b4a1457f47 100644 --- a/indra/newview/llcurrencyuimanager.cpp +++ b/indra/newview/llcurrencyuimanager.cpp @@ -166,7 +166,7 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo() gAgent.getSecureSessionID().asString()); keywordArgs.appendString("language", LLUI::getLanguage()); keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy); - keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName")); + keywordArgs.appendString("viewerChannel", LLVersionInfo::getChannel()); keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::getMajor()); keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::getMinor()); keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::getPatch()); @@ -241,7 +241,7 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password) { keywordArgs.appendString("password", password); } - keywordArgs.appendString("viewerChannel", gSavedSettings.getString("VersionChannelName")); + keywordArgs.appendString("viewerChannel", LLVersionInfo::getChannel()); keywordArgs.appendInt("viewerMajorVersion", LLVersionInfo::getMajor()); keywordArgs.appendInt("viewerMinorVersion", LLVersionInfo::getMinor()); keywordArgs.appendInt("viewerPatchVersion", LLVersionInfo::getPatch()); diff --git a/indra/newview/lldirpicker.cpp b/indra/newview/lldirpicker.cpp index 53101f0ce2..dd243397a1 100644 --- a/indra/newview/lldirpicker.cpp +++ b/indra/newview/lldirpicker.cpp @@ -35,6 +35,7 @@ #include "llframetimer.h" #include "lltrans.h" #include "llwindow.h" // beforeDialog() +#include "llviewercontrol.h" #if LL_LINUX || LL_SOLARIS # include "llfilepicker.h" @@ -53,6 +54,23 @@ LLDirPicker LLDirPicker::sInstance; // // Implementation // + +// utility function to check if access to local file system via file browser +// is enabled and if not, tidy up and indicate we're not allowed to do this. +bool LLDirPicker::check_local_file_access_enabled() +{ + // if local file browsing is turned off, return without opening dialog + bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled"); + if ( ! local_file_system_browsing_enabled ) + { + mDir.clear(); // Windows + mFileName = NULL; // Mac/Linux + return false; + } + + return true; +} + #if LL_WINDOWS LLDirPicker::LLDirPicker() : @@ -72,6 +90,13 @@ BOOL LLDirPicker::getDir(std::string* filename) { return FALSE; } + + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + BOOL success = FALSE; // Modal, so pause agent @@ -231,7 +256,13 @@ BOOL LLDirPicker::getDir(std::string* filename) if( mLocked ) return FALSE; BOOL success = FALSE; OSStatus error = noErr; - + + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + mFileName = filename; // mNavOptions.saveFileName @@ -289,6 +320,13 @@ void LLDirPicker::reset() BOOL LLDirPicker::getDir(std::string* filename) { reset(); + + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + if (mFilePicker) { GtkWindow* picker = mFilePicker->buildFilePicker(false, true, diff --git a/indra/newview/lldirpicker.h b/indra/newview/lldirpicker.h index a360293fff..2188b7edd0 100644 --- a/indra/newview/lldirpicker.h +++ b/indra/newview/lldirpicker.h @@ -75,6 +75,7 @@ private: }; void buildDirname( void ); + bool check_local_file_access_enabled(); #if LL_DARWIN NavDialogCreationOptions mNavOptions; diff --git a/indra/newview/lldrawpool.h b/indra/newview/lldrawpool.h index 5bfaa260cc..9d944ee213 100644 --- a/indra/newview/lldrawpool.h +++ b/indra/newview/lldrawpool.h @@ -168,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/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp index a2428d2de0..2519d0297c 100644 --- a/indra/newview/lldrawpoolalpha.cpp +++ b/indra/newview/lldrawpoolalpha.cpp @@ -103,16 +103,29 @@ void LLDrawPoolAlpha::renderDeferred(S32 pass) S32 LLDrawPoolAlpha::getNumPostDeferredPasses() { - return 1; + return 2; } void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) { LLFastTimer t(FTM_RENDER_ALPHA); - simple_shader = &gDeferredAlphaProgram; - fullbright_shader = &gDeferredFullbrightProgram; - + if (pass == 0) + { + simple_shader = &gDeferredAlphaProgram; + fullbright_shader = &gDeferredFullbrightProgram; + } + else + { + //update depth buffer sampler + gPipeline.mScreen.flush(); + gPipeline.mDeferredDepth.copyContents(gPipeline.mDeferredScreen, 0, 0, gPipeline.mDeferredScreen.getWidth(), gPipeline.mDeferredScreen.getHeight(), + 0, 0, gPipeline.mDeferredDepth.getWidth(), gPipeline.mDeferredDepth.getHeight(), GL_DEPTH_BUFFER_BIT, GL_NEAREST); + gPipeline.mDeferredDepth.bindTarget(); + simple_shader = NULL; + fullbright_shader = NULL; + } + deferred_render = TRUE; if (mVertexShaderLevel > 0) { @@ -124,6 +137,8 @@ void LLDrawPoolAlpha::beginPostDeferredPass(S32 pass) void LLDrawPoolAlpha::endPostDeferredPass(S32 pass) { + gPipeline.mDeferredDepth.flush(); + gPipeline.mScreen.bindTarget(); deferred_render = FALSE; endRenderPass(pass); } @@ -174,7 +189,14 @@ void LLDrawPoolAlpha::render(S32 pass) LLGLSPipelineAlpha gls_pipeline_alpha; - gGL.setColorMask(true, true); + if (deferred_render && pass == 1) + { //depth only + gGL.setColorMask(false, false); + } + else + { + gGL.setColorMask(true, true); + } if (LLPipeline::sAutoMaskAlphaNonDeferred && !deferred_render) { @@ -206,7 +228,13 @@ void LLDrawPoolAlpha::render(S32 pass) gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); } - LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy ? GL_TRUE : GL_FALSE); + LLGLDepthTest depth(GL_TRUE, LLDrawPoolWater::sSkipScreenCopy || + (deferred_render && pass == 1) ? GL_TRUE : GL_FALSE); + + if (deferred_render && pass == 1) + { + gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f); + } mColorSFactor = LLRender::BF_SOURCE_ALPHA; // } regular alpha blend mColorDFactor = LLRender::BF_ONE_MINUS_SOURCE_ALPHA; // } @@ -218,6 +246,11 @@ void LLDrawPoolAlpha::render(S32 pass) gGL.setColorMask(true, false); + if (deferred_render && pass == 1) + { + gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); + } + if (deferred_render && current_shader != NULL) { gPipeline.unbindDeferredShader(*current_shader); diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 66df755236..df5b341fdf 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1589,77 +1589,6 @@ void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar) } -//----------------------------------------------------------------------------- -// 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 7c8242c962..fcd8294af5 100644 --- a/indra/newview/lldrawpoolavatar.h +++ b/indra/newview/lldrawpoolavatar.h @@ -70,7 +70,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 b4dc0c26a6..ce07e62122 100644 --- a/indra/newview/lldrawpoolground.cpp +++ b/indra/newview/lldrawpoolground.cpp @@ -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 9eb45a952c..6b45c5abb0 100644 --- a/indra/newview/lldrawpoolsky.cpp +++ b/indra/newview/lldrawpoolsky.cpp @@ -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 6126908231..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; @@ -591,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/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 b0e70b9402..15f59e84a6 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -435,84 +435,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 eea481fdca..cc04bf2f1c 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -186,7 +186,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 4bcbe665aa..2bafb9a4a7 100755 --- a/indra/newview/llfasttimerview.cpp +++ b/indra/newview/llfasttimerview.cpp @@ -1448,14 +1448,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(); @@ -1543,15 +1551,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) ] ; } } } @@ -1561,20 +1569,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(); @@ -1582,10 +1613,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 b1615f8a5e..c409445d86 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: diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 3981b887ad..0c0fdd5572 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -368,14 +368,15 @@ LLFavoritesBarCtrl::Params::Params() LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p) : LLUICtrl(p), mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()), - mPopupMenuHandle(), - mInventoryItemsPopupMenuHandle(), + mOverflowMenuHandle(), + mContextMenuHandle(), mImageDragIndication(p.image_drag_indication), mShowDragMarker(FALSE), mLandingTab(NULL), mLastTab(NULL), mTabsHighlightEnabled(TRUE) , mUpdateDropDownItems(true) +, mRestoreOverflowMenu(false) { // Register callback for menus with current registrar (will be parent panel's registrar) LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected", @@ -402,8 +403,8 @@ LLFavoritesBarCtrl::~LLFavoritesBarCtrl() { gInventory.removeObserver(this); - LLView::deleteViewByHandle(mPopupMenuHandle); - LLView::deleteViewByHandle(mInventoryItemsPopupMenuHandle); + LLView::deleteViewByHandle(mOverflowMenuHandle); + LLView::deleteViewByHandle(mContextMenuHandle); } BOOL LLFavoritesBarCtrl::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, @@ -414,6 +415,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) { @@ -517,7 +521,7 @@ void LLFavoritesBarCtrl::handleExistingFavoriteDragAndDrop(S32 x, S32 y) gInventory.saveItemsOrder(mItems); - LLToggleableMenu* menu = (LLToggleableMenu*) mPopupMenuHandle.get(); + LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); if (menu && menu->getVisible()) { @@ -773,7 +777,7 @@ void LLFavoritesBarCtrl::updateButtons() mChevronButton->setVisible(TRUE); } // Update overflow menu - LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get()); + LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mOverflowMenuHandle.get()); if (overflow_menu && overflow_menu->getVisible()) { overflow_menu->setVisible(FALSE); @@ -847,7 +851,7 @@ BOOL LLFavoritesBarCtrl::postBuild() menu = LLUICtrlFactory::getDefaultWidget<LLMenuGL>("inventory_menu"); } menu->setBackgroundColor(LLUIColorTable::instance().getColor("MenuPopupBgColor")); - mInventoryItemsPopupMenuHandle = menu->getHandle(); + mContextMenuHandle = menu->getHandle(); return TRUE; } @@ -878,7 +882,7 @@ BOOL LLFavoritesBarCtrl::collectFavoriteItems(LLInventoryModel::item_array_t &it void LLFavoritesBarCtrl::showDropDownMenu() { - if (mPopupMenuHandle.isDead()) + if (mOverflowMenuHandle.isDead()) { LLToggleableMenu::Params menu_p; menu_p.name("favorites menu"); @@ -889,10 +893,10 @@ void LLFavoritesBarCtrl::showDropDownMenu() menu_p.preferred_width = DROP_DOWN_MENU_WIDTH; LLToggleableMenu* menu = LLUICtrlFactory::create<LLFavoriteLandmarkToggleableMenu>(menu_p); - mPopupMenuHandle = menu->getHandle(); + mOverflowMenuHandle = menu->getHandle(); } - LLToggleableMenu* menu = (LLToggleableMenu*)mPopupMenuHandle.get(); + LLToggleableMenu* menu = (LLToggleableMenu*)mOverflowMenuHandle.get(); if (menu) { @@ -970,11 +974,19 @@ void LLFavoritesBarCtrl::onButtonRightClick( LLUUID item_id,LLView* fav_button,S { mSelectedItemID = item_id; - LLMenuGL* menu = (LLMenuGL*)mInventoryItemsPopupMenuHandle.get(); + LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get(); if (!menu) { return; } + + // Remember that the context menu was shown simultaneously with the overflow menu, + // so that we can restore the overflow menu when user clicks a context menu item + // (which hides the overflow menu). + { + LLView* overflow_menu = mOverflowMenuHandle.get(); + mRestoreOverflowMenu = overflow_menu && overflow_menu->getVisible(); + } // Release mouse capture so hover events go to the popup menu // because this is happening during a mouse down. @@ -1079,8 +1091,8 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) // 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()) + LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); + if (mRestoreOverflowMenu && menu && !menu->getVisible()) { showDropDownMenu(); } @@ -1146,11 +1158,11 @@ void LLFavoritesBarCtrl::pastFromClipboard() const void LLFavoritesBarCtrl::onButtonMouseDown(LLUUID id, LLUICtrl* ctrl, S32 x, S32 y, MASK mask) { // EXT-6997 (Fav bar: Pop-up menu for LM in overflow dropdown is kept after LM was dragged away) - // mInventoryItemsPopupMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu. + // mContextMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu. // We have to check and set visibility of pop-up menu in such a way instead of using // LLMenuHolderGL::hideMenus() because it will close both menus(dropdown and pop-up), but // we need to close only pop-up menu while dropdown one should be still opened. - LLMenuGL* menu = (LLMenuGL*)mInventoryItemsPopupMenuHandle.get(); + LLMenuGL* menu = (LLMenuGL*)mContextMenuHandle.get(); if(menu && menu->getVisible()) { menu->setVisible(FALSE); diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 37645523f6..1a28731c4f 100644 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -91,13 +91,14 @@ protected: void showDropDownMenu(); - LLHandle<LLView> mPopupMenuHandle; - LLHandle<LLView> mInventoryItemsPopupMenuHandle; + LLHandle<LLView> mOverflowMenuHandle; + LLHandle<LLView> mContextMenuHandle; LLUUID mFavoriteFolderId; const LLFontGL *mFont; S32 mFirstDropDownItem; bool mUpdateDropDownItems; + bool mRestoreOverflowMenu; LLUUID mSelectedItemID; diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index b3e3dc93f1..f209950cfa 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -33,6 +33,7 @@ #include "lldir.h" #include "llframetimer.h" #include "lltrans.h" +#include "llviewercontrol.h" #include "llwindow.h" // beforeDialog() #if LL_SDL @@ -106,6 +107,20 @@ LLFilePicker::~LLFilePicker() // nothing } +// utility function to check if access to local file system via file browser +// is enabled and if not, tidy up and indicate we're not allowed to do this. +bool LLFilePicker::check_local_file_access_enabled() +{ + // if local file browsing is turned off, return without opening dialog + bool local_file_system_browsing_enabled = gSavedSettings.getBOOL("LocalFileSystemBrowsingEnabled"); + if ( ! local_file_system_browsing_enabled ) + { + mFiles.clear(); + return false; + } + + return true; +} const std::string LLFilePicker::getFirstFile() { @@ -213,6 +228,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking) } BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + // don't provide default file selection mFilesW[0] = '\0'; @@ -258,6 +279,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter) } BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + // don't provide default file selection mFilesW[0] = '\0'; @@ -321,6 +348,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) } BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + mOFN.lpstrFile = mFilesW; if (!filename.empty()) { @@ -607,6 +640,12 @@ OSStatus LLFilePicker::doNavChooseDialog(ELoadFilter filter) NavDialogRef navRef = NULL; NavReplyRecord navReply; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + memset(&navReply, 0, sizeof(navReply)); // NOTE: we are passing the address of a local variable here. @@ -835,6 +874,12 @@ BOOL LLFilePicker::getOpenFile(ELoadFilter filter, bool blocking) BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + OSStatus error = noErr; reset(); @@ -880,6 +925,12 @@ BOOL LLFilePicker::getMultipleOpenFiles(ELoadFilter filter) BOOL success = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + OSStatus error = noErr; reset(); @@ -911,6 +962,12 @@ BOOL LLFilePicker::getSaveFile(ESaveFilter filter, const std::string& filename) BOOL success = FALSE; OSStatus error = noErr; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); mNavOptions.optionFlags &= ~kNavAllowMultipleFiles; @@ -1141,6 +1198,12 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename { BOOL rtn = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + gViewerWindow->mWindow->beforeDialog(); reset(); @@ -1230,6 +1293,12 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter, bool blocking ) { BOOL rtn = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + gViewerWindow->mWindow->beforeDialog(); reset(); @@ -1277,6 +1346,12 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) { BOOL rtn = FALSE; + // if local file browsing is turned off, return without opening dialog + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + gViewerWindow->mWindow->beforeDialog(); reset(); @@ -1307,6 +1382,13 @@ BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename ) { + // if local file browsing is turned off, return without opening dialog + // (Even though this is a stub, I think we still should not return anything at all) + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); llinfos << "getSaveFile suggested filename is [" << filename @@ -1321,6 +1403,13 @@ BOOL LLFilePicker::getSaveFile( ESaveFilter filter, const std::string& filename BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) { + // if local file browsing is turned off, return without opening dialog + // (Even though this is a stub, I think we still should not return anything at all) + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); // HACK: Static filenames for 'open' until we implement filepicker @@ -1339,6 +1428,13 @@ BOOL LLFilePicker::getOpenFile( ELoadFilter filter ) BOOL LLFilePicker::getMultipleOpenFiles( ELoadFilter filter ) { + // if local file browsing is turned off, return without opening dialog + // (Even though this is a stub, I think we still should not return anything at all) + if ( check_local_file_access_enabled() == false ) + { + return FALSE; + } + reset(); return FALSE; } diff --git a/indra/newview/llfilepicker.h b/indra/newview/llfilepicker.h index a39f9b96e6..cd843a8f33 100644 --- a/indra/newview/llfilepicker.h +++ b/indra/newview/llfilepicker.h @@ -142,6 +142,10 @@ private: //FILENAME_BUFFER_SIZE = 65536 FILENAME_BUFFER_SIZE = 65000 }; + + // utility function to check if access to local file system via file browser + // is enabled and if not, tidy up and indicate we're not allowed to do this. + bool check_local_file_access_enabled(); #if LL_WINDOWS OPENFILENAMEW mOFN; // for open and save dialogs diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp index b08c113923..4c17199895 100644 --- a/indra/newview/llfirstuse.cpp +++ b/indra/newview/llfirstuse.cpp @@ -100,9 +100,16 @@ void LLFirstUse::useSandbox() void LLFirstUse::notUsingDestinationGuide(bool enable) { // not doing this yet - //firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "left")); + firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top")); } +void LLFirstUse::notUsingAvatarPicker(bool enable) +{ + // not doing this yet + firstUseNotification("FirstNotUseAvatarPicker", enable, "HintAvatarPicker", LLSD(), LLSD().with("target", "avatar_picker_btn").with("direction", "top")); +} + + // static void LLFirstUse::notUsingSidePanel(bool enable) { @@ -113,7 +120,15 @@ void LLFirstUse::notUsingSidePanel(bool enable) // static void LLFirstUse::notMoving(bool enable) { + // fire off 2 notifications and rely on filtering to select the relevant one firstUseNotification("FirstNotMoving", enable, "HintMove", LLSD(), LLSD().with("target", "move_btn").with("direction", "top")); + firstUseNotification("FirstNotMoving", enable, "HintMoveArrows", LLSD(), LLSD().with("target", "bottom_tray").with("direction", "top").with("hint_image", "arrow_keys.png").with("down_arrow", "")); +} + +// static +void LLFirstUse::viewPopup(bool enable) +{ + firstUseNotification("FirstViewPopup", enable, "HintView", LLSD(), LLSD().with("target", "view_popup").with("direction", "right")); } // static diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h index 3b7ff6383b..81659988e6 100644 --- a/indra/newview/llfirstuse.h +++ b/indra/newview/llfirstuse.h @@ -87,8 +87,10 @@ public: static void otherAvatarChatFirst(bool enable = true); static void sit(bool enable = true); static void notUsingDestinationGuide(bool enable = true); + static void notUsingAvatarPicker(bool enable = true); static void notUsingSidePanel(bool enable = true); static void notMoving(bool enable = true); + static void viewPopup(bool enable = true); static void newInventory(bool enable = true); static void receiveLindens(bool enable = true); static void setDisplayName(bool enable = true); diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 135137069c..8ae3ccbae3 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -213,7 +213,7 @@ LLSD LLFloaterAbout::getInfo() info["VIEWER_VERSION_STR"] = LLVersionInfo::getVersion(); info["BUILD_DATE"] = __DATE__; info["BUILD_TIME"] = __TIME__; - info["CHANNEL"] = gSavedSettings.getString("VersionChannelName"); + info["CHANNEL"] = LLVersionInfo::getChannel(); info["VIEWER_RELEASE_NOTES_URL"] = get_viewer_release_notes_url(); @@ -291,7 +291,7 @@ static std::string get_viewer_release_notes_url() std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL"); if (! LLStringUtil::endsWith(url, "/")) url += "/"; - url += gSavedSettings.getString("VersionChannelName") + "/"; + url += LLVersionInfo::getChannel() + "/"; url += LLVersionInfo::getShortVersion(); return LLWeb::escapeURL(url); } diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index ad24c6534a..1dfa904a19 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -40,6 +40,8 @@ #include "lltoolmgr.h" #include "lltoolfocus.h" #include "llslider.h" +#include "llfirstuse.h" +#include "llhints.h" static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item"); @@ -73,6 +75,8 @@ protected: void onZoomPlusHeldDown(); void onZoomMinusHeldDown(); void onSliderValueChanged(); + void onCameraTrack(); + void onCameraRotate(); F32 getOrbitRate(F32 time); private: @@ -162,6 +166,8 @@ LLPanelCameraZoom::LLPanelCameraZoom() mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this)); mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this)); mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this)); + mCommitCallbackRegistrar.add("Camera.track", boost::bind(&LLPanelCameraZoom::onCameraTrack, this)); + mCommitCallbackRegistrar.add("Camera.rotate", boost::bind(&LLPanelCameraZoom::onCameraRotate, this)); } BOOL LLPanelCameraZoom::postBuild() @@ -198,6 +204,18 @@ void LLPanelCameraZoom::onZoomMinusHeldDown() gAgentCamera.setOrbitOutKey(getOrbitRate(time)); } +void LLPanelCameraZoom::onCameraTrack() +{ + // EXP-202 when camera panning activated, remove the hint + LLFirstUse::viewPopup( false ); +} + +void LLPanelCameraZoom::onCameraRotate() +{ + // EXP-202 when camera rotation activated, remove the hint + LLFirstUse::viewPopup( false ); +} + F32 LLPanelCameraZoom::getOrbitRate(F32 time) { if( time < NUDGE_TIME ) @@ -294,6 +312,8 @@ LLFloaterCamera* LLFloaterCamera::findInstance() void LLFloaterCamera::onOpen(const LLSD& key) { + LLFirstUse::viewPopup(); + LLButton *anchor_panel = LLBottomTray::getInstance()->getChild<LLButton>("camera_btn"); setDockControl(new LLDockControl( @@ -336,6 +356,7 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val) mCurrMode(CAMERA_CTRL_MODE_PAN), mPrevMode(CAMERA_CTRL_MODE_PAN) { + LLHints::registerHintTarget("view_popup", LLView::getHandle()); } // virtual @@ -343,6 +364,7 @@ BOOL LLFloaterCamera::postBuild() { setIsChrome(TRUE); setTitleVisible(TRUE); // restore title visibility after chrome applying + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) mRotate = getChild<LLJoystickCameraRotate>(ORBIT); mZoom = findChild<LLPanelCameraZoom>(ZOOM); diff --git a/indra/newview/llfloatercolorpicker.cpp b/indra/newview/llfloatercolorpicker.cpp index 69f1774ff8..659e52271a 100644 --- a/indra/newview/llfloatercolorpicker.cpp +++ b/indra/newview/llfloatercolorpicker.cpp @@ -472,6 +472,12 @@ void LLFloaterColorPicker::onMouseCaptureLost() setMouseDownInLumRegion(FALSE); } +F32 LLFloaterColorPicker::getSwatchTransparency() +{ + // If the floater is focused, don't apply its alpha to the color swatch (STORM-676). + return getTransparencyType() == TT_ACTIVE ? 1.f : LLFloater::getCurrentTransparency(); +} + ////////////////////////////////////////////////////////////////////////////// // void LLFloaterColorPicker::draw() @@ -533,8 +539,10 @@ void LLFloaterColorPicker::draw() // base floater stuff LLFloater::draw (); + const F32 alpha = getSwatchTransparency(); + // draw image for RGB area (not really RGB but you'll see what I mean... - gl_draw_image ( mRGBViewerImageLeft, mRGBViewerImageTop - mRGBViewerImageHeight, mRGBImage, LLColor4::white ); + gl_draw_image ( mRGBViewerImageLeft, mRGBViewerImageTop - mRGBViewerImageHeight, mRGBImage, LLColor4::white % alpha); // update 'cursor' into RGB Section S32 xPos = ( S32 ) ( ( F32 )mRGBViewerImageWidth * getCurH () ) - 8; @@ -556,7 +564,7 @@ void LLFloaterColorPicker::draw() mRGBViewerImageTop - mRGBViewerImageHeight, mRGBViewerImageLeft + mRGBViewerImageWidth + 1, mRGBViewerImageTop, - LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ), + LLColor4 ( 0.0f, 0.0f, 0.0f, alpha ), FALSE ); // draw luminance slider @@ -569,7 +577,7 @@ void LLFloaterColorPicker::draw() mLumRegionTop - mLumRegionHeight + y, mLumRegionLeft + mLumRegionWidth, mLumRegionTop - mLumRegionHeight + y - 1, - LLColor4 ( rValSlider, gValSlider, bValSlider, 1.0f ) ); + LLColor4 ( rValSlider, gValSlider, bValSlider, alpha ) ); } @@ -594,7 +602,7 @@ void LLFloaterColorPicker::draw() mSwatchRegionTop - mSwatchRegionHeight, mSwatchRegionLeft + mSwatchRegionWidth, mSwatchRegionTop, - LLColor4 ( getCurR (), getCurG (), getCurB (), 1.0f ), + LLColor4 ( getCurR (), getCurG (), getCurB (), alpha ), TRUE ); // draw selected color swatch outline @@ -634,6 +642,7 @@ const LLColor4& LLFloaterColorPicker::getComplimentaryColor ( const LLColor4& ba void LLFloaterColorPicker::drawPalette () { S32 curEntry = 0; + const F32 alpha = getSwatchTransparency(); for ( S32 y = 0; y < numPaletteRows; ++y ) { @@ -648,7 +657,7 @@ void LLFloaterColorPicker::drawPalette () // draw palette entry color if ( mPalette [ curEntry ] ) { - gl_rect_2d ( x1 + 2, y1 - 2, x2 - 2, y2 + 2, *mPalette [ curEntry++ ], TRUE ); + gl_rect_2d ( x1 + 2, y1 - 2, x2 - 2, y2 + 2, *mPalette [ curEntry++ ] % alpha, TRUE ); gl_rect_2d ( x1 + 1, y1 - 1, x2 - 1, y2 + 1, LLColor4 ( 0.0f, 0.0f, 0.0f, 1.0f ), FALSE ); } } diff --git a/indra/newview/llfloatercolorpicker.h b/indra/newview/llfloatercolorpicker.h index 110fa43b9c..8e387c4f7c 100644 --- a/indra/newview/llfloatercolorpicker.h +++ b/indra/newview/llfloatercolorpicker.h @@ -55,6 +55,7 @@ class LLFloaterColorPicker virtual BOOL handleMouseUp ( S32 x, S32 y, MASK mask ); virtual BOOL handleHover ( S32 x, S32 y, MASK mask ); virtual void onMouseCaptureLost(); + virtual F32 getSwatchTransparency(); // implicit methods void createUI (); diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp index 0b5ac8e798..a6dafda3e6 100644 --- a/indra/newview/llfloaterevent.cpp +++ b/indra/newview/llfloaterevent.cpp @@ -117,8 +117,3 @@ void LLFloaterEvent::setEventID(const U32 event_id) } } - -void LLFloaterEvent::draw() -{ - LLPanel::draw(); -} diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h index b1963309da..ed90055d95 100644 --- a/indra/newview/llfloaterevent.h +++ b/indra/newview/llfloaterevent.h @@ -43,7 +43,6 @@ public: /*virtual*/ ~LLFloaterEvent(); /*virtual*/ BOOL postBuild(); - /*virtual*/ void draw(); void setEventID(const U32 event_id); diff --git a/indra/newview/llfloatergroups.cpp b/indra/newview/llfloatergroups.cpp index 234a09d157..d84364a68a 100644 --- a/indra/newview/llfloatergroups.cpp +++ b/indra/newview/llfloatergroups.cpp @@ -41,6 +41,7 @@ #include "llbutton.h" #include "llgroupactions.h" #include "llscrolllistctrl.h" +#include "llstartup.h" #include "lltextbox.h" #include "lluictrlfactory.h" #include "lltrans.h" @@ -171,7 +172,7 @@ void LLPanelGroups::reset() group_list->operateOnAll(LLCtrlListInterface::OP_DELETE); } getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); - getChild<LLUICtrl>("groupcount")->setTextArg("[MAX]", llformat("%d",MAX_AGENT_GROUPS)); + getChild<LLUICtrl>("groupcount")->setTextArg("[MAX]", llformat("%d",gMaxAgentGroups)); init_group_list(getChild<LLScrollListCtrl>("group list"), gAgent.getGroupID()); enableButtons(); @@ -182,7 +183,7 @@ BOOL LLPanelGroups::postBuild() childSetCommitCallback("group list", onGroupList, this); getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d",gAgent.mGroups.count())); - getChild<LLUICtrl>("groupcount")->setTextArg("[MAX]", llformat("%d",MAX_AGENT_GROUPS)); + getChild<LLUICtrl>("groupcount")->setTextArg("[MAX]", llformat("%d",gMaxAgentGroups)); LLScrollListCtrl *list = getChild<LLScrollListCtrl>("group list"); if (list) diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp index 1e91710552..42ec7d765b 100644 --- a/indra/newview/llfloaterhardwaresettings.cpp +++ b/indra/newview/llfloaterhardwaresettings.cpp @@ -50,7 +50,6 @@ LLFloaterHardwareSettings::LLFloaterHardwareSettings(const LLSD& key) // but init them anyway mUseVBO(0), mUseAniso(0), - mUseFBO(0), mFSAASamples(0), mGamma(0.0), mVideoCardMem(0), @@ -75,7 +74,6 @@ void LLFloaterHardwareSettings::refresh() mUseVBO = gSavedSettings.getBOOL("RenderVBOEnable"); mUseAniso = gSavedSettings.getBOOL("RenderAnisotropic"); - mUseFBO = gSavedSettings.getBOOL("RenderUseFBO"); mFSAASamples = gSavedSettings.getU32("RenderFSAASamples"); mGamma = gSavedSettings.getF32("RenderGamma"); mVideoCardMem = gSavedSettings.getS32("TextureMemory"); @@ -104,7 +102,7 @@ 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")); + getChildView("antialiasing restart")->setVisible(!gSavedSettings.getBOOL("RenderDeferred")); /* Enable to reset fsaa value to disabled when feature is not available. if (!gPipeline.canUseAntiAliasing()) @@ -139,7 +137,6 @@ void LLFloaterHardwareSettings::cancel() { gSavedSettings.setBOOL("RenderVBOEnable", mUseVBO); gSavedSettings.setBOOL("RenderAnisotropic", mUseAniso); - gSavedSettings.setBOOL("RenderUseFBO", mUseFBO); gSavedSettings.setU32("RenderFSAASamples", mFSAASamples); gSavedSettings.setF32("RenderGamma", mGamma); gSavedSettings.setS32("TextureMemory", mVideoCardMem); diff --git a/indra/newview/llfloatermodelpreview.cpp b/indra/newview/llfloatermodelpreview.cpp index 85cc205dab..d1a7ba861b 100644..100755 --- a/indra/newview/llfloatermodelpreview.cpp +++ b/indra/newview/llfloatermodelpreview.cpp @@ -67,7 +67,9 @@ #include "lleconomy.h" #include "llfocusmgr.h" #include "llfloaterperms.h" +#include "lliconctrl.h" #include "llmatrix4a.h" +#include "llmenubutton.h" #include "llmeshrepository.h" #include "llsdutil_math.h" #include "lltextbox.h" @@ -80,17 +82,21 @@ #include "llvoavatarself.h" #include "pipeline.h" #include "lluictrlfactory.h" +#include "llviewermenu.h" #include "llviewermenufile.h" #include "llviewerregion.h" +#include "llviewertexturelist.h" #include "llstring.h" #include "llbutton.h" #include "llcheckboxctrl.h" #include "llsliderctrl.h" #include "llspinctrl.h" +#include "lltoggleablemenu.h" #include "llvfile.h" #include "llvfs.h" + #include "glod/glod.h" //static @@ -102,11 +108,12 @@ const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PRE const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE; const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16; const S32 PREVIEW_TEXTURE_HEIGHT = 300; +const S32 NUM_LOD = 4; void drawBoxOutline(const LLVector3& pos, const LLVector3& size); -std::string lod_name[] = +std::string lod_name[NUM_LOD+1] = { "lowest", "low", @@ -115,7 +122,7 @@ std::string lod_name[] = "I went off the end of the lod_name array. Me so smart." }; -std::string lod_triangles_name[] = +std::string lod_triangles_name[NUM_LOD+1] = { "lowest_triangles", "low_triangles", @@ -124,7 +131,7 @@ std::string lod_triangles_name[] = "I went off the end of the lod_triangles_name array. Me so smart." }; -std::string lod_vertices_name[] = +std::string lod_vertices_name[NUM_LOD+1] = { "lowest_vertices", "low_vertices", @@ -132,8 +139,8 @@ std::string lod_vertices_name[] = "high_vertices", "I went off the end of the lod_vertices_name array. Me so smart." }; - -std::string lod_status_name[] = + +std::string lod_status_name[NUM_LOD+1] = { "lowest_status", "low_status", @@ -142,7 +149,24 @@ std::string lod_status_name[] = "I went off the end of the lod_status_name array. Me so smart." }; -std::string lod_label_name[] = +std::string lod_icon_name[NUM_LOD+1] = +{ + "status_icon_lowest", + "status_icon_low", + "status_icon_medium", + "status_icon_high", + "I went off the end of the lod_status_name array. Me so smart." +}; + +std::string lod_status_image[NUM_LOD+1] = +{ + "ModelImport_Status_Good", + "ModelImport_Status_Warning", + "ModelImport_Status_Error", + "I went off the end of the lod_status_image array. Me so smart." +}; + +std::string lod_label_name[NUM_LOD+1] = { "lowest_label", "low_label", @@ -152,7 +176,6 @@ std::string lod_label_name[] = }; - bool validate_face(const LLVolumeFace& face) { for (U32 i = 0; i < face.mNumIndices; ++i) @@ -211,24 +234,18 @@ BOOL stop_gloderror() return FALSE; } -class LLMeshFilePicker : public LLFilePickerThread -{ -public: - LLFloaterModelPreview* mFMP; - S32 mLOD; - LLMeshFilePicker(LLFloaterModelPreview* fmp, S32 lod) +LLMeshFilePicker::LLMeshFilePicker(LLModelPreview* mp, S32 lod) : LLFilePickerThread(LLFilePicker::FFLOAD_COLLADA) { - mFMP = fmp; + mMP = mp; mLOD = lod; } - - virtual void notify(const std::string& filename) - { - mFMP->mModelPreview->loadModel(mFile, mLOD); - } -}; + +void LLMeshFilePicker::notify(const std::string& filename) +{ + mMP->loadModel(mFile, mLOD); +} //----------------------------------------------------------------------------- @@ -241,7 +258,6 @@ LLFloater(key) mLastMouseX = 0; mLastMouseY = 0; mGLName = 0; - mLoading = FALSE; } //----------------------------------------------------------------------------- @@ -254,21 +270,29 @@ BOOL LLFloaterModelPreview::postBuild() return FALSE; } + setViewOption("show_textures", true); + childSetAction("lod_browse", onBrowseLOD, this); - childSetCommitCallback("lod_triangle_limit", onTriangleLimitCommit, this); childSetCommitCallback("crease_angle", onGenerateNormalsCommit, this); childSetCommitCallback("generate_normals", onGenerateNormalsCommit, this); - childSetCommitCallback("show edges", onShowEdgesCommit, this); childSetCommitCallback("lod_generate", onAutoFillCommit, this); + + childSetCommitCallback("lod_mode", onLODParamCommit, this); + childSetCommitCallback("lod_error_threshold", onLODParamCommit, this); + childSetCommitCallback("lod_triangle_limit", onLODParamCommit, this); + childSetCommitCallback("build_operator", onLODParamCommit, this); + childSetCommitCallback("queue_mode", onLODParamCommit, this); + childSetCommitCallback("border_mode", onLODParamCommit, this); + childSetCommitCallback("share_tolerance", onLODParamCommit, this); childSetTextArg("status", "[STATUS]", getString("status_idle")); //childSetLabelArg("ok_btn", "[AMOUNT]", llformat("%d",sUploadAmount)); childSetAction("ok_btn", onUpload, this); + childDisable("ok_btn"); - childSetAction("consolidate", onConsolidate, this); childSetAction("clear_materials", onClearMaterials, this); childSetCommitCallback("preview_lod_combo", onPreviewLODCommit, this); @@ -283,7 +307,19 @@ BOOL LLFloaterModelPreview::postBuild() childDisable("upload_skin"); childDisable("upload_joints"); + childDisable("ok_btn"); + + mViewOptionMenuButton = getChild<LLMenuButton>("options_gear_btn"); + + mCommitCallbackRegistrar.add("ModelImport.ViewOption.Action", boost::bind(&LLFloaterModelPreview::onViewOptionChecked, this, _2)); + mEnableCallbackRegistrar.add("ModelImport.ViewOption.Check", boost::bind(&LLFloaterModelPreview::isViewOptionChecked, this, _2)); + mEnableCallbackRegistrar.add("ModelImport.ViewOption.Enabled", boost::bind(&LLFloaterModelPreview::isViewOptionEnabled, this, _2)); + + + mViewOptionMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_model_import_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + mViewOptionMenuButton->setMenu(mViewOptionMenu, LLMenuButton::MP_BOTTOM_LEFT); + initDecompControls(); LLView* preview_panel = getChild<LLView>("preview_panel"); @@ -344,21 +380,47 @@ LLFloaterModelPreview::~LLFloaterModelPreview() } } -void LLFloaterModelPreview::loadModel(S32 lod) +void LLFloaterModelPreview::onViewOptionChecked(const LLSD& userdata) { - mLoading = TRUE; - - (new LLMeshFilePicker(this, lod))->getFile(); + mViewOption[userdata.asString()] = !mViewOption[userdata.asString()]; + mModelPreview->refresh(); } -void LLFloaterModelPreview::setLimit(S32 lod, S32 limit) +bool LLFloaterModelPreview::isViewOptionChecked(const LLSD& userdata) { - if (limit != mModelPreview->mLimit[lod]) - { - mModelPreview->mLimit[lod] = limit; - mModelPreview->genLODs(lod); - mModelPreview->setPreviewLOD(lod); - } + return mViewOption[userdata.asString()]; +} + +bool LLFloaterModelPreview::isViewOptionEnabled(const LLSD& userdata) +{ + return !mViewOptionDisabled[userdata.asString()]; +} + +void LLFloaterModelPreview::setViewOptionEnabled(const std::string& option, bool enabled) +{ + mViewOptionDisabled[option] = !enabled; +} + +void LLFloaterModelPreview::enableViewOption(const std::string& option) +{ + setViewOptionEnabled(option, true); +} + +void LLFloaterModelPreview::disableViewOption(const std::string& option) +{ + setViewOptionEnabled(option, false); +} + +void LLFloaterModelPreview::setViewOption(const std::string& option, bool value) +{ + mViewOption[option] = value; +} + +void LLFloaterModelPreview::loadModel(S32 lod) +{ + mModelPreview->mLoading = true; + + (new LLMeshFilePicker(mModelPreview, lod))->getFile(); } //static @@ -420,33 +482,10 @@ void LLFloaterModelPreview::onPreviewLODCommit(LLUICtrl* ctrl, void* userdata) { which_mode = iface->getFirstSelectedIndex(); } + which_mode = (NUM_LOD-1)-which_mode; // combo box list of lods is in reverse order fp->mModelPreview->setPreviewLOD(which_mode); } -//static -void LLFloaterModelPreview::setLimit(S32 lod, void* userdata) -{ - LLFloaterModelPreview *fp =(LLFloaterModelPreview *)userdata; - - if (!fp->mModelPreview) - { - return; - } - - S32 limit = fp->childGetValue("lod_triangle_limit").asInteger(); - - - fp->setLimit(lod, limit); -} - -//static -void LLFloaterModelPreview::onTriangleLimitCommit(LLUICtrl* ctrl, void* userdata) -{ - LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata; - - LLFloaterModelPreview::setLimit(fp->mModelPreview->mPreviewLOD, userdata); -} - //static void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userdata) { @@ -456,14 +495,6 @@ void LLFloaterModelPreview::onGenerateNormalsCommit(LLUICtrl* ctrl, void* userda } //static -void LLFloaterModelPreview::onShowEdgesCommit(LLUICtrl* ctrl, void* userdata) -{ - LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata; - - fp->mModelPreview->refresh(); -} - -//static void LLFloaterModelPreview::onExplodeCommit(LLUICtrl* ctrl, void* userdata) { LLFloaterModelPreview* fp = LLFloaterModelPreview::sInstance; @@ -479,6 +510,15 @@ void LLFloaterModelPreview::onAutoFillCommit(LLUICtrl* ctrl, void* userdata) fp->mModelPreview->genLODs(); } +//static +void LLFloaterModelPreview::onLODParamCommit(LLUICtrl* ctrl, void* userdata) +{ + LLFloaterModelPreview* fp = (LLFloaterModelPreview*) userdata; + fp->mModelPreview->genLODs(fp->mModelPreview->mPreviewLOD); + fp->mModelPreview->updateStatusMessages(); + fp->mModelPreview->refresh(); +} + //----------------------------------------------------------------------------- // draw() @@ -490,7 +530,7 @@ void LLFloaterModelPreview::draw() mModelPreview->update(); - if (!mLoading) + if (!mModelPreview->mLoading) { childSetTextArg("status", "[STATUS]", getString("status_idle")); } @@ -881,7 +921,6 @@ void LLFloaterModelPreview::initDecompControls() childSetCommitCallback("physics_layer", LLFloaterModelPreview::refresh, LLFloaterModelPreview::sInstance); childSetCommitCallback("physics_explode", LLFloaterModelPreview::onExplodeCommit, this); - childSetCommitCallback("show physics", LLFloaterModelPreview::refresh, this); } //----------------------------------------------------------------------------- @@ -1302,12 +1341,12 @@ void LLModelLoader::run() llwarns<<"Tried to apply joint position from .dae, but it did not exist in the avatar rig." << llendl; } //Reposition the avatars pelvis (avPos+offset) - if ( lookingForJoint == "mPelvis" ) - { - const LLVector3& pos = gAgentAvatarp->getCharacterPosition(); - gAgentAvatarp->setPelvisOffset( true, jointTransform.getTranslation() ); - gAgentAvatarp->setPosition( pos + jointTransform.getTranslation() ); - } + //if ( lookingForJoint == "mPelvis" ) + //{ + // const LLVector3& pos = gAgentAvatarp->getCharacterPosition(); + // gAgentAvatarp->setPelvisOffset( true, jointTransform.getTranslation() ); + // gAgentAvatarp->setPosition( pos + jointTransform.getTranslation() ); + //} } } } //missingSkeletonOrScene @@ -1552,9 +1591,11 @@ void LLModelLoader::run() } daeElement* scene = root->getDescendant("visual_scene"); + if (!scene) { llwarns << "document has no visual_scene" << llendl; + setLoadState( ERROR_PARSING ); return; } @@ -1961,7 +2002,7 @@ LLColor4 LLModelLoader::getDaeColor(daeElement* element) // LLModelPreview //----------------------------------------------------------------------------- -LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloaterModelPreview* fmp) +LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloater* fmp) : LLViewerDynamicTexture(width, height, 3, ORDER_MIDDLE, FALSE), LLMutex(NULL) { mNeedsUpdate = TRUE; @@ -1972,12 +2013,15 @@ LLModelPreview::LLModelPreview(S32 width, S32 height, LLFloaterModelPreview* fmp mTextureName = 0; mPreviewLOD = 0; mModelLoader = NULL; + mMaxTriangleLimit = 0; mDirty = false; - - for (U32 i = 0; i < LLModel::NUM_LODS; i++) - { - mLimit[i] = 0; - } + mGenLOD = false; + mLoading = false; + mGroup = 0; + mBuildShareTolerance = 0.f; + mBuildQueueMode = GLOD_QUEUE_GREEDY; + mBuildBorderMode = GLOD_BORDER_UNLOCK; + mBuildOperator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE; mFMP = fmp; @@ -1999,6 +2043,11 @@ LLModelPreview::~LLModelPreview() U32 LLModelPreview::calcResourceCost() { rebuildUploadData(); + + if ( mModelLoader->getLoadState() != LLModelLoader::ERROR_PARSING ) + { + mFMP->childEnable("ok_btn"); + } U32 cost = 0; std::set<LLModel*> accounted; @@ -2093,6 +2142,11 @@ void LLModelPreview::rebuildUploadData() F32 max_scale = 0.f; + if ( mBaseScene.size() > 0 ) + { + mFMP->childEnable("ok_btn"); + } + for (LLModelLoader::scene::iterator iter = mBaseScene.begin(); iter != mBaseScene.end(); ++iter) { //for each transform in scene LLMatrix4 mat = iter->first; @@ -2201,28 +2255,15 @@ void LLModelPreview::loadModel(std::string filename, S32 lod) mFMP->closeFloater(false); } - mFMP->mLoading = false; + mLoading = false; return; } mLODFile[lod] = filename; - if (lod == 3 && !mGroup.empty()) + if (lod == LLModel::LOD_HIGH) { - for (std::map<LLPointer<LLModel>, U32>::iterator iter = mGroup.begin(); iter != mGroup.end(); ++iter) - { - glodDeleteGroup(iter->second); - stop_gloderror(); - } - - for (std::map<LLPointer<LLModel>, U32>::iterator iter = mObject.begin(); iter != mObject.end(); ++iter) - { - glodDeleteObject(iter->second); - stop_gloderror(); - } - - mGroup.clear(); - mObject.clear(); + clearGLODGroup(); } mModelLoader = new LLModelLoader(filename, lod, this); @@ -2233,6 +2274,11 @@ void LLModelPreview::loadModel(std::string filename, S32 lod) setPreviewLOD(lod); + if ( mModelLoader->getLoadState() == LLModelLoader::ERROR_PARSING ) + { + mFMP->childDisable("ok_btn"); + } + if (lod == mPreviewLOD) { mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]); @@ -2256,6 +2302,7 @@ void LLModelPreview::setPhysicsFromLOD(S32 lod) mVertexBuffer[LLModel::LOD_PHYSICS].clear(); rebuildUploadData(); refresh(); + updateStatusMessages(); } } @@ -2274,6 +2321,7 @@ void LLModelPreview::clearIncompatible(S32 lod) if (i == LLModel::LOD_HIGH) { mBaseModel = mModel[lod]; + clearGLODGroup(); mBaseScene = mScene[lod]; mVertexBuffer[5].clear(); } @@ -2282,6 +2330,23 @@ void LLModelPreview::clearIncompatible(S32 lod) } } +void LLModelPreview::clearGLODGroup() +{ + if (mGroup) + { + for (std::map<LLPointer<LLModel>, U32>::iterator iter = mObject.begin(); iter != mObject.end(); ++iter) + { + glodDeleteObject(iter->second); + stop_gloderror(); + } + mObject.clear(); + + glodDeleteGroup(mGroup); + stop_gloderror(); + mGroup = 0; + } +} + void LLModelPreview::loadModelCallback(S32 lod) { //NOT the main thread LLMutexLock lock(this); @@ -2304,22 +2369,28 @@ void LLModelPreview::loadModelCallback(S32 lod) if (lod == LLModel::LOD_HIGH) { //save a copy of the highest LOD for automatic LOD manipulation + if (mBaseModel.empty()) + { //first time we've loaded a model, auto-gen LoD + mGenLOD = true; + } + mBaseModel = mModel[lod]; + clearGLODGroup(); + mBaseScene = mScene[lod]; mVertexBuffer[5].clear(); - //mModel[lod] = NULL; } clearIncompatible(lod); mDirty = true; - + if (lod == LLModel::LOD_HIGH) { resetPreviewTarget(); } - mFMP->mLoading = FALSE; + mLoading = false; refresh(); } @@ -2533,6 +2604,7 @@ void LLModelPreview::consolidate() { mBaseScene = new_scene; mBaseModel = new_model; + clearGLODGroup(); mVertexBuffer[5].clear(); } @@ -2575,6 +2647,7 @@ void LLModelPreview::clearMaterials() { mBaseScene = mScene[mPreviewLOD]; mBaseModel = mModel[mPreviewLOD]; + clearGLODGroup(); mVertexBuffer[5].clear(); } @@ -2616,11 +2689,6 @@ void LLModelPreview::genLODs(S32 which_lod) S32 limit = -1; - if (which_lod != -1) - { - limit = mLimit[which_lod]; - } - U32 triangle_count = 0; for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) @@ -2636,37 +2704,132 @@ void LLModelPreview::genLODs(S32 which_lod) U32 type_mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; - if (mGroup[mBaseModel[0]] == 0) - { //clear LOD maps - mGroup.clear(); - mObject.clear(); - mPercentage.clear(); - mPatch.clear(); + U32 lod_mode = 0; + + LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); + if (iface) + { + lod_mode = iface->getFirstSelectedIndex(); } + + F32 lod_error_threshold = mFMP->childGetValue("lod_error_threshold").asReal(); - for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) - { //build GLOD objects for each model in base model list - LLModel* mdl = *iter; - if (mGroup[mdl] == 0) + if (lod_mode == 0) + { + lod_mode = GLOD_TRIANGLE_BUDGET; + if (which_lod != -1) { - mGroup[mdl] = cur_name++; - mObject[mdl] = cur_name++; - - glodNewGroup(mGroup[mdl]); - stop_gloderror(); - - glodGroupParameteri(mGroup[mdl], GLOD_ADAPT_MODE, GLOD_TRIANGLE_BUDGET); - stop_gloderror(); - - glodGroupParameteri(mGroup[mdl], GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR); - stop_gloderror(); + limit = mFMP->childGetValue("lod_triangle_limit").asInteger(); + } + } + else + { + lod_mode = GLOD_ERROR_THRESHOLD; + } + + U32 build_operator = 0; + + iface = mFMP->childGetSelectionInterface("build_operator"); + if (iface) + { + build_operator = iface->getFirstSelectedIndex(); + } + + if (build_operator == 0) + { + build_operator = GLOD_OPERATOR_HALF_EDGE_COLLAPSE; + } + else + { + build_operator = GLOD_OPERATOR_EDGE_COLLAPSE; + } + + U32 queue_mode=0; + iface = mFMP->childGetSelectionInterface("queue_mode"); + if (iface) + { + queue_mode = iface->getFirstSelectedIndex(); + } + + if (queue_mode == 0) + { + queue_mode = GLOD_QUEUE_GREEDY; + } + else if (queue_mode == 1) + { + queue_mode = GLOD_QUEUE_LAZY; + } + else + { + queue_mode = GLOD_QUEUE_INDEPENDENT; + } + + U32 border_mode = 0; + + iface = mFMP->childGetSelectionInterface("border_mode"); + if (iface) + { + border_mode = iface->getFirstSelectedIndex(); + } + + if (border_mode == 0) + { + border_mode = GLOD_BORDER_UNLOCK; + } + else + { + border_mode = GLOD_BORDER_LOCK; + } + + bool object_dirty = false; + if (border_mode != mBuildBorderMode) + { + mBuildBorderMode = border_mode; + object_dirty = true; + } + + if (queue_mode != mBuildQueueMode) + { + mBuildQueueMode = queue_mode; + object_dirty = true; + } + + if (build_operator != mBuildOperator) + { + mBuildOperator = build_operator; + object_dirty = true; + } + + F32 share_tolerance = mFMP->childGetValue("share_tolerance").asReal(); + if (share_tolerance != mBuildShareTolerance) + { + mBuildShareTolerance = share_tolerance; + object_dirty = true; + } + + if (mGroup == 0) + { + object_dirty = true; + mGroup = cur_name++; + glodNewGroup(mGroup); + } + + if (object_dirty) + { + for (LLModelLoader::model_list::iterator iter = mBaseModel.begin(); iter != mBaseModel.end(); ++iter) + { //build GLOD objects for each model in base model list + LLModel* mdl = *iter; - glodGroupParameterf(mGroup[mdl], GLOD_OBJECT_SPACE_ERROR_THRESHOLD, 0.025f); - stop_gloderror(); + if (mObject[mdl] != 0) + { + glodDeleteObject(mObject[mdl]); + } + + mObject[mdl] = cur_name++; - glodNewObject(mObject[mdl], mGroup[mdl], GLOD_DISCRETE); + glodNewObject(mObject[mdl], mGroup, GLOD_DISCRETE); stop_gloderror(); - + if (iter == mBaseModel.begin() && !mdl->mSkinWeights.empty()) { //regenerate vertex buffer for skinned models to prevent animation feedback during LOD generation mVertexBuffer[5].clear(); @@ -2689,38 +2852,22 @@ void LLModelPreview::genLODs(S32 which_lod) tri_count += num_indices/3; stop_gloderror(); } - - //store what percentage of total model (in terms of triangle count) this model makes up - mPercentage[mdl] = (F32) tri_count / (F32) base_triangle_count; - - //build glodobject + + glodObjectParameteri(mObject[mdl], GLOD_BUILD_OPERATOR, build_operator); + stop_gloderror(); + + glodObjectParameteri(mObject[mdl], GLOD_BUILD_QUEUE_MODE, queue_mode); + stop_gloderror(); + + glodObjectParameteri(mObject[mdl], GLOD_BUILD_BORDER_MODE, border_mode); + stop_gloderror(); + + glodObjectParameterf(mObject[mdl], GLOD_BUILD_SHARE_TOLERANCE, share_tolerance); + stop_gloderror(); + glodBuildObject(mObject[mdl]); - if (stop_gloderror()) - { - glodDeleteGroup(mGroup[mdl]); - stop_gloderror(); - glodDeleteObject(mObject[mdl]); - stop_gloderror(); - - mGroup[mdl] = 0; - mObject[mdl] = 0; - - if (which_lod == -1) - { - mModel[LLModel::LOD_HIGH] = mBaseModel; - } - - return; - } - + stop_gloderror(); } - - //generating LODs for all entries, or this entry has a triangle budget - glodGroupParameteri(mGroup[mdl], GLOD_ADAPT_MODE, GLOD_TRIANGLE_BUDGET); - stop_gloderror(); - - glodGroupParameterf(mGroup[mdl], GLOD_OBJECT_SPACE_ERROR_THRESHOLD, 0.025f); - stop_gloderror(); } @@ -2732,9 +2879,8 @@ void LLModelPreview::genLODs(S32 which_lod) start = end = which_lod; } - LLSpinCtrl* lim = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit", TRUE); - lim->setMaxValue(base_triangle_count); - + mMaxTriangleLimit = base_triangle_count; + for (S32 lod = start; lod >= end; --lod) { if (which_lod == -1) @@ -2757,23 +2903,25 @@ void LLModelPreview::genLODs(S32 which_lod) U32 actual_verts = 0; U32 submeshes = 0; + glodGroupParameteri(mGroup, GLOD_ADAPT_MODE, lod_mode); + stop_gloderror(); + + glodGroupParameteri(mGroup, GLOD_ERROR_MODE, GLOD_OBJECT_SPACE_ERROR); + stop_gloderror(); + + glodGroupParameteri(mGroup, GLOD_MAX_TRIANGLES, triangle_count); + stop_gloderror(); + + glodGroupParameterf(mGroup, GLOD_OBJECT_SPACE_ERROR_THRESHOLD, lod_error_threshold); + stop_gloderror(); + + glodAdaptGroup(mGroup); + stop_gloderror(); + for (U32 mdl_idx = 0; mdl_idx < mBaseModel.size(); ++mdl_idx) { LLModel* base = mBaseModel[mdl_idx]; - U32 target_count = U32(mPercentage[base]*triangle_count); - - if (target_count < 4) - { - target_count = 4; - } - - glodGroupParameteri(mGroup[base], GLOD_MAX_TRIANGLES, target_count); - stop_gloderror(); - - glodAdaptGroup(mGroup[base]); - stop_gloderror(); - GLint patch_count = 0; glodGetObjectParameteriv(mObject[base], GLOD_NUM_PATCHES, &patch_count); stop_gloderror(); @@ -2823,8 +2971,7 @@ void LLModelPreview::genLODs(S32 which_lod) buff->getNormalStrider(norm); buff->getTexCoord0Strider(tc); buff->getIndexStrider(index); - - + target_model->setVolumeFaceData(names[i], pos, norm, tc, index, buff->getNumVerts(), buff->getNumIndices()); actual_tris += buff->getNumIndices()/3; actual_verts += buff->getNumVerts(); @@ -2938,17 +3085,26 @@ void LLModelPreview::updateStatusMessages() } } + if (mMaxTriangleLimit == 0) + { + mMaxTriangleLimit = total_tris[LLModel::LOD_HIGH]; + } + + mFMP->childSetTextArg("submeshes_info", "[SUBMESHES]", llformat("%d", total_submeshes[LLModel::LOD_HIGH])); - std::string mesh_status_good = mFMP->getString("mesh_status_good"); - std::string mesh_status_bad = mFMP->getString("mesh_status_bad"); std::string mesh_status_na = mFMP->getString("mesh_status_na"); - std::string mesh_status_none = mFMP->getString("mesh_status_none"); + + S32 upload_status[LLModel::LOD_HIGH+1]; bool upload_ok = true; - + for (S32 lod = 0; lod <= LLModel::LOD_HIGH; ++lod) { + upload_status[lod] = 0; + + std::string message = "mesh_status_good"; + if (total_tris[lod] > 0) { mFMP->childSetText(lod_triangles_name[lod], llformat("%d", total_tris[lod])); @@ -2956,26 +3112,40 @@ void LLModelPreview::updateStatusMessages() } else { + if (lod == LLModel::LOD_HIGH) + { + upload_status[lod] = 2; + message = "mesh_status_missing_lod"; + } + else + { + for (S32 i = lod-1; i >= 0; --i) + { + if (total_tris[i] > 0) + { + upload_status[lod] = 2; + message = "mesh_status_missing_lod"; + } + } + } + mFMP->childSetText(lod_triangles_name[lod], mesh_status_na); mFMP->childSetText(lod_vertices_name[lod], mesh_status_na); } - - std::string message = mesh_status_good; - const U32 lod_high = LLModel::LOD_HIGH; if (lod != lod_high) { if (total_submeshes[lod] && total_submeshes[lod] != total_submeshes[lod_high]) { //number of submeshes is different - message = mesh_status_bad; - upload_ok = false; + message = "mesh_status_submesh_mismatch"; + upload_status[lod] = 2; } else if (!tris[lod].empty() && tris[lod].size() != tris[lod_high].size()) { //number of meshes is different - message = mesh_status_bad; - upload_ok = false; + message = "mesh_status_mesh_mismatch"; + upload_status[lod] = 2; } else if (!verts[lod].empty()) { @@ -2983,23 +3153,39 @@ void LLModelPreview::updateStatusMessages() { S32 max_verts = i < verts[lod+1].size() ? verts[lod+1][i] : 0; - if (verts[lod][i] > max_verts) - { //too many vertices in this lod - message = mesh_status_bad; - upload_ok = false; + if (max_verts > 0) + { + if (verts[lod][i] > max_verts) + { //too many vertices in this lod + message = "mesh_status_too_many_vertices"; + upload_status[lod] = 2; + } } } } - else - { //no mesh - message = mesh_status_none; - } } - mFMP->childSetText(lod_status_name[lod], message); + LLIconCtrl* icon = mFMP->getChild<LLIconCtrl>(lod_icon_name[lod]); + LLUIImagePtr img = LLUI::getUIImage(lod_status_image[upload_status[lod]]); + icon->setVisible(true); + icon->setImage(img); + + if (upload_status[lod] >= 2) + { + upload_ok = false; + } + + if (lod == mPreviewLOD) + { + mFMP->childSetText("lod_status_message_text", mFMP->getString(message)); + icon = mFMP->getChild<LLIconCtrl>("lod_status_message_icon"); + icon->setImage(img); + } } - if (upload_ok) + bool errorStateFromLoader = mModelLoader->getLoadState() == LLModelLoader::ERROR_PARSING ? true : false; + + if ( upload_ok && !errorStateFromLoader ) { mFMP->childEnable("ok_btn"); } @@ -3069,20 +3255,125 @@ void LLModelPreview::updateStatusMessages() mFMP->childSetTextArg("physics_points", "[POINTS]", mesh_status_na); } + LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; + if (fmp) + { + if (phys_tris > 0 || phys_hulls > 0) + { + if (!fmp->isViewOptionEnabled("show_physics")) + { + fmp->enableViewOption("show_physics"); + fmp->setViewOption("show_physics", true); + } + } + else + { + fmp->disableViewOption("show_physics"); + fmp->setViewOption("show_physics", false); + } + } + + const char* lod_controls[] = + { + "lod_mode", + "lod_triangle_limit", + "lod_error_tolerance", + "build_operator_text", + "queue_mode_text", + "border_mode_text", + "share_tolerance_text", + "build_operator", + "queue_mode", + "border_mode", + "share_tolerance" + }; + const U32 num_lod_controls = sizeof(lod_controls)/sizeof(char*); + + const char* file_controls[] = + { + "lod_browse", + "lod_file" + }; + const U32 num_file_controls = sizeof(file_controls)/sizeof(char*); + //enable/disable controls based on radio groups if (mFMP->childGetValue("lod_from_file").asBoolean()) { - mFMP->childDisable("lod_triangle_limit"); - mFMP->childDisable("lod_generate"); - mFMP->childEnable("lod_file"); - mFMP->childEnable("lod_browse"); + for (U32 i = 0; i < num_file_controls; ++i) + { + mFMP->childEnable(file_controls[i]); + } + + for (U32 i = 0; i < num_lod_controls; ++i) + { + mFMP->childDisable(lod_controls[i]); + } + + } - else + else if (mFMP->childGetValue("lod_auto_generate").asBoolean()) { - mFMP->childEnable("lod_triangle_limit"); - mFMP->childEnable("lod_generate"); - mFMP->childDisable("lod_file"); - mFMP->childDisable("lod_browse"); + for (U32 i = 0; i < num_file_controls; ++i) + { + mFMP->childDisable(file_controls[i]); + } + + for (U32 i = 0; i < num_lod_controls; ++i) + { + mFMP->childEnable(lod_controls[i]); + } + + //if (threshold) + { + U32 lod_mode = 0; + LLCtrlSelectionInterface* iface = mFMP->childGetSelectionInterface("lod_mode"); + if (iface) + { + lod_mode = iface->getFirstSelectedIndex(); + } + + LLSpinCtrl* threshold = mFMP->getChild<LLSpinCtrl>("lod_error_threshold"); + LLSpinCtrl* limit = mFMP->getChild<LLSpinCtrl>("lod_triangle_limit"); + + limit->setMaxValue(mMaxTriangleLimit); + limit->setValue(total_tris[mPreviewLOD]); + + if (lod_mode == 0) + { + limit->setVisible(true); + threshold->setVisible(false); + + limit->setMaxValue(mMaxTriangleLimit); + } + else + { + limit->setVisible(false); + threshold->setVisible(true); + } + } + } + else + { // "None" is chosen + for (U32 i = 0; i < num_file_controls; ++i) + { + mFMP->childDisable(file_controls[i]); + } + + for (U32 i = 0; i < num_lod_controls; ++i) + { + mFMP->childDisable(lod_controls[i]); + } + + if (!mModel[mPreviewLOD].empty()) + { + mModel[mPreviewLOD].clear(); + mScene[mPreviewLOD].clear(); + mVertexBuffer[mPreviewLOD].clear(); + + //this can cause phasing issues with the UI, so reenter this function and return + updateStatusMessages(); + return; + } } if (mFMP->childGetValue("physics_load_from_file").asBoolean()) @@ -3116,7 +3407,7 @@ void LLModelPreview::clearBuffers() } } -void LLModelPreview::genBuffers(S32 lod, bool avatar_preview) +void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights) { U32 tri_count = 0; U32 vertex_count = 0; @@ -3167,7 +3458,7 @@ void LLModelPreview::genBuffers(S32 lod, bool avatar_preview) LLVertexBuffer* vb = NULL; - bool skinned = avatar_preview && !mdl->mSkinWeights.empty(); + bool skinned = include_skin_weights && !mdl->mSkinWeights.empty(); U32 mask = LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0; @@ -3249,7 +3540,17 @@ void LLModelPreview::update() mDirty = false; mResourceCost = calcResourceCost(); refresh(); + updateStatusMessages(); } + + if (mGenLOD) + { + mGenLOD = false; + genLODs(); + refresh(); + updateStatusMessages(); + } + } //----------------------------------------------------------------------------- @@ -3260,6 +3561,22 @@ BOOL LLModelPreview::render() LLMutexLock lock(this); mNeedsUpdate = FALSE; + bool edges = false; + bool joint_positions = false; + bool skin_weight = false; + bool textures = false; + bool physics = false; + + LLFloaterModelPreview* fmp = LLFloaterModelPreview::sInstance; + if (fmp) + { + edges = fmp->isViewOptionChecked("show_edges"); + joint_positions = fmp->isViewOptionChecked("show_joint_positions"); + skin_weight = fmp->isViewOptionChecked("show_skin_weight"); + textures = fmp->isViewOptionChecked("show_textures"); + physics = fmp->isViewOptionChecked("show_physics"); + } + S32 width = getWidth(); S32 height = getHeight(); @@ -3291,7 +3608,7 @@ BOOL LLModelPreview::render() gGL.popMatrix(); } - bool avatar_preview = false; + bool has_skin_weights = false; bool upload_skin = mFMP->childGetValue("upload_skin").asBoolean(); bool upload_joints = mFMP->childGetValue("upload_joints").asBoolean(); @@ -3303,53 +3620,55 @@ BOOL LLModelPreview::render() LLModel* model = instance.mModel; if (!model->mSkinWeights.empty()) { - avatar_preview = true; + has_skin_weights = true; } } } - - if (upload_skin && !avatar_preview) + + if (has_skin_weights) + { //model has skin weights, enable view options for skin weights and joint positions + if (fmp) + { + fmp->enableViewOption("show_skin_weight"); + fmp->setViewOptionEnabled("show_joint_positions", skin_weight); + } + mFMP->childEnable("upload_skin"); + } + else { + mFMP->childDisable("upload_skin"); + if (fmp) + { + fmp->setViewOption("show_skin_weight", false); + fmp->disableViewOption("show_skin_weight"); + fmp->disableViewOption("show_joint_positions"); + } + skin_weight = false; + } + + if (upload_skin && !has_skin_weights) + { //can't upload skin weights if model has no skin weights mFMP->childSetValue("upload_skin", false); upload_skin = false; } if (!upload_skin && upload_joints) - { + { //can't upload joints if not uploading skin weights mFMP->childSetValue("upload_joints", false); upload_joints = false; } - if (!avatar_preview) - { - mFMP->childDisable("upload_skin"); - } - else - { - mFMP->childEnable("upload_skin"); - } - - if (!upload_skin) - { - mFMP->childDisable("upload_joints"); - } - else - { - mFMP->childEnable("upload_joints"); - } - - avatar_preview = avatar_preview && upload_skin; - - - mFMP->childSetEnabled("consolidate", !avatar_preview); + mFMP->childSetEnabled("upload_joints", upload_skin); F32 explode = mFMP->childGetValue("physics_explode").asReal(); glClear(GL_DEPTH_BUFFER_BIT); - F32 aspect = (F32) mFMP->mPreviewRect.getWidth()/mFMP->mPreviewRect.getHeight(); + LLRect preview_rect = mFMP->getChildView("preview_panel")->getRect(); + F32 aspect = (F32) preview_rect.getWidth()/preview_rect.getHeight(); LLViewerCamera::getInstance()->setAspect(aspect); + LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / mCameraZoom); LLVector3 offset = mCameraOffset; @@ -3358,7 +3677,7 @@ BOOL LLModelPreview::render() F32 z_near = 0.001f; F32 z_far = mCameraDistance+mPreviewScale.magVec()+mCameraOffset.magVec(); - if (avatar_preview) + if (skin_weight) { target_pos = gAgentAvatarp->getPositionAgent(); z_near = 0.01f; @@ -3369,6 +3688,9 @@ BOOL LLModelPreview::render() refresh(); } + glLoadIdentity(); + gPipeline.enableLightsPreview(); + LLQuaternion camera_rot = LLQuaternion(mCameraPitch, LLVector3::y_axis) * LLQuaternion(mCameraYaw, LLVector3::z_axis); @@ -3383,8 +3705,6 @@ BOOL LLModelPreview::render() stop_glerror(); - gPipeline.enableLightsAvatar(); - gGL.pushMatrix(); const F32 BRIGHTNESS = 0.9f; gGL.color3f(BRIGHTNESS, BRIGHTNESS, BRIGHTNESS); @@ -3393,22 +3713,32 @@ BOOL LLModelPreview::render() if (!mBaseModel.empty() && mVertexBuffer[5].empty()) { - genBuffers(-1, avatar_preview); + genBuffers(-1, skin_weight); //genBuffers(3); //genLODs(); } - bool physics = mFMP->childGetValue("show physics").asBoolean(); S32 physics_idx = mFMP->childGetValue("physics_layer").asInteger(); if (!mModel[mPreviewLOD].empty()) { - if (mVertexBuffer[mPreviewLOD].empty()) + bool regen = mVertexBuffer[mPreviewLOD].empty(); + if (!regen) { - genBuffers(mPreviewLOD, avatar_preview); + const std::vector<LLPointer<LLVertexBuffer> >& vb_vec = mVertexBuffer[mPreviewLOD].begin()->second; + if (!vb_vec.empty()) + { + const LLVertexBuffer* buff = vb_vec[0]; + regen = buff->hasDataType(LLVertexBuffer::TYPE_WEIGHT4) != skin_weight; + } + } + + if (regen) + { + genBuffers(mPreviewLOD, skin_weight); } - if (!avatar_preview) + if (!skin_weight) { for (LLMeshUploadThread::instance_list::iterator iter = mUploadData.begin(); iter != mUploadData.end(); ++iter) { @@ -3432,21 +3762,28 @@ BOOL LLModelPreview::render() buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); - glColor4fv(instance.mMaterial[i].mDiffuseColor.mV); - if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull()) + if (textures) { - gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true); - if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1) + glColor4fv(instance.mMaterial[i].mDiffuseColor.mV); + if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull()) { - mTextureSet.insert(instance.mMaterial[i].mDiffuseMap); + gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true); + if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1) + { + mTextureSet.insert(instance.mMaterial[i].mDiffuseMap); + } } } + else + { + glColor4f(1,1,1,1); + } buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); glColor3f(0.4f, 0.4f, 0.4f); - if (mFMP->childGetValue("show edges").asBoolean()) + if (edges) { glLineWidth(3.f); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); @@ -3527,7 +3864,7 @@ BOOL LLModelPreview::render() glColor4ubv(hull_colors[i].mV); buff->drawArrays(LLRender::TRIANGLES, 0, buff->getNumVerts()); - if (mFMP->childGetValue("show edges").asBoolean()) + if (edges) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glLineWidth(3.f); @@ -3558,21 +3895,28 @@ BOOL LLModelPreview::render() buffer->setBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL | LLVertexBuffer::MAP_TEXCOORD0); - glColor4fv(instance.mMaterial[i].mDiffuseColor.mV); - if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull()) + if (textures) { - gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true); - if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1) + glColor4fv(instance.mMaterial[i].mDiffuseColor.mV); + if (i < instance.mMaterial.size() && instance.mMaterial[i].mDiffuseMap.notNull()) { - mTextureSet.insert(instance.mMaterial[i].mDiffuseMap); + gGL.getTexUnit(0)->bind(instance.mMaterial[i].mDiffuseMap, true); + if (instance.mMaterial[i].mDiffuseMap->getDiscardLevel() > -1) + { + mTextureSet.insert(instance.mMaterial[i].mDiffuseMap); + } } } + else + { + glColor4f(1,1,1,1); + } buffer->drawRange(LLRender::TRIANGLES, 0, buffer->getNumVerts()-1, buffer->getNumIndices(), 0); gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); glColor3f(0.4f, 0.4f, 0.4f); - if (mFMP->childGetValue("show edges").asBoolean() || model == physics_model) + if (edges || model == physics_model) { if (model == physics_model) { @@ -3604,7 +3948,10 @@ BOOL LLModelPreview::render() LLVector3::z_axis, // up target_pos); // point of interest - avatar->renderCollisionVolumes(); + if (joint_positions) + { + avatar->renderCollisionVolumes(); + } for (LLModelLoader::scene::iterator iter = mScene[mPreviewLOD].begin(); iter != mScene[mPreviewLOD].end(); ++iter) { @@ -3689,7 +4036,7 @@ BOOL LLModelPreview::render() buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0); glColor3f(0.4f, 0.4f, 0.4f); - if (mFMP->childGetValue("show edges").asBoolean()) + if (edges) { glLineWidth(3.f); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); @@ -3752,7 +4099,7 @@ void LLModelPreview::setPreviewLOD(S32 lod) mPreviewLOD = lod; LLComboBox* combo_box = mFMP->getChild<LLComboBox>("preview_lod_combo"); - combo_box->setCurrentByIndex(mPreviewLOD); + combo_box->setCurrentByIndex((NUM_LOD-1)-mPreviewLOD); // combo box list of lods is in reverse order mFMP->childSetTextArg("lod_table_footer", "[DETAIL]", mFMP->getString(lod_name[mPreviewLOD])); mFMP->childSetText("lod_file", mLODFile[mPreviewLOD]); @@ -3770,6 +4117,7 @@ void LLModelPreview::setPreviewLOD(S32 lod) } } refresh(); + updateStatusMessages(); } //static @@ -3792,12 +4140,6 @@ void LLFloaterModelPreview::onUpload(void* user_data) mp->closeFloater(false); } -//static -void LLFloaterModelPreview::onConsolidate(void* user_data) -{ - LLFloaterModelPreview* mp = (LLFloaterModelPreview*) user_data; - mp->mModelPreview->consolidate(); -} //static void LLFloaterModelPreview::onClearMaterials(void* user_data) @@ -3886,4 +4228,3 @@ void LLFloaterModelPreview::DecompRequest::completed() sInstance->mCurRequest = NULL; } } - diff --git a/indra/newview/llfloatermodelpreview.h b/indra/newview/llfloatermodelpreview.h index 05106644dc..e233f3672a 100644 --- a/indra/newview/llfloatermodelpreview.h +++ b/indra/newview/llfloatermodelpreview.h @@ -34,6 +34,7 @@ #include "llmeshrepository.h" #include "llmodel.h" #include "llthread.h" +#include "llviewermenufile.h" class LLComboBox; class LLJoint; @@ -48,6 +49,8 @@ class domProfile_COMMON; class domInstance_geometry; class domNode; class domTranslate; +class LLMenuButton; +class LLToggleableMenu; class LLModelLoader : public LLThread { @@ -60,6 +63,7 @@ public: GENERATING_VERTEX_BUFFERS, GENERATING_LOD, DONE, + ERROR_PARSING, //basically loading failed } eLoadState; U32 mState; @@ -103,7 +107,9 @@ public: void extractTranslation( domTranslate* pTranslate, LLMatrix4& transform ); void extractTranslationViaElement( daeElement* pTranslateElement, LLMatrix4& transform ); - + void setLoadState( U32 state ) { mState = state; } + U32 getLoadState( void ) { return mState; } + //map of avatar joints as named in COLLADA assets to internal joint names std::map<std::string, std::string> mJointMap; }; @@ -142,7 +148,6 @@ public: static void onUpload(void* data); - static void onConsolidate(void* data); static void onClearMaterials(void* data); static void onModelDecompositionComplete(LLModel* model, std::vector<LLPointer<LLVertexBuffer> >& physics_mesh); @@ -152,6 +157,14 @@ public: void loadModel(S32 lod); + void onViewOptionChecked(const LLSD& userdata); + bool isViewOptionChecked(const LLSD& userdata); + bool isViewOptionEnabled(const LLSD& userdata); + void setViewOptionEnabled(const std::string& option, bool enabled); + void enableViewOption(const std::string& option); + void disableViewOption(const std::string& option); + void setViewOption(const std::string& option, bool value); + protected: friend class LLModelPreview; friend class LLMeshFilePicker; @@ -163,12 +176,10 @@ protected: static void onPreviewLODCommit(LLUICtrl*,void*); - static void onTriangleLimitCommit(LLUICtrl*,void*); - static void onGenerateNormalsCommit(LLUICtrl*,void*); static void onAutoFillCommit(LLUICtrl*,void*); - static void onShowEdgesCommit(LLUICtrl*,void*); + static void onLODParamCommit(LLUICtrl*,void*); static void onExplodeCommit(LLUICtrl*, void*); @@ -186,9 +197,6 @@ protected: void draw(); - static void setLimit(S32 lod, void* userdata); - void setLimit(S32 lod, S32 limit); - void initDecompControls(); LLModelPreview* mModelPreview; @@ -199,19 +207,37 @@ protected: S32 mLastMouseY; LLRect mPreviewRect; U32 mGLName; - BOOL mLoading; static S32 sUploadAmount; LLPointer<DecompRequest> mCurRequest; + std::map<std::string, bool> mViewOption; + + //use "disabled" as false by default + std::map<std::string, bool> mViewOptionDisabled; + + LLMenuButton* mViewOptionMenuButton; + LLToggleableMenu* mViewOptionMenu; }; +class LLMeshFilePicker : public LLFilePickerThread +{ +public: + LLMeshFilePicker(LLModelPreview* mp, S32 lod); + virtual void notify(const std::string& filename); + +private: + LLModelPreview* mMP; + S32 mLOD; +}; + + class LLModelPreview : public LLViewerDynamicTexture, public LLMutex { public: - LLModelPreview(S32 width, S32 height, LLFloaterModelPreview* fmp); + LLModelPreview(S32 width, S32 height, LLFloater* fmp); virtual ~LLModelPreview(); void resetPreviewTarget(); @@ -241,18 +267,22 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex void clearIncompatible(S32 lod); void updateStatusMessages(); bool containsRiggedAsset( void ); + void clearGLODGroup(); + static void textureLoadedCallback( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata ); protected: friend class LLFloaterModelPreview; + friend class LLFloaterModelWizard; friend class LLFloaterModelPreview::DecompRequest; friend class LLPhysicsDecomp; - LLFloaterModelPreview* mFMP; + LLFloater* mFMP; BOOL mNeedsUpdate; bool mDirty; + bool mGenLOD; U32 mTextureName; F32 mCameraDistance; F32 mCameraYaw; @@ -263,8 +293,15 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex LLVector3 mPreviewScale; S32 mPreviewLOD; U32 mResourceCost; - S32 mLimit[LLModel::NUM_LODS]; std::string mLODFile[LLModel::NUM_LODS]; + bool mLoading; + + //GLOD object parameters (must rebuild object if these change) + F32 mBuildShareTolerance; + U32 mBuildQueueMode; + U32 mBuildOperator; + U32 mBuildBorderMode; + LLModelLoader* mModelLoader; @@ -275,11 +312,9 @@ class LLModelPreview : public LLViewerDynamicTexture, public LLMutex LLModelLoader::model_list mModel[LLModel::NUM_LODS]; LLModelLoader::model_list mBaseModel; - std::map<LLPointer<LLModel>, U32> mGroup; + U32 mGroup; std::map<LLPointer<LLModel>, U32> mObject; - std::map<LLPointer<LLModel>, std::vector<U32> > mPatch; - std::map<LLPointer<LLModel>, F32> mPercentage; - + U32 mMaxTriangleLimit; std::map<LLPointer<LLModel>, std::vector<LLPointer<LLVertexBuffer> > > mPhysicsMesh; LLMeshUploadThread::instance_list mUploadData; diff --git a/indra/newview/llfloatermodelwizard.cpp b/indra/newview/llfloatermodelwizard.cpp new file mode 100644 index 0000000000..79c29ef017 --- /dev/null +++ b/indra/newview/llfloatermodelwizard.cpp @@ -0,0 +1,111 @@ +/** + * @file llfloatermodelwizard.cpp + * @author Leyla Farazha + * @brief Implementation of the LLFloaterModelWizard 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 "lldrawable.h" +#include "llfloater.h" +#include "llfloatermodelwizard.h" +#include "llfloatermodelpreview.h" +#include "llfloaterreg.h" + + + +LLFloaterModelWizard::LLFloaterModelWizard(const LLSD& key) + : LLFloater(key) +{ +} + +void LLFloaterModelWizard::loadModel() +{ + mModelPreview->mLoading = TRUE; + + (new LLMeshFilePicker(mModelPreview, 3))->getFile(); +} + + +BOOL LLFloaterModelWizard::postBuild() +{ + LLView* preview_panel = getChild<LLView>("preview_panel"); + + childSetValue("import_scale", (F32) 0.67335826); + + getChild<LLUICtrl>("browse")->setCommitCallback(boost::bind(&LLFloaterModelWizard::loadModel, this)); + + mPreviewRect = preview_panel->getRect(); + + mModelPreview = new LLModelPreview(512, 512, this); + mModelPreview->setPreviewTarget(16.f); + + center(); + + return TRUE; +} + +void LLFloaterModelWizard::draw() +{ + LLFloater::draw(); + LLRect r = getRect(); + + mModelPreview->update(); + + if (mModelPreview && mModelPreview->mModelLoader) + { + gGL.color3f(1.f, 1.f, 1.f); + + gGL.getTexUnit(0)->bind(mModelPreview); + + + LLView* preview_panel = getChild<LLView>("preview_panel"); + + LLRect rect = preview_panel->getRect(); + if (rect != mPreviewRect) + { + mModelPreview->refresh(); + mPreviewRect = preview_panel->getRect(); + } + + LLRect item_rect; + preview_panel->localRectToOtherView(preview_panel->getLocalRect(), &item_rect, this); + + gGL.begin( LLRender::QUADS ); + { + gGL.texCoord2f(0.f, 1.f); + gGL.vertex2i(item_rect.mLeft, item_rect.mTop); + gGL.texCoord2f(0.f, 0.f); + gGL.vertex2i(item_rect.mLeft, item_rect.mBottom); + gGL.texCoord2f(1.f, 0.f); + gGL.vertex2i(item_rect.mRight, item_rect.mBottom); + gGL.texCoord2f(1.f, 1.f); + gGL.vertex2i(item_rect.mRight, item_rect.mTop); + } + gGL.end(); + + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + } +} diff --git a/indra/newview/llfloatermodelwizard.h b/indra/newview/llfloatermodelwizard.h new file mode 100644 index 0000000000..c766697d47 --- /dev/null +++ b/indra/newview/llfloatermodelwizard.h @@ -0,0 +1,58 @@ +/** + * @file llfloatermodelwizard.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 LLFLOATERMODELWIZARD_H +#define LLFLOATERMODELWIZARD_H + +class LLModelPreview; + +class LLFloaterModelWizard : public LLFloater +{ +public: + LLFloaterModelWizard(const LLSD& key); + virtual ~LLFloaterModelWizard() {}; + /*virtual*/ BOOL postBuild(); + void draw(); + void loadModel(); + //void onSave(); + //void onReset(); + //void onCancel(); + ///*virtual*/ void onOpen(const LLSD& key); + +private: + + LLModelPreview* mModelPreview; + LLRect mPreviewRect; +}; +/* +namespace LLFloaterDisplayNameUtil +{ + // Register with LLFloaterReg + void registerFloater(); +} +*/ + + +#endif diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index 42dc60f9e0..29af81d64c 100644 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -174,6 +174,7 @@ BOOL LLFloaterNotificationConsole::postBuild() // these are in the order of processing addChannel("Unexpired"); addChannel("Ignore"); + addChannel("VisibilityRules"); addChannel("Visible", true); // all the ones below attach to the Visible channel addChannel("Persistent"); diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp index e8e9f76912..054ab4538b 100644 --- a/indra/newview/llfloaterpostcard.cpp +++ b/indra/newview/llfloaterpostcard.cpp @@ -112,11 +112,14 @@ LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLView // Take the images from the caller // It's now our job to clean them up LLFloaterPostcard* instance = LLFloaterReg::showTypedInstance<LLFloaterPostcard>("postcard", LLSD(img->getID())); - - instance->mJPEGImage = jpeg; - instance->mViewerImage = img; - instance->mImageScale = image_scale; - instance->mPosTakenGlobal = pos_taken_global; + + if (instance) // may be 0 if we're in mouselook mode + { + instance->mJPEGImage = jpeg; + instance->mViewerImage = img; + instance->mImageScale = image_scale; + instance->mPosTakenGlobal = pos_taken_global; + } return instance; } @@ -128,6 +131,8 @@ void LLFloaterPostcard::draw() if(!isMinimized() && mViewerImage.notNull() && mJPEGImage.notNull()) { + // Force the texture to be 100% opaque when the floater is focused. + F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); LLRect rect(getRect()); // first set the max extents of our preview @@ -149,7 +154,7 @@ void LLFloaterPostcard::draw() } { gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f)); + gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f) % alpha); rect.stretch(-1); } { @@ -164,7 +169,7 @@ void LLFloaterPostcard::draw() rect.getWidth(), rect.getHeight(), mViewerImage.get(), - LLColor4::white); + LLColor4::white % alpha); } glMatrixMode(GL_TEXTURE); glPopMatrix(); @@ -361,9 +366,7 @@ void LLFloaterPostcard::sendPostcard() { gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE); } - - // give user feedback of the event - gViewerWindow->playSnapshotAnimAndSound(); + LLUploadDialog::modalUploadDialog(getString("upload_message")); // don't destroy the window until the upload is done diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index 2bea3d37ff..e9f66813af 100644 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -282,7 +282,9 @@ std::string LLFloaterPreference::sSkin = ""; LLFloaterPreference::LLFloaterPreference(const LLSD& key) : LLFloater(key), mGotPersonalInfo(false), - mOriginalIMViaEmail(false) + mOriginalIMViaEmail(false), + mLanguageChanged(false), + mDoubleClickActionDirty(false) { //Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>); @@ -320,6 +322,8 @@ 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"); @@ -338,14 +342,20 @@ BOOL LLFloaterPreference::postBuild() gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2)); + gSavedSettings.getControl("ChatBubbleOpacity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onNameTagOpacityChange, this, _2)); + LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core"); 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, ""); setCacheLocation(cache_location); + getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this)); + // if floater is opened before login set default localized busy message if (LLStartUp::getStartupState() < STATE_STARTED) { @@ -475,6 +485,12 @@ void LLFloaterPreference::apply() gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility); } } + + if (mDoubleClickActionDirty) + { + updateDoubleClickSettings(); + mDoubleClickActionDirty = false; + } } void LLFloaterPreference::cancel() @@ -501,6 +517,12 @@ void LLFloaterPreference::cancel() // reverts any changes to current skin gSavedSettings.setString("SkinCurrent", sSkin); + + if (mDoubleClickActionDirty) + { + updateDoubleClickControls(); + mDoubleClickActionDirty = false; + } } void LLFloaterPreference::onOpen(const LLSD& key) @@ -553,6 +575,9 @@ void LLFloaterPreference::onOpen(const LLSD& key) getChildView("maturity_desired_combobox")->setVisible( false); } + // Forget previous language changes. + mLanguageChanged = false; + // Display selected maturity icons. onChangeMaturity(); @@ -710,6 +735,28 @@ void LLFloaterPreference::onClickBrowserClearCache() LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache); } +// Called when user changes language via the combobox. +void LLFloaterPreference::onLanguageChange() +{ + // Let the user know that the change will only take effect after restart. + // Do it only once so that we're not too irritating. + if (!mLanguageChanged) + { + LLNotificationsUtil::add("ChangeLanguage"); + mLanguageChanged = true; + } +} + +void LLFloaterPreference::onNameTagOpacityChange(const LLSD& newvalue) +{ + LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("background"); + if (color_swatch) + { + LLColor4 new_color = color_swatch->get(); + color_swatch->set( new_color.setAlpha(newvalue.asReal()) ); + } +} + void LLFloaterPreference::onClickSetCache() { std::string cur_name(gSavedSettings.getString("CacheLocation")); @@ -803,7 +850,7 @@ void LLFloaterPreference::buildPopupLists() LLScrollListItem* item = NULL; - bool show_popup = formp->getIgnored(); + bool show_popup = !formp->getIgnored(); if (!show_popup) { if (ignore == LLNotificationForm::IGNORE_WITH_LAST_RESPONSE) @@ -903,8 +950,7 @@ void LLFloaterPreference::refreshEnabledState() //Deferred/SSAO/Shadows LLCheckBoxCtrl* ctrl_deferred = getChild<LLCheckBoxCtrl>("UseLightShaders"); - if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderUseFBO") && - LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && + if (LLFeatureManager::getInstance()->isFeatureAvailable("RenderDeferred") && shaders) { BOOL enabled = (ctrl_wind_light->get()) ? TRUE : FALSE; @@ -1155,7 +1201,7 @@ void LLFloaterPreference::onClickDisablePopup() for (itor = items.begin(); itor != items.end(); ++itor) { LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate(*(std::string*)((*itor)->getUserdata())); - templatep->mForm->setIgnored(false); + templatep->mForm->setIgnored(true); } buildPopupLists(); @@ -1169,7 +1215,7 @@ void LLFloaterPreference::resetAllIgnored() { if (iter->second->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) { - iter->second->mForm->setIgnored(true); + iter->second->mForm->setIgnored(false); } } } @@ -1182,7 +1228,7 @@ void LLFloaterPreference::setAllIgnored() { if (iter->second->mForm->getIgnoreType() != LLNotificationForm::IGNORE_NO) { - iter->second->mForm->setIgnored(false); + iter->second->mForm->setIgnored(true); } } } @@ -1246,7 +1292,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); @@ -1318,6 +1364,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) { diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index e99731b92e..0f51189853 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -83,6 +83,8 @@ protected: void onBtnApply(); void onClickBrowserClearCache(); + void onLanguageChange(); + void onNameTagOpacityChange(const LLSD& newvalue); // set value of "BusyResponseChanged" in account settings depending on whether busy response // string differs from default after user changes. @@ -95,6 +97,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. @@ -145,8 +155,12 @@ 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; + bool mLanguageChanged; bool mOriginalHideOnlineStatus; std::string mDirectoryVisibility; diff --git a/indra/newview/llfloaterregiondebugconsole.cpp b/indra/newview/llfloaterregiondebugconsole.cpp index 19a9ef54a8..b3b7645dd4 100644 --- a/indra/newview/llfloaterregiondebugconsole.cpp +++ b/indra/newview/llfloaterregiondebugconsole.cpp @@ -3,25 +3,31 @@ * @author Brad Kittenbrink <brad@lindenlab.com> * @brief Quick and dirty console for region debug settings * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. + * $LicenseInfo:firstyear=2010&license=viewergpl$ + * + * Copyright (c) 2010-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. + * 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 * - * 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. + * 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 * - * 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 + * 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. * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 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. * $/LicenseInfo$ */ @@ -31,34 +37,120 @@ #include "llagent.h" #include "llhttpclient.h" +#include "llhttpnode.h" #include "lllineeditor.h" #include "lltexteditor.h" #include "llviewerregion.h" -class Responder : public LLHTTPClient::Responder { -public: - Responder(LLTextEditor *output) : mOutput(output) - { - } - - /*virtual*/ - void error(U32 status, const std::string& reason) - { - } - - /*virtual*/ - void result(const LLSD& content) - { - std::string text = content.asString() + "\n\n> "; - mOutput->appendText(text, false); - }; - - LLTextEditor * mOutput; -}; +// 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() @@ -71,17 +163,21 @@ BOOL LLFloaterRegionDebugConsole::postBuild() mOutput = getChild<LLTextEditor>("region_debug_console_output"); - std::string url = gAgent.getRegion()->getCapability("SimConsole"); - if ( url.size() == 0 ) - { - mOutput->appendText("This region does not support the simulator console.\n\n> ", false); - } - else + std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + if (url.empty()) { - mOutput->appendText("> ", false); + // 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; } @@ -90,20 +186,42 @@ 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("SimConsole"); - - if ( url.size() > 0 ) + std::string url = gAgent.getRegion()->getCapability("SimConsoleAsync"); + if (url.empty()) { - LLHTTPClient::post(url, LLSD(input->getText()), new ::Responder(mOutput)); + // 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 { - text += "\nError: No console available for this region/simulator.\n\n> "; + // 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 index 72ca919a25..3aa525724e 100644 --- a/indra/newview/llfloaterregiondebugconsole.h +++ b/indra/newview/llfloaterregiondebugconsole.h @@ -28,6 +28,8 @@ #ifndef LL_LLFLOATERREGIONDEBUGCONSOLE_H #define LL_LLFLOATERREGIONDEBUGCONSOLE_H +#include <boost/signals2.hpp> + #include "llfloater.h" #include "llhttpclient.h" @@ -37,6 +39,7 @@ class LLFloaterRegionDebugConsole : public LLFloater, public LLHTTPClient::Respo { public: LLFloaterRegionDebugConsole(LLSD const & key); + virtual ~LLFloaterRegionDebugConsole(); // virtual BOOL postBuild(); @@ -44,6 +47,11 @@ public: 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/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 36e8ad9dfc..1aba5ef92f 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -908,6 +908,8 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) previewp->mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal(); previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame } + + gViewerWindow->playSnapshotAnimAndSound(); } previewp->getWindow()->decBusyCount(); // only show fullscreen preview when in freeze frame mode @@ -1004,7 +1006,6 @@ void LLSnapshotLivePreview::saveTexture() LLFloaterPerms::getEveryonePerms(), "Snapshot : " + pos_string, callback, expected_upload_cost, userdata); - gViewerWindow->playSnapshotAnimAndSound(); } else { @@ -1026,10 +1027,6 @@ BOOL LLSnapshotLivePreview::saveLocal() mDataSize = 0; updateSnapshot(FALSE, FALSE); - if(success) - { - gViewerWindow->playSnapshotAnimAndSound(); - } return success; } @@ -1049,8 +1046,6 @@ void LLSnapshotLivePreview::saveWeb() LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, jpg, metadata, _1, _2, _3, _4)); - - gViewerWindow->playSnapshotAnimAndSound(); } void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& metadata, const std::string& name, S32 x, S32 y, S32 z) @@ -1212,8 +1207,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; } @@ -2191,9 +2184,11 @@ void LLFloaterSnapshot::draw() S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; glMatrixMode(GL_MODELVIEW); + // Apply floater transparency to the texture unless the floater is focused. + F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); gl_draw_scaled_image(offset_x, offset_y, previewp->getThumbnailWidth(), previewp->getThumbnailHeight(), - previewp->getThumbnailImage(), LLColor4::white); + previewp->getThumbnailImage(), LLColor4::white % alpha); previewp->drawPreviewRect(offset_x, offset_y) ; } diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index 5dc8067648..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 @@ -480,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 @@ -597,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; @@ -634,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) } @@ -642,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) } @@ -650,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) } @@ -658,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) } @@ -667,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) } @@ -998,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/llglsandbox.cpp b/indra/newview/llglsandbox.cpp index d43b3a5d6e..842911ecc0 100644 --- a/indra/newview/llglsandbox.cpp +++ b/indra/newview/llglsandbox.cpp @@ -663,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; @@ -709,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; diff --git a/indra/newview/llhints.cpp b/indra/newview/llhints.cpp index 3f0deb98cd..c4dcaf11f9 100644 --- a/indra/newview/llhints.cpp +++ b/indra/newview/llhints.cpp @@ -33,6 +33,7 @@ #include "lltextbox.h" #include "llviewerwindow.h" #include "llviewercontrol.h" +#include "lliconctrl.h" #include "llsdparam.h" class LLHintPopup : public LLPanel @@ -80,7 +81,8 @@ public: up_arrow, right_arrow, down_arrow, - lower_left_arrow; + lower_left_arrow, + hint_image; Optional<S32> left_arrow_offset, up_arrow_offset, @@ -96,6 +98,7 @@ public: right_arrow("right_arrow"), down_arrow("down_arrow"), lower_left_arrow("lower_left_arrow"), + hint_image("hint_image"), left_arrow_offset("left_arrow_offset"), up_arrow_offset("up_arrow_offset"), right_arrow_offset("right_arrow_offset"), @@ -166,7 +169,15 @@ LLHintPopup::LLHintPopup(const LLHintPopup::Params& p) mDirection = p.target_params.direction; mTarget = p.target_params.target; } - buildFromFile( "panel_hint.xml", NULL, p); + if (p.hint_image.isProvided()) + { + buildFromFile("panel_hint_image.xml", NULL, p); + getChild<LLIconCtrl>("hint_image")->setImage(p.hint_image()); + } + else + { + buildFromFile( "panel_hint.xml", NULL, p); + } } BOOL LLHintPopup::postBuild() diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp index 85221e64d8..7e1025c41b 100644 --- a/indra/newview/llhudicon.cpp +++ b/indra/newview/llhudicon.cpp @@ -202,11 +202,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 8d7b8d4288..644daa0299 100644 --- a/indra/newview/llhudicon.h +++ b/indra/newview/llhudicon.h @@ -52,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/llhudobject.cpp b/indra/newview/llhudobject.cpp index 09200ee5be..5e762ee037 100644 --- a/indra/newview/llhudobject.cpp +++ b/indra/newview/llhudobject.cpp @@ -284,27 +284,6 @@ void LLHUDObject::renderAll() } // static -void LLHUDObject::renderAllForSelect() -{ - 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->renderForSelect(); - } - } -} - -// static void LLHUDObject::renderAllForTimer() { LLHUDObject *hud_objp; diff --git a/indra/newview/llhudobject.h b/indra/newview/llhudobject.h index 4282ade34d..33e6394445 100644 --- a/indra/newview/llhudobject.h +++ b/indra/newview/llhudobject.h @@ -104,7 +104,6 @@ protected: ~LLHUDObject(); virtual void render() = 0; - virtual void renderForSelect() {}; virtual void renderForTimer() {}; protected: diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp index 6a423e529a..24a876c59a 100644 --- a/indra/newview/llhudtext.cpp +++ b/indra/newview/llhudtext.cpp @@ -113,36 +113,21 @@ 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 - if (for_select) - { - return; - } - 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; @@ -209,9 +194,6 @@ void LLHUDText::renderText(BOOL for_select) mRadius = (width_vec + height_vec).magVec() * 0.5f; - LLCoordGL screen_pos; - LLViewerCamera::getInstance()->projectPosAgentToScreen(mPositionAgent, screen_pos, FALSE); - LLVector2 screen_offset; screen_offset = mPositionOffset; @@ -594,7 +576,7 @@ void LLHUDText::renderAllHUD() for (text_it = sVisibleHUDTextObjects.begin(); text_it != sVisibleHUDTextObjects.end(); ++text_it) { - (*text_it)->renderText(FALSE); + (*text_it)->renderText(); } } diff --git a/indra/newview/llhudtext.h b/indra/newview/llhudtext.h index f05ee4d594..36015d51f0 100644 --- a/indra/newview/llhudtext.h +++ b/indra/newview/llhudtext.h @@ -128,8 +128,7 @@ protected: LLHUDText(const U8 type); /*virtual*/ void render(); - /*virtual*/ void renderForSelect(); - void renderText(BOOL for_select); + void renderText(); static void updateAll(); S32 getMaxLines(); diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index e000abda2a..bdc0dfa7e2 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -680,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; diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index 857c27be63..ce305dcd89 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -279,9 +279,27 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& void LLIMModel::LLIMSession::onAdHocNameCache(const LLAvatarName& av_name) { - LLStringUtil::format_map_t args; - args["[AGENT_NAME]"] = av_name.getCompleteName(); - LLTrans::findString(mName, "conference-title-incoming", args); + if (av_name.mIsDummy) + {
+ 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());
+
+ // additional check that session name is what we expected
+ if ("Conference" == conference_word)
+ {
+ LLStringUtil::format_map_t args;
+ args["[AGENT_NAME]"] = name;
+ LLTrans::findString(mName, "conference-title-incoming", args);
+ }
+ } + else + { + LLStringUtil::format_map_t args; + 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) @@ -537,15 +555,14 @@ bool LLIMModel::LLIMSession::isOtherParticipantAvaline() void LLIMModel::LLIMSession::onAvatarNameCache(const LLUUID& avatar_id, const LLAvatarName& av_name) { - if (av_name.mLegacyFirstName.empty()) + if (av_name.mUsername.empty()) { - // if mLegacyFirstName is empty it means display names is off and the - // data came from the gCacheName, mDisplayName will be the legacy name - mHistoryFileName = LLCacheName::cleanFullName(av_name.mDisplayName); + // display names is off, use mDisplayName which will be the legacy name + mHistoryFileName = LLCacheName::buildUsername(av_name.mDisplayName); } else { - mHistoryFileName = LLCacheName::cleanFullName(av_name.getLegacyName()); + mHistoryFileName = av_name.mUsername; } } @@ -556,7 +573,12 @@ void LLIMModel::LLIMSession::buildHistoryFileName() //ad-hoc requires sophisticated chat history saving schemes if (isAdHoc()) { - //in case of outgoing ad-hoc sessions + /* in case of outgoing ad-hoc sessions we need to make specilized names + * if this naming system is ever changed then the filtering definitions in + * lllogchat.cpp need to be change acordingly so that the filtering for the + * date stamp code introduced in STORM-102 will work properly and not add + * a date stamp to the Ad-hoc conferences. + */ if (mInitialTargetIDs.size()) { std::set<LLUUID> sorted_uuids(mInitialTargetIDs.begin(), mInitialTargetIDs.end()); @@ -2085,7 +2107,7 @@ void LLIncomingCallDialog::onOpen(const LLSD& key) void LLIncomingCallDialog::onAccept(void* user_data) { LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data; - self->processCallResponse(0); + processCallResponse(0, self->mPayload); self->closeFloater(); } @@ -2093,7 +2115,7 @@ void LLIncomingCallDialog::onAccept(void* user_data) void LLIncomingCallDialog::onReject(void* user_data) { LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data; - self->processCallResponse(1); + processCallResponse(1, self->mPayload); self->closeFloater(); } @@ -2101,20 +2123,21 @@ void LLIncomingCallDialog::onReject(void* user_data) void LLIncomingCallDialog::onStartIM(void* user_data) { LLIncomingCallDialog* self = (LLIncomingCallDialog*)user_data; - self->processCallResponse(2); + processCallResponse(2, self->mPayload); self->closeFloater(); } -void LLIncomingCallDialog::processCallResponse(S32 response) +// static +void LLIncomingCallDialog::processCallResponse(S32 response, const LLSD &payload) { if (!gIMMgr || gDisconnected) return; - LLUUID session_id = mPayload["session_id"].asUUID(); - LLUUID caller_id = mPayload["caller_id"].asUUID(); - std::string session_name = mPayload["session_name"].asString(); - EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger(); - LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)mPayload["inv_type"].asInteger(); + LLUUID session_id = payload["session_id"].asUUID(); + LLUUID caller_id = payload["caller_id"].asUUID(); + std::string session_name = payload["session_name"].asString(); + EInstantMessage type = (EInstantMessage)payload["type"].asInteger(); + LLIMMgr::EInvitationType inv_type = (LLIMMgr::EInvitationType)payload["inv_type"].asInteger(); bool voice = true; switch(response) { @@ -2131,8 +2154,8 @@ void LLIncomingCallDialog::processCallResponse(S32 response) session_id = gIMMgr->addP2PSession( session_name, caller_id, - mPayload["session_handle"].asString(), - mPayload["session_uri"].asString()); + payload["session_handle"].asString(), + payload["session_uri"].asString()); if (voice) { @@ -2166,7 +2189,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response) LLAvatarName av_name; if (LLAvatarNameCache::get(caller_id, &av_name)) { - correct_session_name = av_name.mDisplayName + " (" + av_name.mUsername + ")"; + correct_session_name = av_name.getCompleteName(); correct_session_name.append(ADHOC_NAME_SUFFIX); } } @@ -2196,10 +2219,10 @@ void LLIncomingCallDialog::processCallResponse(S32 response) inv_type)); // send notification message to the corresponding chat - if (mPayload["notify_box_type"].asString() == "VoiceInviteGroup" || mPayload["notify_box_type"].asString() == "VoiceInviteAdHoc") + if (payload["notify_box_type"].asString() == "VoiceInviteGroup" || payload["notify_box_type"].asString() == "VoiceInviteAdHoc") { LLStringUtil::format_map_t string_args; - string_args["[NAME]"] = mPayload["caller_name"].asString(); + string_args["[NAME]"] = payload["caller_name"].asString(); std::string message = LLTrans::getString("name_started_call", string_args); LLIMModel::getInstance()->addMessageSilently(session_id, SYSTEM_FROM, LLUUID::null, message); } @@ -2216,7 +2239,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response) { if(LLVoiceClient::getInstance()) { - std::string s = mPayload["session_handle"].asString(); + std::string s = payload["session_handle"].asString(); LLVoiceClient::getInstance()->declineInvite(s); } } @@ -2623,16 +2646,19 @@ void LLIMMgr::inviteToSession( std::string question_type = "VoiceInviteQuestionDefault"; BOOL ad_hoc_invite = FALSE; + BOOL voice_invite = FALSE; if(type == IM_SESSION_P2P_INVITE) { //P2P is different...they only have voice invitations notify_box_type = "VoiceInviteP2P"; + voice_invite = TRUE; } else if ( gAgent.isInGroup(session_id) ) { //only really old school groups have voice invitations notify_box_type = "VoiceInviteGroup"; question_type = "VoiceInviteQuestionGroup"; + voice_invite = TRUE; } else if ( inv_type == INVITATION_TYPE_VOICE ) { @@ -2640,6 +2666,7 @@ void LLIMMgr::inviteToSession( //and a voice ad-hoc notify_box_type = "VoiceInviteAdHoc"; ad_hoc_invite = TRUE; + voice_invite = TRUE; } else if ( inv_type == INVITATION_TYPE_IMMEDIATE ) { @@ -2663,23 +2690,21 @@ void LLIMMgr::inviteToSession( if (channelp && channelp->callStarted()) { // you have already started a call to the other user, so just accept the invite - LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 0); + LLIncomingCallDialog::processCallResponse(0, payload); return; } - if (type == IM_SESSION_P2P_INVITE || ad_hoc_invite) + if (voice_invite) { - // is the inviter a friend? - if (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL) + if ( // if we're rejecting all incoming call requests + gSavedSettings.getBOOL("VoiceCallsRejectAll") + // or we're rejecting non-friend voice calls and this isn't a friend + || (gSavedSettings.getBOOL("VoiceCallsFriendsOnly") && (LLAvatarTracker::instance().getBuddyInfo(caller_id) == NULL)) + ) { - // if not, and we are ignoring voice invites from non-friends - // then silently decline - if (gSavedSettings.getBOOL("VoiceCallsFriendsOnly")) - { - // invite not from a friend, so decline - LLNotifications::instance().forceResponse(LLNotification::Params("VoiceInviteP2P").payload(payload), 1); - return; - } + // silently decline the call + LLIncomingCallDialog::processCallResponse(1, payload); + return; } } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 650d329e18..e765a8da2f 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -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 @@ -542,6 +542,7 @@ public: static void onReject(void* user_data); static void onStartIM(void* user_data); + static void processCallResponse(S32 response, const LLSD& payload); private: void setCallerName(const std::string& ui_title, const std::string& ui_label, @@ -551,7 +552,6 @@ private: const std::string& call_type); /*virtual*/ void onLifetimeExpired(); - void processCallResponse(S32 response); }; class LLOutgoingCallDialog : public LLCallDialog diff --git a/indra/newview/llinventorylistitem.cpp b/indra/newview/llinventorylistitem.cpp index 225d0288a9..3e0849a795 100644 --- a/indra/newview/llinventorylistitem.cpp +++ b/indra/newview/llinventorylistitem.cpp @@ -97,7 +97,8 @@ void LLPanelInventoryListItemBase::draw() LLRect separator_rect = getLocalRect(); separator_rect.mTop = separator_rect.mBottom; separator_rect.mBottom -= mSeparatorImage->getHeight(); - mSeparatorImage->draw(separator_rect); + F32 alpha = getCurrentTransparency(); + mSeparatorImage->draw(separator_rect, UI_VERTEX_COLOR % alpha); } LLPanel::draw(); diff --git a/indra/newview/lllistcontextmenu.cpp b/indra/newview/lllistcontextmenu.cpp index ea744072d2..6421ab42bf 100644 --- a/indra/newview/lllistcontextmenu.cpp +++ b/indra/newview/lllistcontextmenu.cpp @@ -36,7 +36,6 @@ #include "llviewermenu.h" // for LLViewerMenuHolderGL LLListContextMenu::LLListContextMenu() -: mMenu(NULL) { } @@ -51,23 +50,22 @@ LLListContextMenu::~LLListContextMenu() // of mMenu has already been deleted except of using LLHandle. EXT-4762. if (!mMenuHandle.isDead()) { - mMenu->die(); - mMenu = NULL; + mMenuHandle.get()->die(); } } void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y) { - if (mMenu) + LLContextMenu* menup = mMenuHandle.get(); + if (menup) { //preventing parent (menu holder) from deleting already "dead" context menus on exit - LLView* parent = mMenu->getParent(); + LLView* parent = menup->getParent(); if (parent) { - parent->removeChild(mMenu); + parent->removeChild(menup); } - delete mMenu; - mMenu = NULL; + delete menup; mUUIDs.clear(); } @@ -79,23 +77,23 @@ void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 mUUIDs.resize(uuids.size()); std::copy(uuids.begin(), uuids.end(), mUUIDs.begin()); - mMenu = createMenu(); - if (!mMenu) + menup = createMenu(); + if (!menup) { llwarns << "Context menu creation failed" << llendl; return; } - mMenuHandle = mMenu->getHandle(); - mMenu->show(x, y); - LLMenuGL::showPopup(spawning_view, mMenu, x, y); + mMenuHandle = menup->getHandle(); + menup->show(x, y); + LLMenuGL::showPopup(spawning_view, menup, x, y); } void LLListContextMenu::hide() { - if(mMenu) + if(mMenuHandle.get()) { - mMenu->hide(); + mMenuHandle.get()->hide(); } } diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h index 5dedc30b0c..fabd68ee20 100644 --- a/indra/newview/lllistcontextmenu.h +++ b/indra/newview/lllistcontextmenu.h @@ -71,8 +71,7 @@ protected: static void handleMultiple(functor_t functor, const uuid_vec_t& ids); uuid_vec_t mUUIDs; - LLContextMenu* mMenu; - LLHandle<LLView> mMenuHandle; + LLHandle<LLContextMenu> mMenuHandle; }; #endif // LL_LLLISTCONTEXTMENU_H diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 8c70b1e973..0121bbb1ed 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -89,6 +89,16 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+ */ const static boost::regex NAME_AND_TEXT("([^:]+[:]{1})?(\\s*)(.*)"); +/**
+ * These are recognizers for matching the names of ad-hoc conferences when generating the log file name
+ * On invited side, an ad-hoc is named like "<first name> <last name> Conference 2010/11/19 03:43 f0f4"
+ * On initiating side, an ad-hoc is named like Ad-hoc Conference hash<hash>"
+ * If the naming system for ad-hoc conferences are change in LLIMModel::LLIMSession::buildHistoryFileName()
+ * then these definition need to be adjusted as well.
+ */
+const static boost::regex INBOUND_CONFERENCE("^[a-zA-Z]{1,31} [a-zA-Z]{1,31} Conference [0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2} [0-9a-f]{4}");
+const static boost::regex OUTBOUND_CONFERENCE("^Ad-hoc Conference hash[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}");
+ //is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st" const static std::string NAME_TEXT_DIVIDER(": "); @@ -182,15 +192,43 @@ private: //static std::string LLLogChat::makeLogFileName(std::string filename) { + /** + * Testing for in bound and out bound ad-hoc file names + * if it is then skip date stamping. + **/ + //LL_INFOS("") << "Befor:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ + boost::match_results<std::string::const_iterator> matches; + bool inboundConf = boost::regex_match(filename, matches, INBOUND_CONFERENCE); + bool outboundConf = boost::regex_match(filename, matches, OUTBOUND_CONFERENCE); + if (!(inboundConf || outboundConf)) + { + 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; + } + } + //LL_INFOS("") << "After:" << filename << LL_ENDL;/* uncomment if you want to verify step, delete on commit */ filename = cleanFileName(filename); filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_ACCOUNT_CHAT_LOGS,filename); filename += ".txt"; + //LL_INFOS("") << "Full:" << 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) { @@ -354,10 +392,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; @@ -544,3 +591,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 6958d56311..27752452c9 100644 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -41,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, diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index 029e700c4c..0546803784 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -42,6 +42,7 @@ // newview #include "llviewernetwork.h" #include "llviewercontrol.h" +#include "llversioninfo.h" #include "llslurl.h" #include "llstartup.h" #include "llfloaterreg.h" @@ -149,6 +150,7 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia requested_options.append("newuser-config"); requested_options.append("ui-config"); #endif + requested_options.append("max-agent-groups"); requested_options.append("map-server-url"); requested_options.append("voice-config"); requested_options.append("tutorial_setting"); @@ -181,9 +183,10 @@ void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credentia request_params["read_critical"] = false; // handleTOSResponse request_params["last_exec_event"] = mLastExecEvent; request_params["mac"] = hashed_unique_id_string; - request_params["version"] = gCurrentVersion; // Includes channel name - request_params["channel"] = gSavedSettings.getString("VersionChannelName"); + request_params["version"] = LLVersionInfo::getChannelAndVersion(); // Includes channel name + request_params["channel"] = LLVersionInfo::getChannel(); request_params["id0"] = mSerialNumber; + request_params["host_id"] = gSavedSettings.getString("HostID"); mRequestData.clear(); mRequestData["method"] = "login_to_simulator"; diff --git a/indra/newview/llmainlooprepeater.cpp b/indra/newview/llmainlooprepeater.cpp new file mode 100644 index 0000000000..5c020e6d98 --- /dev/null +++ b/indra/newview/llmainlooprepeater.cpp @@ -0,0 +1,88 @@ +/** + * @file llmachineid.cpp + * @brief retrieves unique machine ids + * + * $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$ + */ + +#include "llviewerprecompiledheaders.h" +#include "llapr.h" +#include "llevents.h" +#include "llmainlooprepeater.h" + + + +// LLMainLoopRepeater +//----------------------------------------------------------------------------- + + +LLMainLoopRepeater::LLMainLoopRepeater(void): + mQueue(0) +{ + ; // No op. +} + + +void LLMainLoopRepeater::start(void) +{ + if(mQueue != 0) return; + + mQueue = new LLThreadSafeQueue<LLSD>(gAPRPoolp, 1024); + mMainLoopConnection = LLEventPumps::instance(). + obtain("mainloop").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMainLoop, this, _1)); + mRepeaterConnection = LLEventPumps::instance(). + obtain("mainlooprepeater").listen(LLEventPump::inventName(), boost::bind(&LLMainLoopRepeater::onMessage, this, _1)); +} + + +void LLMainLoopRepeater::stop(void) +{ + mMainLoopConnection.release(); + mRepeaterConnection.release(); + + delete mQueue; + mQueue = 0; +} + + +bool LLMainLoopRepeater::onMainLoop(LLSD const &) +{ + LLSD message; + while(mQueue->tryPopBack(message)) { + std::string pump = message["pump"].asString(); + if(pump.length() == 0 ) continue; // No pump. + LLEventPumps::instance().obtain(pump).post(message["payload"]); + } + return false; +} + + +bool LLMainLoopRepeater::onMessage(LLSD const & event) +{ + try { + mQueue->pushFront(event); + } catch(LLThreadSafeQueueError & e) { + llwarns << "could not repeat message (" << e.what() << ")" << + event.asString() << LL_ENDL; + } + return false; +} diff --git a/indra/newview/llmainlooprepeater.h b/indra/newview/llmainlooprepeater.h new file mode 100644 index 0000000000..f84c0ca94c --- /dev/null +++ b/indra/newview/llmainlooprepeater.h @@ -0,0 +1,65 @@ +/** + * @file llmainlooprepeater.h + * @brief a service for repeating messages on the main loop. + * + * $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_LLMAINLOOPREPEATER_H +#define LL_LLMAINLOOPREPEATER_H + + +#include "llsd.h" +#include "llthreadsafequeue.h" + + +// +// A service which creates the pump 'mainlooprepeater' to which any thread can +// post a message that will be re-posted on the main loop. +// +// The posted message should contain two map elements: pump and payload. The +// pump value is a string naming the pump to which the message should be +// re-posted. The payload value is what will be posted to the designated pump. +// +class LLMainLoopRepeater: + public LLSingleton<LLMainLoopRepeater> +{ +public: + LLMainLoopRepeater(void); + + // Start the repeater service. + void start(void); + + // Stop the repeater service. + void stop(void); + +private: + LLTempBoundListener mMainLoopConnection; + LLTempBoundListener mRepeaterConnection; + LLThreadSafeQueue<LLSD> * mQueue; + + bool onMainLoop(LLSD const &); + bool onMessage(LLSD const & event); +}; + + +#endif 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 e84c9152b1..0f66713ab0 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -70,7 +70,8 @@ LLMediaCtrl::Params::Params() caret_color("caret_color"), initial_mime_type("initial_mime_type"), media_id("media_id"), - trusted_content("trusted_content", false) + trusted_content("trusted_content", false), + focus_on_click("focus_on_click", true) { tab_stop(false); } @@ -86,7 +87,7 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) : mIgnoreUIScale( true ), mAlwaysRefresh( false ), mMediaSource( 0 ), - mTakeFocusOnClick( true ), + mTakeFocusOnClick( p.focus_on_click ), mCurrentNavUrl( "" ), mStretchToFill( true ), mMaintainAspectRatio ( true ), @@ -206,14 +207,6 @@ BOOL LLMediaCtrl::handleMouseUp( S32 x, S32 y, MASK mask ) if (mMediaSource) { mMediaSource->mouseUp(x, y, mask); - - // *HACK: LLMediaImplLLMozLib automatically takes focus on mouseup, - // in addition to the onFocusReceived() call below. Undo this. JC - if (!mTakeFocusOnClick) - { - mMediaSource->focus(false); - gViewerWindow->focusClient(); - } } gFocusMgr.setMouseCapture( NULL ); diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 65dfbbff78..96bb0c1df5 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -53,7 +53,8 @@ public: ignore_ui_scale, hide_loading, decouple_texture_size, - trusted_content; + trusted_content, + focus_on_click; Optional<S32> texture_width, texture_height; diff --git a/indra/newview/llmeshreduction.cpp b/indra/newview/llmeshreduction.cpp index b50b4cf063..14e8dd37b4 100644 --- a/indra/newview/llmeshreduction.cpp +++ b/indra/newview/llmeshreduction.cpp @@ -32,19 +32,8 @@ #include "glod/glod.h" -static BOOL stop_gloderror() -{ - GLuint error = glodGetError(); - - if (error != GLOD_NO_ERROR) - { - llwarns << "GLOD error detected: " << std::hex << error << llendl; - return TRUE; - } - - return FALSE; -} +#if 0 //not used ? void create_vertex_buffers_from_model(LLModel* model, std::vector<LLPointer <LLVertexBuffer> >& vertex_buffers) { @@ -280,4 +269,4 @@ LLPointer<LLModel> LLMeshReduction::reduce(LLModel* in_model, F32 limit, S32 mod return out_model; } - +#endif diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index 1ff11f2c01..0ee0d8393e 100755 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -108,47 +108,6 @@ U32 get_volume_memory_size(const LLVolume* volume) return indices*2+vertices*11+sizeof(LLVolume)+sizeof(LLVolumeFace)*volume->getNumVolumeFaces(); } -std::string scrub_host_name(std::string http_url) -{ //curl loves to abuse the DNS cache, so scrub host names out of urls where trivial to prevent DNS timeouts - - if (http_url.empty()) - { - return http_url; - } - // Not safe to scrub amazon paths - if (http_url.find("s3.amazonaws.com") != std::string::npos) - { - return http_url; - } - std::string::size_type begin_host = http_url.find("://")+3; - std::string host_string = http_url.substr(begin_host); - - std::string::size_type end_host = host_string.find(":"); - if (end_host == std::string::npos) - { - end_host = host_string.find("/"); - } - - host_string = host_string.substr(0, end_host); - - std::string::size_type idx = http_url.find(host_string); - - hostent* ent = gethostbyname(host_string.c_str()); - - if (ent && ent->h_length > 0) - { - U8* addr = (U8*) ent->h_addr_list[0]; - - std::string ip_string = llformat("%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); - if (!ip_string.empty() && !host_string.empty() && idx != std::string::npos) - { - http_url.replace(idx, host_string.length(), ip_string); - } - } - - return http_url; -} - LLVertexBuffer* get_vertex_buffer_from_mesh(LLCDMeshData& mesh, F32 scale = 1.f) { LLVertexBuffer* buff = new LLVertexBuffer(LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_NORMAL, 0); @@ -828,7 +787,7 @@ bool LLMeshRepoThread::fetchMeshDecomposition(const LLUUID& mesh_id) { ++sActiveLODRequests; LLMeshRepository::sHTTPRequestCount++; - mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size, + mCurlRequest->getByteRange(http_url, headers, offset, size, new LLMeshDecompositionResponder(mesh_id, offset, size)); } } @@ -900,7 +859,7 @@ bool LLMeshRepoThread::fetchMeshPhysicsShape(const LLUUID& mesh_id) { ++sActiveLODRequests; LLMeshRepository::sHTTPRequestCount++; - mCurlRequest->getByteRange(constructUrl(mesh_id), headers, offset, size, + mCurlRequest->getByteRange(http_url, headers, offset, size, new LLMeshPhysicsShapeResponder(mesh_id, offset, size)); } } @@ -1425,9 +1384,6 @@ LLMeshUploadThread::LLMeshUploadThread(LLMeshUploadThread::instance_list& data, mUploadObjectAssetCapability = gAgent.getRegion()->getCapability("UploadObjectAsset"); mNewInventoryCapability = gAgent.getRegion()->getCapability("NewFileAgentInventoryVariablePrice"); - //mUploadObjectAssetCapability = scrub_host_name(mUploadObjectAssetCapability); - //mNewInventoryCapability = scrub_host_name(mNewInventoryCapability); - mOrigin += gAgent.getAtAxis() * scale.magVec(); } @@ -2321,7 +2277,6 @@ void LLMeshRepository::notifyLoadedMeshes() region_name = gAgent.getRegion()->getName(); mGetMeshCapability = gAgent.getRegion()->getCapability("GetMesh"); - mGetMeshCapability = scrub_host_name(mGetMeshCapability); } } @@ -2667,6 +2622,12 @@ void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail) LLPrimitive::sVolumeManager->unrefVolume(volume); } +bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id) +{ + LLSD mesh = mThread->getMeshHeader(mesh_id); + return mesh.has("physics_shape") && mesh["physics_shape"].has("size") && (mesh["physics_shape"]["size"].asInteger() > 0); +} + const LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id) { return mThread->getMeshHeader(mesh_id); @@ -3021,7 +2982,6 @@ void LLMeshUploadThread::priceResult(LLMeshUploadData& data, const LLSD& content { mPendingCost += content["upload_price"].asInteger(); data.mRSVP = content["rsvp"].asString(); - data.mRSVP = scrub_host_name(data.mRSVP); mConfirmedQ.push(data); } @@ -3030,7 +2990,6 @@ void LLMeshUploadThread::priceResult(LLTextureUploadData& data, const LLSD& cont { mPendingCost += content["upload_price"].asInteger(); data.mRSVP = content["rsvp"].asString(); - data.mRSVP = scrub_host_name(data.mRSVP); mConfirmedTextureQ.push(data); } diff --git a/indra/newview/llmeshrepository.h b/indra/newview/llmeshrepository.h index df00c6c7aa..8687ac750b 100644 --- a/indra/newview/llmeshrepository.h +++ b/indra/newview/llmeshrepository.h @@ -458,7 +458,8 @@ public: const LLMeshSkinInfo* getSkinInfo(const LLUUID& mesh_id); const LLMeshDecomposition* getDecomposition(const LLUUID& mesh_id); void fetchPhysicsShape(const LLUUID& mesh_id); - + bool hasPhysicsShape(const LLUUID& mesh_id); + void buildHull(const LLVolumeParams& params, S32 detail); const LLSD& getMeshHeader(const LLUUID& mesh_id); 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/llmoveview.cpp b/indra/newview/llmoveview.cpp index 6658e1d7e8..142ee40cc8 100644 --- a/indra/newview/llmoveview.cpp +++ b/indra/newview/llmoveview.cpp @@ -94,6 +94,7 @@ BOOL LLFloaterMove::postBuild() { setIsChrome(TRUE); setTitleVisible(TRUE); // restore title visibility after chrome applying + updateTransparency(TT_ACTIVE); // force using active floater transparency (STORM-730) LLDockableFloater::postBuild(); @@ -448,17 +449,20 @@ void LLFloaterMove::updatePosition() LLBottomTray* tray = LLBottomTray::getInstance(); if (!tray) return; - LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); + LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - //align centers of a button and a floater - S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; - - S32 y = 0; - if (!mModeActionsPanel->getVisible()) + if (movement_btn) { - y = mModeActionsPanel->getRect().getHeight(); + //align centers of a button and a floater + S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; + + S32 y = 0; + if (!mModeActionsPanel->getVisible()) + { + y = mModeActionsPanel->getRect().getHeight(); + } + setOrigin(x, y); } - setOrigin(x, y); } //static @@ -552,7 +556,7 @@ LLPanelStandStopFlying::LLPanelStandStopFlying() : } // static -inline LLPanelStandStopFlying* LLPanelStandStopFlying::getInstance() +LLPanelStandStopFlying* LLPanelStandStopFlying::getInstance() { static LLPanelStandStopFlying* panel = getStandStopFlyingPanel(); return panel; @@ -735,10 +739,18 @@ void LLPanelStandStopFlying::updatePosition() LLBottomTray* tray = LLBottomTray::getInstance(); if (!tray || mAttached) return; - LLButton* movement_btn = tray->getChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); + LLButton* movement_btn = tray->findChild<LLButton>(BOTTOM_TRAY_BUTTON_NAME); - // Align centers of the button and the panel. - S32 x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; + S32 x = 0; + if (movement_btn) + { + // Align centers of the button and the panel. + x = movement_btn->calcScreenRect().getCenterX() - getRect().getWidth()/2; + } + else + { + x = tray->calcScreenRect().getCenterX() - getRect().getWidth()/2; + } setOrigin(x, 0); } diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h index 330510814a..d64fdbe6a5 100644 --- a/indra/newview/llnamelistctrl.h +++ b/indra/newview/llnamelistctrl.h @@ -1,25 +1,25 @@ -/** +/** * @file llnamelistctrl.h * @brief A list of names, automatically refreshing from the name cache. * * $LicenseInfo:firstyear=2003&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$ */ @@ -34,7 +34,7 @@ class LLAvatarName; class LLNameListCtrl -: public LLScrollListCtrl, protected LLInstanceTracker<LLNameListCtrl> +: public LLScrollListCtrl, public LLInstanceTracker<LLNameListCtrl> { public: typedef enum e_name_type @@ -58,7 +58,7 @@ public: NameItem() : name("name"), target("target", INDIVIDUAL) - {} + {} }; struct NameColumn : public LLInitParam::Choice<NameColumn> @@ -83,7 +83,7 @@ protected: LLNameListCtrl(const Params&); friend class LLUICtrlFactory; public: - // Add a user to the list by name. It will be added, the name + // Add a user to the list by name. It will be added, the name // requested from the cache, and updated as necessary. void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null); @@ -92,7 +92,7 @@ public: /*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null); - // Add a user to the list by name. It will be added, the name + // Add a user to the list by name. It will be added, the name // requested from the cache, and updated as necessary. void addGroupNameItem(const LLUUID& group_id, EAddPosition pos = ADD_BOTTOM, BOOL enabled = TRUE); @@ -126,7 +126,7 @@ private: /** * LLNameListCtrl item - * + * * We don't use LLScrollListItem to be able to override getUUID(), which is needed * because the name list item value is not simply an UUID but a map (uuid, is_group). */ diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp index 58849393b4..e4f83ce6b9 100644 --- a/indra/newview/llnavigationbar.cpp +++ b/indra/newview/llnavigationbar.cpp @@ -276,9 +276,6 @@ LLNavigationBar::LLNavigationBar() // set a listener function for LoginComplete event LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLNavigationBar::handleLoginComplete, this)); - - // Necessary for focus movement among child controls - setFocusRoot(TRUE); } LLNavigationBar::~LLNavigationBar() diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 180695e40b..572eeb8fc7 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -365,3 +365,16 @@ BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask) mChatHistory->setFocus(TRUE); return LLDockableFloater::handleMouseDown(x, y, mask); } + +void LLNearbyChat::draw() +{ + // *HACK: Update transparency type depending on whether our children have focus. + // This is needed because this floater is chrome and thus cannot accept focus, so + // the transparency type setting code from LLFloater::setFocus() isn't reached. + if (getTransparencyType() != TT_DEFAULT) + { + setTransparencyType(hasFocus() ? TT_ACTIVE : TT_INACTIVE); + } + + LLDockableFloater::draw(); +} diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 1e62910385..2ea79797f8 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -48,6 +48,7 @@ public: bool onNearbyChatCheckContextMenuItem(const LLSD& userdata); virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual void draw(); // focus overrides /*virtual*/ void onFocusLost(); diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 932ad75f29..836ae9a0cf 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -94,15 +94,19 @@ public: LLGestureComboList::Params::Params() : combo_button("combo_button"), - combo_list("combo_list") + combo_list("combo_list"), + get_more("get_more", true), + view_all("view_all", true) { } LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p) -: LLUICtrl(p) - , mLabel(p.label) - , mViewAllItemIndex(0) - , mGetMoreItemIndex(0) +: LLUICtrl(p), + mLabel(p.label), + mViewAllItemIndex(-1), + mGetMoreItemIndex(-1), + mShowViewAll(p.view_all), + mShowGetMore(p.get_more) { LLBottomtrayButton::Params button_params = p.combo_button; button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT); @@ -286,12 +290,16 @@ void LLGestureComboList::refreshGestures() sortByName(); // store indices for Get More and View All items (idx is the index followed by the last added Gesture) - mGetMoreItemIndex = idx; - mViewAllItemIndex = idx + 1; - - // add Get More and View All items at the bottom - mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex)); - mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex)); + if (mShowGetMore) + { + mGetMoreItemIndex = idx; + mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex)); + } + if (mShowViewAll) + { + mViewAllItemIndex = idx + 1; + mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex)); + } // Insert label after sorting, at top, with separator below it mList->addSeparator(ADD_TOP); diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h index cc905736fd..033d1dd5a2 100644 --- a/indra/newview/llnearbychatbar.h +++ b/indra/newview/llnearbychatbar.h @@ -46,6 +46,8 @@ public: { Optional<LLBottomtrayButton::Params> combo_button; Optional<LLScrollListCtrl::Params> combo_list; + Optional<bool> get_more, + view_all; Params(); }; @@ -56,6 +58,8 @@ protected: LLGestureComboList(const Params&); std::vector<LLMultiGesture*> mGestures; std::string mLabel; + bool mShowViewAll; + bool mShowGetMore; LLSD::Integer mViewAllItemIndex; LLSD::Integer mGetMoreItemIndex; diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index d2ad78f140..cebfac86e7 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -121,7 +121,7 @@ protected: if (!toast) return; LL_DEBUGS("NearbyChat") << "Pooling toast" << llendl; toast->setVisible(FALSE); - toast->stopFading(); + toast->stopTimer(); toast->setIsHidden(true); // Nearby chat toasts that are hidden, not destroyed. They are collected to the toast pool, so that @@ -296,7 +296,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) { panel->addMessage(notification); toast->reshapeToPanel(); - toast->startFading(); + toast->startTimer(); arrangeToasts(); return; @@ -341,7 +341,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification) panel->init(notification); toast->reshapeToPanel(); - toast->startFading(); + toast->startTimer(); m_active_toasts.push_back(toast->getHandle()); @@ -382,7 +382,10 @@ void LLNearbyChatScreenChannel::showToastsBottom() return; LLRect toast_rect; - S32 bottom = getRect().mBottom; + updateBottom(); + S32 channel_bottom = getRect().mBottom; + + S32 bottom = channel_bottom; S32 margin = gSavedSettings.getS32("ToastGap"); //sort active toasts @@ -514,6 +517,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) } nearby_chat->addMessage(chat_msg, true, args); + + if(chat_msg.mSourceType == CHAT_SOURCE_AGENT + && chat_msg.mFromID.notNull() + && chat_msg.mFromID != gAgentID) + { + LLFirstUse::otherAvatarChatFirst(); + } + if( nearby_chat->getVisible() || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT && gSavedSettings.getBOOL("UseChatBubbles") ) ) @@ -573,13 +584,7 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args) notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ; 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/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 57180f63b5..1249d5d856 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -34,6 +34,7 @@ #include "llcombobox.h" #include "lldateutil.h" // ageFromDate() #include "llimview.h" +#include "llmenubutton.h" #include "llnotificationsutil.h" #include "lltexteditor.h" #include "lltexturectrl.h" @@ -479,7 +480,6 @@ BOOL LLPanelAvatarProfile::postBuild() childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL); childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL); childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL); - childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL); childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL); childSetCommitCallback("show_on_map_btn", (boost::bind( &LLPanelAvatarProfile::onMapButtonClick, this)), NULL); @@ -500,7 +500,8 @@ BOOL LLPanelAvatarProfile::postBuild() enable.add("Profile.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this)); enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this)); - mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + LLToggleableMenu* profile_menu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); + getChild<LLMenuButton>("overflow_btn")->setMenu(profile_menu, LLMenuButton::MP_TOP_RIGHT); LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this); @@ -752,23 +753,6 @@ void LLPanelAvatarProfile::onShareButtonClick() //*TODO not implemented } -void LLPanelAvatarProfile::onOverflowButtonClicked() -{ - if (!mProfileMenu->toggleVisibility()) - return; - - LLView* btn = getChild<LLView>("overflow_btn"); - - if (mProfileMenu->getButtonRect().isEmpty()) - { - mProfileMenu->setButtonRect(btn); - } - mProfileMenu->updateParent(LLMenuGL::sMenuContainer); - - LLRect rect = btn->getRect(); - LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop); -} - LLPanelAvatarProfile::~LLPanelAvatarProfile() { if(getAvatarId().notNull()) diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 11c7716322..71d9d0a95a 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -34,7 +34,6 @@ class LLComboBox; class LLLineEditor; -class LLToggleableMenu; enum EOnlineStatus { @@ -207,14 +206,11 @@ protected: void onCallButtonClick(); void onTeleportButtonClick(); void onShareButtonClick(); - void onOverflowButtonClicked(); private: typedef std::map< std::string,LLUUID> group_map_t; group_map_t mGroups; - - LLToggleableMenu* mProfileMenu; }; /** diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp index bce496cbad..07c7f35989 100644 --- a/indra/newview/llpanelface.cpp +++ b/indra/newview/llpanelface.cpp @@ -376,6 +376,11 @@ struct LLPanelFaceSetAlignedTEFunctor : public LLSelectedTEFunctor return true; } + if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te) + { + return true; + } + bool set_aligned = true; if (facep == mCenterFace) { @@ -418,6 +423,12 @@ struct LLPanelFaceGetIsAlignedTEFunctor : public LLSelectedTEFunctor { return false; } + + if (facep->getViewerObject()->getVolume()->getNumVolumeFaces() <= te) + { //volume face does not exist, can't be aligned + return false; + } + if (facep == mCenterFace) { return true; diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp index 87acd83b23..c57746ec00 100644 --- a/indra/newview/llpanellandmarkinfo.cpp +++ b/indra/newview/llpanellandmarkinfo.cpp @@ -180,6 +180,9 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type) populateFoldersList(); + // Prevent the floater from losing focus (if the sidepanel is undocked). + setFocus(TRUE); + LLPanelPlaceInfo::setInfoType(type); } @@ -330,6 +333,9 @@ void LLPanelLandmarkInfo::toggleLandmarkEditMode(BOOL enabled) // when it was enabled/disabled we set the text once again. mNotesEditor->setText(mNotesEditor->getText()); } + + // Prevent the floater from losing focus (if the sidepanel is undocked). + setFocus(TRUE); } const std::string& LLPanelLandmarkInfo::getLandmarkTitle() const diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index d25b8e0e02..e8c8273a9d 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -520,9 +520,6 @@ void LLLandmarksPanel::setParcelID(const LLUUID& parcel_id) { if (!parcel_id.isNull()) { - //ext-4655, defensive. remove now incase this gets called twice without a remove - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(parcel_id, this); - LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this); LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id); } diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 467aefc60f..2e4be78be1 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -163,8 +163,6 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mHtmlAvailable( TRUE ), mListener(new LLPanelLoginListener(this)) { - setFocusRoot(TRUE); - setBackgroundVisible(FALSE); setBackgroundOpaque(TRUE); @@ -181,8 +179,11 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, mPasswordModified = FALSE; LLPanelLogin::sInstance = this; - // add to front so we are the bottom-most child - gViewerWindow->getRootView()->addChildInBack(this); + LLView* login_holder = gViewerWindow->getLoginPanelHolder(); + if (login_holder) + { + login_holder->addChild(this); + } // Logo mLogoImage = LLUI::getUIImage("startup_logo"); @@ -230,7 +231,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect, getChild<LLPanel>("login")->setDefaultBtn("connect_btn"); - std::string channel = gSavedSettings.getString("VersionChannelName"); + std::string channel = LLVersionInfo::getChannel(); std::string version = llformat("%s (%d)", LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); @@ -761,7 +762,7 @@ void LLPanelLogin::closePanel() { if (sInstance) { - gViewerWindow->getRootView()->removeChild( LLPanelLogin::sInstance ); + LLPanelLogin::sInstance->getParent()->removeChild( LLPanelLogin::sInstance ); delete sInstance; sInstance = NULL; @@ -817,7 +818,7 @@ void LLPanelLogin::loadLoginPage() LLVersionInfo::getShortVersion().c_str(), LLVersionInfo::getBuild()); - char* curl_channel = curl_escape(gSavedSettings.getString("VersionChannelName").c_str(), 0); + char* curl_channel = curl_escape(LLVersionInfo::getChannel().c_str(), 0); char* curl_version = curl_escape(version.c_str(), 0); oStr << "&channel=" << curl_channel; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 904e3dabcc..116625b05d 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -329,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 ); @@ -375,6 +383,8 @@ void LLPanelMainInventory::setSortBy(const LLSD& userdata) gSavedSettings.setBOOL("Inventory.SystemFoldersToTop", TRUE ); } getActivePanel()->setSortOrder( order ); + + gSavedSettings.setU32("InventorySortOrder", order); } } @@ -725,6 +735,7 @@ void LLFloaterInventoryFinder::updateElementsFromFilter() getChild<LLUICtrl>("check_clothing")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_WEARABLE)); getChild<LLUICtrl>("check_gesture")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_GESTURE)); getChild<LLUICtrl>("check_landmark")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LANDMARK)); + getChild<LLUICtrl>("check_mesh")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_MESH)); getChild<LLUICtrl>("check_notecard")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_NOTECARD)); getChild<LLUICtrl>("check_object")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_OBJECT)); getChild<LLUICtrl>("check_script")->setValue((S32) (filter_types & 0x1 << LLInventoryType::IT_LSL)); @@ -776,6 +787,12 @@ void LLFloaterInventoryFinder::draw() filtered_by_all_types = FALSE; } + if (!getChild<LLUICtrl>("check_mesh")->getValue()) + { + filter &= ~(0x1 << LLInventoryType::IT_MESH); + filtered_by_all_types = FALSE; + } + if (!getChild<LLUICtrl>("check_notecard")->getValue()) { filter &= ~(0x1 << LLInventoryType::IT_NOTECARD); @@ -872,6 +889,7 @@ void LLFloaterInventoryFinder::selectAllTypes(void* user_data) self->getChild<LLUICtrl>("check_clothing")->setValue(TRUE); self->getChild<LLUICtrl>("check_gesture")->setValue(TRUE); self->getChild<LLUICtrl>("check_landmark")->setValue(TRUE); + self->getChild<LLUICtrl>("check_mesh")->setValue(TRUE); self->getChild<LLUICtrl>("check_notecard")->setValue(TRUE); self->getChild<LLUICtrl>("check_object")->setValue(TRUE); self->getChild<LLUICtrl>("check_script")->setValue(TRUE); @@ -891,6 +909,7 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data) self->getChild<LLUICtrl>("check_clothing")->setValue(FALSE); self->getChild<LLUICtrl>("check_gesture")->setValue(FALSE); self->getChild<LLUICtrl>("check_landmark")->setValue(FALSE); + self->getChild<LLUICtrl>("check_mesh")->setValue(FALSE); self->getChild<LLUICtrl>("check_notecard")->setValue(FALSE); self->getChild<LLUICtrl>("check_object")->setValue(FALSE); self->getChild<LLUICtrl>("check_script")->setValue(FALSE); @@ -915,6 +934,7 @@ 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<LLToggleableMenu>("menu_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance()); mGearMenuButton->setMenu(mMenuGearDefault); @@ -1000,6 +1020,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(); @@ -1173,6 +1198,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 d136e2d32e..c2b78ff9ea 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -136,6 +136,7 @@ protected: 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); /** diff --git a/indra/newview/llpanelobject.cpp b/indra/newview/llpanelobject.cpp index 4a1385134e..45e9a04fc2 100644 --- a/indra/newview/llpanelobject.cpp +++ b/indra/newview/llpanelobject.cpp @@ -67,6 +67,7 @@ #include "pipeline.h" #include "llviewercontrol.h" #include "lluictrlfactory.h" +#include "llmeshrepository.h" //#include "llfirstuse.h" #include "lldrawpool.h" @@ -539,8 +540,6 @@ void LLPanelObject::getState( ) mCheckPhantom->set( mIsPhantom ); mCheckPhantom->setEnabled( roots_selected>0 && editable && !is_flexible ); - mComboPhysicsShapeType->setCurrentByIndex(objectp->getPhysicsShapeType()); - mComboPhysicsShapeType->setEnabled(editable); mSpinPhysicsGravity->set(objectp->getPhysicsGravity()); mSpinPhysicsGravity->setEnabled(editable); @@ -604,6 +603,7 @@ void LLPanelObject::getState( ) BOOL enabled = FALSE; BOOL hole_enabled = FALSE; F32 scale_x=1.f, scale_y=1.f; + BOOL isMesh = FALSE; if( !objectp || !objectp->getVolume() || !editable || !single_volume) { @@ -634,10 +634,9 @@ void LLPanelObject::getState( ) // Only allowed to change these parameters for objects // that you have permissions on AND are not attachments. enabled = root_objectp->permModify(); - - const LLVolumeParams &volume_params = objectp->getVolume()->getParams(); - + // Volume type + const LLVolumeParams &volume_params = objectp->getVolume()->getParams(); U8 path = volume_params.getPathParams().getCurveType(); U8 profile_and_hole = volume_params.getProfileParams().getCurveType(); U8 profile = profile_and_hole & LL_PCODE_PROFILE_MASK; @@ -868,7 +867,7 @@ void LLPanelObject::getState( ) } mSpinSkew->set( skew ); } - + // Compute control visibility, label names, and twist range. // Start with defaults. BOOL cut_visible = TRUE; @@ -1132,6 +1131,10 @@ void LLPanelObject::getState( ) mCtrlSculptInvert->setVisible(sculpt_texture_visible); + // update the physics shape combo to include allowed physics shapes + mComboPhysicsShapeType->removeall(); + mComboPhysicsShapeType->add(getString("None"), LLSD(1)); + // sculpt texture if (selected_item == MI_SCULPT) @@ -1163,6 +1166,7 @@ void LLPanelObject::getState( ) U8 sculpt_stitching = sculpt_type & LL_SCULPT_TYPE_MASK; BOOL sculpt_invert = sculpt_type & LL_SCULPT_FLAG_INVERT; BOOL sculpt_mirror = sculpt_type & LL_SCULPT_FLAG_MIRROR; + isMesh = (sculpt_stitching == LL_SCULPT_TYPE_MESH); if (mCtrlSculptType) { @@ -1179,20 +1183,41 @@ void LLPanelObject::getState( ) if (mCtrlSculptInvert) { mCtrlSculptInvert->set(sculpt_invert); - mCtrlSculptInvert->setEnabled(editable && (sculpt_stitching != LL_SCULPT_TYPE_MESH)); + mCtrlSculptInvert->setEnabled(editable && (!isMesh)); } if (mLabelSculptType) { mLabelSculptType->setEnabled(TRUE); } + } } else { - mSculptTextureRevert = LLUUID::null; + mSculptTextureRevert = LLUUID::null; } + if(isMesh && objectp) + { + const LLVolumeParams &volume_params = objectp->getVolume()->getParams(); + LLUUID mesh_id = volume_params.getSculptID(); + if(gMeshRepo.hasPhysicsShape(mesh_id)) + { + // if a mesh contains an uploaded or decomposed physics mesh, + // allow 'Prim' + mComboPhysicsShapeType->add(getString("Prim"), LLSD(0)); + } + } + else + { + // simple prims always allow physics shape prim + mComboPhysicsShapeType->add(getString("Prim"), LLSD(0)); + } + mComboPhysicsShapeType->add(getString("Convex Hull"), LLSD(2)); + mComboPhysicsShapeType->setValue(LLSD(objectp->getPhysicsShapeType())); + mComboPhysicsShapeType->setEnabled(editable); + //---------------------------------------------------------------------------- @@ -1268,7 +1293,9 @@ public: void LLPanelObject::sendPhysicsParam() { - U8 type = (U8)mComboPhysicsShapeType->getCurrentIndex(); + LLSD physicsType = mComboPhysicsShapeType->getValue(); + + U8 type = physicsType.asInteger(); F32 gravity = mSpinPhysicsGravity->get(); F32 friction = mSpinPhysicsFriction->get(); F32 density = mSpinPhysicsDensity->get(); @@ -1759,10 +1786,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/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp index ce9b1c66d7..c10c21683b 100644 --- a/indra/newview/llpaneloutfitedit.cpp +++ b/indra/newview/llpaneloutfitedit.cpp @@ -186,14 +186,8 @@ private: // Populate the menu with items like "New Skin", "New Pants", etc. static void populateCreateWearableSubmenus(LLMenuGL* menu) { - LLView* menu_clothes = gMenuHolder->findChildView("COF.Gear.New_Clothes", FALSE); - LLView* menu_bp = gMenuHolder->findChildView("COF.Geear.New_Body_Parts", FALSE); - - if (!menu_clothes || !menu_bp) - { - llassert(menu_clothes && menu_bp); - return; - } + LLView* menu_clothes = gMenuHolder->getChildView("COF.Gear.New_Clothes", FALSE); + LLView* menu_bp = gMenuHolder->getChildView("COF.Geear.New_Body_Parts", FALSE); for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i) { diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index 71c812efe2..54198d6aa4 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -231,7 +231,7 @@ public: virtual void setActive(bool) {} protected: - void updateList() + void update() { mCallback(); } @@ -239,6 +239,30 @@ protected: callback_t mCallback; }; +/** + * Update buttons on changes in our friend relations (STORM-557). + */ +class LLButtonsUpdater : public LLPanelPeople::Updater, public LLFriendObserver +{ +public: + LLButtonsUpdater(callback_t cb) + : LLPanelPeople::Updater(cb) + { + LLAvatarTracker::instance().addObserver(this); + } + + ~LLButtonsUpdater() + { + LLAvatarTracker::instance().removeObserver(this); + } + + /*virtual*/ void changed(U32 mask) + { + (void) mask; + update(); + } +}; + class LLAvatarListUpdater : public LLPanelPeople::Updater, public LLEventTimer { public: @@ -306,7 +330,7 @@ public: if (mMask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::ONLINE)) { - updateList(); + update(); } // Stop updates. @@ -421,7 +445,7 @@ public: if (val) { // update immediately and start regular updates - updateList(); + update(); mEventTimer.start(); } else @@ -433,7 +457,7 @@ public: /*virtual*/ BOOL tick() { - updateList(); + update(); return FALSE; } private: @@ -450,7 +474,7 @@ public: LLRecentListUpdater(callback_t cb) : LLAvatarListUpdater(cb, 0) { - LLRecentPeople::instance().setChangedCallback(boost::bind(&LLRecentListUpdater::updateList, this)); + LLRecentPeople::instance().setChangedCallback(boost::bind(&LLRecentListUpdater::update, this)); } }; @@ -475,11 +499,13 @@ LLPanelPeople::LLPanelPeople() mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this)); mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this)); mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList, this)); + mButtonsUpdater = new LLButtonsUpdater(boost::bind(&LLPanelPeople::updateButtons, this)); mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this)); } LLPanelPeople::~LLPanelPeople() { + delete mButtonsUpdater; delete mNearbyListUpdater; delete mFriendListUpdater; delete mRecentListUpdater; @@ -1367,9 +1393,6 @@ void LLPanelPeople::onMoreButtonClicked() void LLPanelPeople::onOpen(const LLSD& key) { std::string tab_name = key["people_panel_tab_name"]; - mFilterEditor -> clear(); - onFilterEdit(""); - if (!tab_name.empty()) mTabContainer->selectTabByName(tab_name); } diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index 4412aed062..b496bb3779 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -152,6 +152,7 @@ private: Updater* mFriendListUpdater; Updater* mNearbyListUpdater; Updater* mRecentListUpdater; + Updater* mButtonsUpdater; LLMenuButton* mNearbyGearButton; LLMenuButton* mFriendsGearButton; diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp index 271728220c..44cca21a76 100644 --- a/indra/newview/llpanelpick.cpp +++ b/indra/newview/llpanelpick.cpp @@ -204,9 +204,6 @@ void LLPanelPickInfo::sendParcelInfoRequest() { if (mParcelId != mRequestedId) { - //ext-4655, remove now incase this gets called twice without a remove - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedId, this); - LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelId, this); LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelId); diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index ccef563544..15e826ac2c 100644 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -212,7 +212,8 @@ void LLPanelPicks::updateData() mNoPicks = false; mNoClassifieds = false; - getChild<LLUICtrl>("picks_panel_text")->setValue(LLTrans::getString("PicksClassifiedsLoadingText")); + mNoItemsLabel->setValue(LLTrans::getString("PicksClassifiedsLoadingText")); + mNoItemsLabel->setVisible(TRUE); mPicksList->clear(); LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId()); @@ -314,15 +315,17 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type) mNoClassifieds = !mClassifiedsList->size(); } - if (mNoPicks && mNoClassifieds) + bool no_data = mNoPicks && mNoClassifieds; + mNoItemsLabel->setVisible(no_data); + if (no_data) { if(getAvatarId() == gAgentID) { - getChild<LLUICtrl>("picks_panel_text")->setValue(LLTrans::getString("NoPicksClassifiedsText")); + mNoItemsLabel->setValue(LLTrans::getString("NoPicksClassifiedsText")); } else { - getChild<LLUICtrl>("picks_panel_text")->setValue(LLTrans::getString("NoAvatarPicksClassifiedsText")); + mNoItemsLabel->setValue(LLTrans::getString("NoAvatarPicksClassifiedsText")); } } } @@ -359,6 +362,8 @@ BOOL LLPanelPicks::postBuild() mPicksList->setNoItemsCommentText(getString("no_picks")); mClassifiedsList->setNoItemsCommentText(getString("no_classifieds")); + mNoItemsLabel = getChild<LLUICtrl>("picks_panel_text"); + childSetAction(XML_BTN_NEW, boost::bind(&LLPanelPicks::onClickPlusBtn, this)); childSetAction(XML_BTN_DELETE, boost::bind(&LLPanelPicks::onClickDelete, this)); childSetAction(XML_BTN_TELEPORT, boost::bind(&LLPanelPicks::onClickTeleport, this)); @@ -781,7 +786,7 @@ void LLPanelPicks::showAccordion(const std::string& name, bool show) void LLPanelPicks::onPanelPickClose(LLPanel* panel) { - panel->setVisible(FALSE); + getProfilePanel()->closePanel(panel); } void LLPanelPicks::onPanelPickSave(LLPanel* panel) diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 526ba48dcb..a02ed81bb0 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -149,6 +149,7 @@ private: LLPanelClassifiedInfo* mPanelClassifiedInfo; LLPanelPickEdit* mPanelPickEdit; LLToggleableMenu* mPlusMenu; + LLUICtrl* mNoItemsLabel; // <classified_id, edit_panel> typedef std::map<LLUUID, LLPanelClassifiedEdit*> panel_classified_edit_map_t; diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp index 9cbb512e70..4ae0c0eb12 100644 --- a/indra/newview/llpanelplaceinfo.cpp +++ b/indra/newview/llpanelplaceinfo.cpp @@ -128,10 +128,6 @@ void LLPanelPlaceInfo::sendParcelInfoRequest() { if (mParcelID != mRequestedID) { - //ext-4655, defensive. remove now incase this gets called twice without a remove - //as panel never closes its ok atm (but wrong :) - LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mRequestedID, this); - LLRemoteParcelInfoProcessor::getInstance()->addObserver(mParcelID, this); LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(mParcelID); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index f0e60386b6..1869e92c8c 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -39,6 +39,7 @@ #include "llfiltereditor.h" #include "llfirstuse.h" #include "llfloaterreg.h" +#include "llmenubutton.h" #include "llnotificationsutil.h" #include "lltabcontainer.h" #include "lltexteditor.h" @@ -282,8 +283,8 @@ BOOL LLPanelPlaces::postBuild() mCloseBtn = getChild<LLButton>("close_btn"); mCloseBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); - mOverflowBtn = getChild<LLButton>("overflow_btn"); - mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this)); + mOverflowBtn = getChild<LLMenuButton>("overflow_btn"); + mOverflowBtn->setMouseDownCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this)); mPlaceInfoBtn = getChild<LLButton>("profile_btn"); mPlaceInfoBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onProfileButtonClicked, this)); @@ -330,8 +331,7 @@ BOOL LLPanelPlaces::postBuild() mPlaceProfileBackBtn = mPlaceProfile->getChild<LLButton>("back_btn"); mPlaceProfileBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); - mLandmarkInfoBackBtn = mLandmarkInfo->getChild<LLButton>("back_btn"); - mLandmarkInfoBackBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); + mLandmarkInfo->getChild<LLButton>("back_btn")->setClickedCallback(boost::bind(&LLPanelPlaces::onBackButtonClicked, this)); LLLineEditor* title_editor = mLandmarkInfo->getChild<LLLineEditor>("title_editor"); title_editor->setKeystrokeCallback(boost::bind(&LLPanelPlaces::onEditButtonClicked, this), NULL); @@ -347,8 +347,6 @@ BOOL LLPanelPlaces::postBuild() void LLPanelPlaces::onOpen(const LLSD& key) { - LLFirstUse::notUsingDestinationGuide(false); - if (!mPlaceProfile || !mLandmarkInfo) return; @@ -384,12 +382,7 @@ void LLPanelPlaces::onOpen(const LLSD& key) mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); - // Disabling "Save", "Close" and "Back" buttons to prevent closing "Create Landmark" - // panel before created landmark is loaded. - // These buttons will be enabled when created landmark is added to inventory. mSaveBtn->setEnabled(FALSE); - mCloseBtn->setEnabled(FALSE); - mLandmarkInfoBackBtn->setEnabled(FALSE); } else if (mPlaceInfoType == LANDMARK_INFO_TYPE) { @@ -497,8 +490,6 @@ void LLPanelPlaces::setItem(LLInventoryItem* item) mEditBtn->setEnabled(is_landmark_editable); mSaveBtn->setEnabled(is_landmark_editable); - mCloseBtn->setEnabled(TRUE); - mLandmarkInfoBackBtn->setEnabled(TRUE); if (is_landmark_editable) { @@ -783,16 +774,7 @@ void LLPanelPlaces::onOverflowButtonClicked() return; } - if (!menu->toggleVisibility()) - return; - - if (menu->getButtonRect().isEmpty()) - { - menu->setButtonRect(mOverflowBtn); - } - menu->updateParent(LLMenuGL::sMenuContainer); - LLRect rect = mOverflowBtn->getRect(); - LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop); + mOverflowBtn->setMenu(menu, LLMenuButton::MP_TOP_RIGHT); } void LLPanelPlaces::onProfileButtonClicked() @@ -1137,13 +1119,6 @@ void LLPanelPlaces::updateVerbs() { mTeleportBtn->setEnabled(have_3d_pos); } - - // Do not enable landmark info Back button when we are waiting - // for newly created landmark to load. - if (!is_create_landmark_visible) - { - mLandmarkInfoBackBtn->setEnabled(TRUE); - } } else { diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h index c3b2ab806f..b335f88a48 100644 --- a/indra/newview/llpanelplaces.h +++ b/indra/newview/llpanelplaces.h @@ -47,6 +47,7 @@ class LLPlacesParcelObserver; class LLRemoteParcelInfoObserver; class LLTabContainer; class LLToggleableMenu; +class LLMenuButton; typedef std::pair<LLUUID, std::string> folder_pair_t; @@ -116,14 +117,13 @@ private: LLToggleableMenu* mLandmarkMenu; LLButton* mPlaceProfileBackBtn; - LLButton* mLandmarkInfoBackBtn; LLButton* mTeleportBtn; LLButton* mShowOnMapBtn; LLButton* mEditBtn; LLButton* mSaveBtn; LLButton* mCancelBtn; LLButton* mCloseBtn; - LLButton* mOverflowBtn; + LLMenuButton* mOverflowBtn; LLButton* mPlaceInfoBtn; LLPlacesInventoryObserver* mInventoryObserver; diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 15d6f82220..b5fd4145f2 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -520,7 +520,7 @@ void LLPanelPrimMediaControls::updateShape() if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus()) { mMediaProgressPanel->setVisible(true); - mMediaProgressBar->setPercent(media_plugin->getProgressPercent()); + mMediaProgressBar->setValue(media_plugin->getProgressPercent()); } else { @@ -623,12 +623,12 @@ void LLPanelPrimMediaControls::updateShape() // convert screenspace bbox to pixels (in screen coords) LLRect window_rect = gViewerWindow->getWorldViewRectScaled(); LLCoordGL screen_min; - screen_min.mX = llround((F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f); - screen_min.mY = llround((F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f); + screen_min.mX = llround((F32)window_rect.mLeft + (F32)window_rect.getWidth() * (min.mV[VX] + 1.f) * 0.5f); + screen_min.mY = llround((F32)window_rect.mBottom + (F32)window_rect.getHeight() * (min.mV[VY] + 1.f) * 0.5f); LLCoordGL screen_max; - screen_max.mX = llround((F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f); - screen_max.mY = llround((F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f); + screen_max.mX = llround((F32)window_rect.mLeft + (F32)window_rect.getWidth() * (max.mV[VX] + 1.f) * 0.5f); + screen_max.mY = llround((F32)window_rect.mBottom + (F32)window_rect.getHeight() * (max.mV[VY] + 1.f) * 0.5f); // grow panel so that screenspace bounding box fits inside "media_region" element of panel LLRect media_panel_rect; diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp index 4e63563979..6038ab20d8 100644 --- a/indra/newview/llpanelprofile.cpp +++ b/indra/newview/llpanelprofile.cpp @@ -217,6 +217,10 @@ void LLPanelProfile::setAllChildrenVisible(BOOL visible) void LLPanelProfile::openPanel(LLPanel* panel, const LLSD& params) { + // Hide currently visible panel (STORM-690). + setAllChildrenVisible(FALSE); + + // Add the panel or bring it to front. if (panel->getParent() != this) { addChild(panel); @@ -243,6 +247,18 @@ void LLPanelProfile::closePanel(LLPanel* panel) if (panel->getParent() == this) { removeChild(panel); + + // Make the underlying panel visible. + const child_list_t* child_list = getChildList(); + if (child_list->size() > 0) + { + child_list->front()->setVisible(TRUE); + child_list->front()->setFocus(TRUE); // prevent losing focus by the floater + } + else + { + llwarns << "No underlying panel to make visible." << llendl; + } } } diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index fff8ccb912..9b35e78134 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -181,9 +181,11 @@ void LLTeleportHistoryFlatItem::setRegionName(const std::string& name) void LLTeleportHistoryFlatItem::updateTitle() { + static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", LLColor4U(255, 255, 255)); + LLTextUtil::textboxSetHighlightedVal( mTitle, - LLStyle::Params(), + LLStyle::Params().color(sFgColor), mRegionName, mHighlight); } diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp index 499b6a8f5f..9fbb67a63a 100644 --- a/indra/newview/llpopupview.cpp +++ b/indra/newview/llpopupview.cpp @@ -40,7 +40,8 @@ bool view_visible(LLView* viewp) } -LLPopupView::LLPopupView() +LLPopupView::LLPopupView(const LLPopupView::Params& p) +: LLPanel(p) { // register ourself as handler of UI popups LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this)); @@ -137,64 +138,102 @@ BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func BOOL LLPopupView::handleMouseDown(S32 x, S32 y, MASK mask) { - if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true); + if (!handled) { - return FALSE; + handled = LLPanel::handleMouseDown(x, y, mask); } - return TRUE; + return handled; } BOOL LLPopupView::handleMouseUp(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleMouseUp(x, y, mask); + } + return handled; } BOOL LLPopupView::handleMiddleMouseDown(S32 x, S32 y, MASK mask) { - if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true); + if (!handled) { - return FALSE; + handled = LLPanel::handleMiddleMouseDown(x, y, mask); } - return TRUE; + return handled; } BOOL LLPopupView::handleMiddleMouseUp(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleMiddleMouseUp(x, y, mask); + } + return handled; } BOOL LLPopupView::handleRightMouseDown(S32 x, S32 y, MASK mask) { - if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true)) + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true); + if (!handled) { - return FALSE; + handled = LLPanel::handleRightMouseDown(x, y, mask); } - return TRUE; + return handled; } BOOL LLPopupView::handleRightMouseUp(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleRightMouseUp(x, y, mask); + } + return handled; } BOOL LLPopupView::handleDoubleClick(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleDoubleClick(x, y, mask); + } + return handled; } BOOL LLPopupView::handleHover(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleHover(x, y, mask); + } + return handled; } BOOL LLPopupView::handleScrollWheel(S32 x, S32 y, S32 clicks) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false); + if (!handled) + { + handled = LLPanel::handleScrollWheel(x, y, clicks); + } + return handled; } BOOL LLPopupView::handleToolTip(S32 x, S32 y, MASK mask) { - return handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false); + BOOL handled = handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false); + if (!handled) + { + handled = LLPanel::handleToolTip(x, y, mask); + } + return handled; } void LLPopupView::addPopup(LLView* popup) diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h index fec4afd79c..b378f61984 100644 --- a/indra/newview/llpopupview.h +++ b/indra/newview/llpopupview.h @@ -32,7 +32,7 @@ class LLPopupView : public LLPanel { public: - LLPopupView(); + LLPopupView(const Params& p = LLPanel::Params()); ~LLPopupView(); /*virtual*/ void draw(); diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index cf2ea38288..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 @@ -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(); @@ -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); @@ -1417,6 +1478,7 @@ void* LLLiveLSLEditor::createScriptEdPanel(void* userdata) self->getHandle(), &LLLiveLSLEditor::onLoad, &LLLiveLSLEditor::onSave, + &LLLiveLSLEditor::onEdit, &LLLiveLSLEditor::onSearchReplace, self, 0); @@ -1433,6 +1495,7 @@ LLLiveLSLEditor::LLLiveLSLEditor(const LLSD& key) : mCloseAfterSave(FALSE), mPendingUploads(0), mIsModifiable(FALSE), + mLiveFile(NULL), mIsNew(false) { mFactoryMap["script ed panel"] = LLCallbackMap(LLLiveLSLEditor::createScriptEdPanel, this); @@ -1458,6 +1521,7 @@ BOOL LLLiveLSLEditor::postBuild() LLLiveLSLEditor::~LLLiveLSLEditor() { + delete mLiveFile; } // virtual @@ -1639,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) { @@ -1825,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) { @@ -1877,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; @@ -1887,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, @@ -2138,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/llprogressview.cpp b/indra/newview/llprogressview.cpp index e9504cbba0..db02d76139 100644 --- a/indra/newview/llprogressview.cpp +++ b/indra/newview/llprogressview.cpp @@ -207,7 +207,7 @@ void LLProgressView::setText(const std::string& text) void LLProgressView::setPercent(const F32 percent) { - mProgressBar->setPercent(percent); + mProgressBar->setValue(percent); } void LLProgressView::setMessage(const std::string& msg) diff --git a/indra/newview/llremoteparcelrequest.cpp b/indra/newview/llremoteparcelrequest.cpp index d63a48647d..0dff087553 100644 --- a/indra/newview/llremoteparcelrequest.cpp +++ b/indra/newview/llremoteparcelrequest.cpp @@ -77,23 +77,20 @@ void LLRemoteParcelRequestResponder::error(U32 status, const std::string& reason void LLRemoteParcelInfoProcessor::addObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer) { - // Check if the observer is already in observers list for this UUID observer_multimap_t::iterator it; + observer_multimap_t::iterator start = mObservers.lower_bound(parcel_id); + observer_multimap_t::iterator end = mObservers.upper_bound(parcel_id); - it = mObservers.find(parcel_id); - while (it != mObservers.end()) + // Check if the observer is already in observers list for this UUID + for(it = start; it != end; ++it) { - if (it->second == observer) + if (it->second.get() == observer) { return; } - else - { - ++it; - } } - mObservers.insert(std::pair<LLUUID, LLRemoteParcelInfoObserver*>(parcel_id, observer)); + mObservers.insert(std::make_pair(parcel_id, observer->getObserverHandle())); } void LLRemoteParcelInfoProcessor::removeObserver(const LLUUID& parcel_id, LLRemoteParcelInfoObserver* observer) @@ -104,19 +101,16 @@ void LLRemoteParcelInfoProcessor::removeObserver(const LLUUID& parcel_id, LLRemo } observer_multimap_t::iterator it; + observer_multimap_t::iterator start = mObservers.lower_bound(parcel_id); + observer_multimap_t::iterator end = mObservers.upper_bound(parcel_id); - it = mObservers.find(parcel_id); - while (it != mObservers.end()) + for(it = start; it != end; ++it) { - if (it->second == observer) + if (it->second.get() == observer) { mObservers.erase(it); break; } - else - { - ++it; - } } } @@ -141,13 +135,35 @@ void LLRemoteParcelInfoProcessor::processParcelInfoReply(LLMessageSystem* msg, v msg->getS32 ("Data", "SalePrice", parcel_data.sale_price); msg->getS32 ("Data", "AuctionID", parcel_data.auction_id); - LLRemoteParcelInfoProcessor::observer_multimap_t observers = LLRemoteParcelInfoProcessor::getInstance()->mObservers; + LLRemoteParcelInfoProcessor::observer_multimap_t & observers = LLRemoteParcelInfoProcessor::getInstance()->mObservers; + + typedef std::vector<observer_multimap_t::iterator> deadlist_t; + deadlist_t dead_iters; - observer_multimap_t::iterator oi = observers.find(parcel_data.parcel_id); + observer_multimap_t::iterator oi; + observer_multimap_t::iterator start = observers.lower_bound(parcel_data.parcel_id); observer_multimap_t::iterator end = observers.upper_bound(parcel_data.parcel_id); - for (; oi != end; ++oi) + + for (oi = start; oi != end; ++oi) + { + LLRemoteParcelInfoObserver * observer = oi->second.get(); + if(observer) + { + observer->processParcelInfo(parcel_data); + } + else + { + // the handle points to an expired observer, so don't keep it + // around anymore + dead_iters.push_back(oi); + } + } + + deadlist_t::iterator i; + deadlist_t::iterator end_dead = dead_iters.end(); + for(i = dead_iters.begin(); i != end_dead; ++i) { - oi->second->processParcelInfo(parcel_data); + observers.erase(*i); } } diff --git a/indra/newview/llremoteparcelrequest.h b/indra/newview/llremoteparcelrequest.h index a6c62995a9..74cf1616df 100644 --- a/indra/newview/llremoteparcelrequest.h +++ b/indra/newview/llremoteparcelrequest.h @@ -98,7 +98,7 @@ public: static void processParcelInfoReply(LLMessageSystem* msg, void**); private: - typedef std::multimap<LLUUID, LLRemoteParcelInfoObserver*> observer_multimap_t; + typedef std::multimap<LLUUID, LLHandle<LLRemoteParcelInfoObserver> > observer_multimap_t; observer_multimap_t mObservers; }; diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h index 4b1ba15a0b..5223a314f3 100644 --- a/indra/newview/llrootview.h +++ b/indra/newview/llrootview.h @@ -42,27 +42,5 @@ public: LLRootView(const Params& p) : LLView(p) {} - - // added to provide possibility to handle mouse click event inside all application - // window without creating any floater - typedef boost::signals2::signal<void(S32 x, S32 y, MASK mask)> - mouse_signal_t; - - private: - mouse_signal_t mMouseDownSignal; - - public: - /*virtual*/ - BOOL handleMouseDown(S32 x, S32 y, MASK mask) - { - mMouseDownSignal(x, y, mask); - return LLView::handleMouseDown(x, y, mask); - } - - boost::signals2::connection addMouseDownCallback( - const mouse_signal_t::slot_type& cb) - { - return mMouseDownSignal.connect(cb); - } }; #endif //LL_LLROOTVIEW_H diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp index 61f4897ed0..9e0e10d66f 100644 --- a/indra/newview/llscreenchannel.cpp +++ b/indra/newview/llscreenchannel.cpp @@ -136,12 +136,22 @@ void LLScreenChannelBase::init(S32 channel_left, S32 channel_right) side_bar->getCollapseSignal().connect(boost::bind(&LLScreenChannelBase::resetPositionAndSize, this, _2)); } + // top and bottom set by updateBottom() + setRect(LLRect(channel_left, 0, channel_right, 0)); + updateBottom(); + setVisible(TRUE); +} + +void LLScreenChannelBase::updateBottom() +{ S32 channel_top = gViewerWindow->getWorldViewRectScaled().getHeight(); - S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin"); + S32 channel_bottom = gSavedSettings.getS32("ChannelBottomPanelMargin"); + S32 channel_left = getRect().mLeft; + S32 channel_right = getRect().mRight; setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom)); - setVisible(TRUE); } + //-------------------------------------------------------------------------- ////////////////////// // LLScreenChannel @@ -253,8 +263,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::stopFadingToast, this, new_toast_elem.toast)); - new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startFadingToast, this, new_toast_elem.toast)); + new_toast_elem.toast->setMouseEnterCallback(boost::bind(&LLScreenChannel::stopToastTimer, this, new_toast_elem.toast)); + new_toast_elem.toast->setMouseLeaveCallback(boost::bind(&LLScreenChannel::startToastTimer, this, new_toast_elem.toast)); } if(show_toast) @@ -369,7 +379,7 @@ void LLScreenChannel::loadStoredToastsToChannel() for(it = mStoredToastList.begin(); it != mStoredToastList.end(); ++it) { (*it).toast->setIsHidden(false); - (*it).toast->startFading(); + (*it).toast->startTimer(); mToastList.push_back((*it)); } @@ -394,7 +404,7 @@ void LLScreenChannel::loadStoredToastByNotificationIDToChannel(LLUUID id) } toast->setIsHidden(false); - toast->startFading(); + toast->startTimer(); mToastList.push_back((*it)); redrawToasts(); @@ -477,7 +487,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel) toast->removeChild(old_panel); delete old_panel; toast->insertPanel(panel); - toast->startFading(); + toast->startTimer(); redrawToasts(); } } @@ -511,6 +521,8 @@ void LLScreenChannel::showToastsBottom() S32 toast_margin = 0; std::vector<ToastElem>::reverse_iterator it; + updateBottom(); + LLDockableFloater* floater = dynamic_cast<LLDockableFloater*>(LLDockableFloater::getInstanceHandle().get()); for(it = mToastList.rbegin(); it != mToastList.rend(); ++it) @@ -588,7 +600,7 @@ void LLScreenChannel::showToastsBottom() mHiddenToastsNum = 0; for(; it != mToastList.rend(); it++) { - (*it).toast->stopFading(); + (*it).toast->stopTimer(); (*it).toast->setVisible(FALSE); mHiddenToastsNum++; } @@ -697,15 +709,15 @@ void LLScreenChannel::closeStartUpToast() } } -void LLNotificationsUI::LLScreenChannel::stopFadingToast(LLToast* toast) +void LLNotificationsUI::LLScreenChannel::stopToastTimer(LLToast* toast) { if (!toast || toast != mHoveredToast) return; // Pause fade timer of the hovered toast. - toast->stopFading(); + toast->stopTimer(); } -void LLNotificationsUI::LLScreenChannel::startFadingToast(LLToast* toast) +void LLNotificationsUI::LLScreenChannel::startToastTimer(LLToast* toast) { if (!toast || toast == mHoveredToast) { @@ -713,7 +725,7 @@ void LLNotificationsUI::LLScreenChannel::startFadingToast(LLToast* toast) } // Reset its fade timer. - toast->startFading(); + toast->startTimer(); } //-------------------------------------------------------------------------- @@ -850,13 +862,7 @@ void LLScreenChannel::updateShowToastsState() return; } - S32 channel_bottom = gViewerWindow->getWorldViewRectScaled().mBottom + gSavedSettings.getS32("ChannelBottomPanelMargin");; - LLRect this_rect = getRect(); - - if(channel_bottom != this_rect.mBottom) - { - setRect(LLRect(this_rect.mLeft, this_rect.mTop, this_rect.mRight, channel_bottom)); - } + updateBottom(); } //-------------------------------------------------------------------------- diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h index a1fdd6e32c..023a65d872 100644 --- a/indra/newview/llscreenchannel.h +++ b/indra/newview/llscreenchannel.h @@ -111,6 +111,8 @@ public: LLUUID getChannelID() { return mID; } protected: + void updateBottom(); + // Channel's flags bool mControlHovering; LLToast* mHoveredToast; @@ -194,10 +196,10 @@ public: /** Stop fading given toast */ - virtual void stopFadingToast(LLToast* toast); + virtual void stopToastTimer(LLToast* toast); /** Start fading given toast */ - virtual void startFadingToast(LLToast* toast); + virtual void startToastTimer(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/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp index 1999f14828..b316171604 100644 --- a/indra/newview/llsidepanelappearance.cpp +++ b/indra/newview/llsidepanelappearance.cpp @@ -183,12 +183,15 @@ void LLSidepanelAppearance::onOpen(const LLSD& key) void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility) { - updateToVisibility(new_visibility); + LLSD visibility; + visibility["visible"] = new_visibility.asBoolean(); + visibility["reset_accordion"] = true; + updateToVisibility(visibility); } void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility) { - if (new_visibility.asBoolean()) + if (new_visibility["visible"].asBoolean()) { bool is_outfit_edit_visible = mOutfitEdit && mOutfitEdit->getVisible(); bool is_wearable_edit_visible = mEditWearable && mEditWearable->getVisible(); @@ -209,7 +212,7 @@ void LLSidepanelAppearance::updateToVisibility(const LLSD &new_visibility) } } - if (is_outfit_edit_visible) + if (is_outfit_edit_visible && new_visibility["reset_accordion"].asBoolean()) { mOutfitEdit->resetAccordionState(); } diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index 81b2fc0ae0..3bc3959e0b 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -118,7 +118,7 @@ public: protected: LLSideTrayTab(const Params& params); - void dock(); + void dock(LLFloater* floater_tab); void undock(LLFloater* floater_tab); LLSideTray* getSideTray(); @@ -159,8 +159,6 @@ LLSideTrayTab::LLSideTrayTab(const Params& p) mDescription(p.description), mMainPanel(NULL) { - // Necessary for focus movement among child controls - setFocusRoot(TRUE); } LLSideTrayTab::~LLSideTrayTab() @@ -259,7 +257,7 @@ void LLSideTrayTab::toggleTabDocked() if (docking) { - dock(); + dock(floater_tab); } else { @@ -271,11 +269,14 @@ void LLSideTrayTab::toggleTabDocked() LLFloaterReg::toggleInstance("side_bar_tab", tab_name); } -void LLSideTrayTab::dock() +void LLSideTrayTab::dock(LLFloater* floater_tab) { LLSideTray* side_tray = getSideTray(); if (!side_tray) return; + // Before docking the tab, reset its (and its children's) transparency to default (STORM-688). + floater_tab->updateTransparency(TT_DEFAULT); + if (!side_tray->addTab(this)) { llwarns << "Failed to add tab " << getName() << " to side tray" << llendl; @@ -298,7 +299,11 @@ static void on_minimize(LLSidepanelAppearance* panel, LLSD minimized) { if (!panel) return; bool visible = !minimized.asBoolean(); - panel->updateToVisibility(LLSD(visible)); + LLSD visibility; + visibility["visible"] = visible; + // Do not reset accordion state on minimize (STORM-375) + visibility["reset_accordion"] = false; + panel->updateToVisibility(visibility); } void LLSideTrayTab::undock(LLFloater* floater_tab) @@ -910,7 +915,6 @@ void LLSideTray::createButtons () } } LLHints::registerHintTarget("inventory_btn", mTabButtons["sidebar_inventory"]->getHandle()); - LLHints::registerHintTarget("dest_guide_btn", mTabButtons["sidebar_places"]->getHandle()); } void LLSideTray::processTriState () @@ -1028,7 +1032,8 @@ void LLSideTray::arrange() } // The tab buttons should be shown only if there is at least one non-detached tab. - mButtonsPanel->setVisible(hasTabs()); + // Also hide them in mouse-look mode. + mButtonsPanel->setVisible(hasTabs() && !gAgentCamera.cameraMouselook()); } // Detach those tabs that were detached when the viewer exited last time. diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h index 4c23a1920b..3c572dde95 100644 --- a/indra/newview/llsidetray.h +++ b/indra/newview/llsidetray.h @@ -40,6 +40,8 @@ class LLSideTray : public LLPanel, private LLDestroyClass<LLSideTray> { friend class LLUICtrlFactory; friend class LLDestroyClass<LLSideTray>; + friend class LLSideTrayTab; + friend class LLSideTrayButton; public: LOG_CLASS(LLSideTray); @@ -126,11 +128,6 @@ public: } /* - * get currently active tab - */ - const LLSideTrayTab* getActiveTab() const { return mActiveTab; } - - /* * collapse SideBar, hiding visible tab and moving tab buttons * to the right corner of the screen */ @@ -163,32 +160,28 @@ public: virtual BOOL postBuild(); - void onTabButtonClick(std::string name); - void onToggleCollapse(); - - bool addChild (LLView* view, S32 tab_group); - bool removeTab (LLSideTrayTab* tab); // Used to detach tabs temporarily - bool addTab (LLSideTrayTab* tab); // Used to re-attach tabs - BOOL handleMouseDown (S32 x, S32 y, MASK mask); void reshape (S32 width, S32 height, BOOL called_from_parent = TRUE); - void processTriState (); - + void updateSidetrayVisibility(); commit_signal_t& getCollapseSignal() { return mCollapseSignal; } void handleLoginComplete(); - LLSideTrayTab* getTab (const std::string& name); - bool isTabAttached (const std::string& name); protected: + bool addChild (LLView* view, S32 tab_group); + bool removeTab (LLSideTrayTab* tab); // Used to detach tabs temporarily + bool addTab (LLSideTrayTab* tab); // Used to re-attach tabs bool hasTabs (); + const LLSideTrayTab* getActiveTab() const { return mActiveTab; } + LLSideTrayTab* getTab(const std::string& name); + void createButtons (); LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip, @@ -196,11 +189,15 @@ protected: void arrange (); void detachTabs (); void reflectCollapseChange(); + void processTriState (); void toggleTabButton (LLSideTrayTab* tab); LLPanel* openChildPanel (LLSideTrayTab* tab, const std::string& panel_name, const LLSD& params); + void onTabButtonClick(std::string name); + void onToggleCollapse(); + private: // Implementation of LLDestroyClass<LLSideTray> static void destroyClass() diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp index bd6be14341..6b77209867 100644 --- a/indra/newview/llspatialpartition.cpp +++ b/indra/newview/llspatialpartition.cpp @@ -2900,7 +2900,7 @@ void renderPhysicsShape(LLDrawable* drawable, LLVOVolume* volume) LLVolumeParams volume_params = volume->getVolume()->getParams(); - LLPhysicsVolumeParams physics_params(volume->getVolume()->getParams(), + LLPhysicsVolumeParams physics_params(volume_params, physics_type == LLViewerObject::PHYSICS_SHAPE_CONVEX_HULL); LLPhysicsShapeBuilderUtil::PhysicsShapeSpecification physics_spec; diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 3dce66f394..c76ecae4a2 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -134,8 +134,11 @@ LLSpeakButton::LLSpeakButton(const Params& p) LLSpeakButton::~LLSpeakButton() { - LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); - LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); + if(LLTransientFloaterMgr::instanceExists()) + { + LLTransientFloaterMgr::getInstance()->removeControlView(mSpeakBtn); + LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn); + } } void LLSpeakButton::setSpeakToolTip(const std::string& msg) diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp index ede1d6bebe..9b38bf22ff 100644 --- a/indra/newview/llspeakingindicatormanager.cpp +++ b/indra/newview/llspeakingindicatormanager.cpp @@ -308,7 +308,10 @@ void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker void LLSpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator) { - SpeakingIndicatorManager::instance().unregisterSpeakingIndicator(speaker_id, speaking_indicator); + if(SpeakingIndicatorManager::instanceExists()) + { + SpeakingIndicatorManager::instance().unregisterSpeakingIndicator(speaker_id, speaking_indicator); + } } // EOF diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 230dfaea51..ac3aedb16e 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -198,6 +198,7 @@ // exported globals // bool gAgentMovementCompleted = false; +S32 gMaxAgentGroups; std::string SCREEN_HOME_FILENAME = "screen_home.bmp"; std::string SCREEN_LAST_FILENAME = "screen_last.bmp"; @@ -232,6 +233,8 @@ static LLHost gFirstSim; static std::string gFirstSimSeedCap; static LLVector3 gAgentStartLookAt(1.0f, 0.f, 0.f); static std::string gAgentStartLocation = "safe"; +static bool mLoginStatePastUI = false; + boost::scoped_ptr<LLEventPump> LLStartUp::sStateWatcher(new LLEventStream("StartupState")); boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener()); @@ -705,7 +708,15 @@ bool idle_startup() if (STATE_LOGIN_SHOW == LLStartUp::getStartupState()) { LL_DEBUGS("AppInit") << "Initializing Window" << LL_ENDL; - + + // if we've gone backwards in the login state machine, to this state where we show the UI + // AND the debug setting to exit in this case is true, then go ahead and bail quickly + if ( mLoginStatePastUI && gSavedSettings.getBOOL("QuitOnLoginActivated") ) + { + // no requirement for notification here - just exit + LLAppViewer::instance()->earlyExitNoNotify(); + } + gViewerWindow->getWindow()->setCursor(UI_CURSOR_ARROW); timeout_count = 0; @@ -783,6 +794,11 @@ bool idle_startup() if (STATE_LOGIN_WAIT == LLStartUp::getStartupState()) { + // when we get to this state, we've already been past the login UI + // (possiblely automatically) - flag this so we can test in the + // STATE_LOGIN_SHOW state if we've gone backwards + mLoginStatePastUI = true; + // Don't do anything. Wait for the login view to call the login_callback, // which will push us to the next state. @@ -809,6 +825,11 @@ bool idle_startup() gKeyboard->resetKeys(); } + // when we get to this state, we've already been past the login UI + // (possiblely automatically) - flag this so we can test in the + // STATE_LOGIN_SHOW state if we've gone backwards + mLoginStatePastUI = true; + // save the credentials std::string userid = "unknown"; if(gUserCredential.notNull()) @@ -3156,6 +3177,18 @@ bool process_login_success_response() LLViewerMedia::openIDSetup(openid_url, openid_token); } + if(response.has("max-agent-groups")) { + std::string max_agent_groups(response["max-agent-groups"]); + gMaxAgentGroups = atoi(max_agent_groups.c_str()); + LL_INFOS("LLStartup") << "gMaxAgentGroups read from login.cgi: " + << gMaxAgentGroups << LL_ENDL; + } + else { + gMaxAgentGroups = DEFAULT_MAX_AGENT_GROUPS; + LL_INFOS("LLStartup") << "using gMaxAgentGroups default: " + << gMaxAgentGroups << LL_ENDL; + } + bool success = false; // JC: gesture loading done below, when we have an asset system // in place. Don't delete/clear gUserCredentials until then. diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h index be1043cf91..b3d9ef1dcc 100644 --- a/indra/newview/llstartup.h +++ b/indra/newview/llstartup.h @@ -70,6 +70,7 @@ typedef enum { // exported symbols extern bool gAgentMovementCompleted; +extern S32 gMaxAgentGroups; extern LLPointer<LLViewerTexture> gStartTexture; class LLStartUp diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index 4588440aa1..1023a4339b 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -566,25 +566,27 @@ void LLFloaterTexturePicker::draw() LLRect interior = border; interior.stretch( -1 ); + // If the floater is focused, don't apply its alpha to the texture (STORM-677). + const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); if( mTexturep ) { if( mTexturep->getComponents() == 4 ) { - gl_rect_2d_checkerboard( interior ); + gl_rect_2d_checkerboard( interior, alpha ); } - gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep ); + gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha ); // Pump the priority mTexturep->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) ); } else if (!mFallbackImage.isNull()) { - mFallbackImage->draw(interior); + mFallbackImage->draw(interior, UI_VERTEX_COLOR % alpha); } else { - gl_rect_2d( interior, LLColor4::grey, TRUE ); + gl_rect_2d( interior, LLColor4::grey % alpha, TRUE ); // Draw X gl_draw_x(interior, LLColor4::black ); @@ -1269,23 +1271,25 @@ void LLTextureCtrl::draw() LLRect interior = border; interior.stretch( -1 ); + // If we're in a focused floater, don't apply the floater's alpha to the texture (STORM-677). + const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); if( mTexturep ) { if( mTexturep->getComponents() == 4 ) { - gl_rect_2d_checkerboard( interior ); + gl_rect_2d_checkerboard( interior, alpha ); } - gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep); + gl_draw_scaled_image( interior.mLeft, interior.mBottom, interior.getWidth(), interior.getHeight(), mTexturep, UI_VERTEX_COLOR % alpha); mTexturep->addTextureStats( (F32)(interior.getWidth() * interior.getHeight()) ); } else if (!mFallbackImage.isNull()) { - mFallbackImage->draw(interior); + mFallbackImage->draw(interior, UI_VERTEX_COLOR % alpha); } else { - gl_rect_2d( interior, LLColor4::grey, TRUE ); + gl_rect_2d( interior, LLColor4::grey % alpha, TRUE ); // Draw X gl_draw_x( interior, LLColor4::black ); diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index ca7b51a3cc..13fd51f473 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -51,8 +51,6 @@ #include "llviewerstats.h" #include "llworld.h" -std::string scrub_host_name(std::string http_url); - ////////////////////////////////////////////////////////////////////////////// class LLTextureFetchWorker : public LLWorkerClass { @@ -914,7 +912,7 @@ bool LLTextureFetchWorker::doWork(S32 param) // Will call callbackHttpGet when curl request completes std::vector<std::string> headers; headers.push_back("Accept: image/x-j2c"); - res = mFetcher->mCurlGetRequest->getByteRange(scrub_host_name(mUrl), headers, offset, mRequestedSize, + res = mFetcher->mCurlGetRequest->getByteRange(mUrl, headers, offset, mRequestedSize, new HTTPGetResponder(mFetcher, mID, LLTimer::getTotalTime(), mRequestedSize, offset, true)); } if (!res) @@ -1576,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/lltoast.cpp b/indra/newview/lltoast.cpp index 8176b8c1f9..fd5582d6f7 100644 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -113,7 +113,7 @@ LLToast::LLToast(const LLToast::Params& p) mHideBtnPressed(false), mIsTip(p.is_tip), mWrapperPanel(NULL), - mIsTransparent(false) + mIsFading(false) { mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs)); @@ -125,6 +125,9 @@ LLToast::LLToast(const LLToast::Params& p) mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this)); mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this)); + setBackgroundOpaque(TRUE); // *TODO: obsolete + updateTransparency(); + if(mPanel) { insertPanel(mPanel); @@ -141,10 +144,6 @@ LLToast::LLToast(const LLToast::Params& p) // init callbacks if present 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()); } void LLToast::reshape(S32 width, S32 height, BOOL called_from_parent) @@ -183,7 +182,7 @@ LLToast::~LLToast() void LLToast::hide() { setVisible(FALSE); - setTransparentState(false); + setFading(false); mTimer->stop(); mIsHidden = true; mOnFadeSignal(this); @@ -194,7 +193,7 @@ void LLToast::onFocusLost() if(mWrapperPanel && !isBackgroundVisible()) { // Lets make wrapper panel behave like a floater - setBackgroundOpaque(FALSE); + updateTransparency(); } } @@ -203,7 +202,7 @@ void LLToast::onFocusReceived() if(mWrapperPanel && !isBackgroundVisible()) { // Lets make wrapper panel behave like a floater - setBackgroundOpaque(TRUE); + updateTransparency(); } } @@ -248,22 +247,24 @@ void LLToast::expire() { if (mCanFade) { - if (mIsTransparent) + if (mIsFading) { + // Fade timer expired. Time to hide. hide(); } else { - setTransparentState(true); + // "Life" time has ended. Time to fade. + setFading(true); mTimer->restart(); } } } -void LLToast::setTransparentState(bool transparent) +void LLToast::setFading(bool transparent) { - setBackgroundOpaque(!transparent); - mIsTransparent = transparent; + mIsFading = transparent; + updateTransparency(); if (transparent) { @@ -279,7 +280,7 @@ F32 LLToast::getTimeLeftToLive() { F32 time_to_live = mTimer->getRemainingTimeF32(); - if (!mIsTransparent) + if (!mIsFading) { time_to_live += mToastFadingTime; } @@ -351,7 +352,6 @@ void LLToast::setVisible(BOOL show) if(show) { - setBackgroundOpaque(TRUE); if(!mTimer->getStarted() && mCanFade) { mTimer->start(); @@ -393,7 +393,7 @@ void LLToast::onToastMouseEnter() { mOnToastHoverSignal(this, MOUSE_ENTER); - setBackgroundOpaque(TRUE); + updateTransparency(); //toasts fading is management by Screen Channel @@ -402,7 +402,6 @@ void LLToast::onToastMouseEnter() { mHideBtn->setVisible(TRUE); } - mOnMouseEnterSignal(this); mToastMouseEnterSignal(this, getValue()); } } @@ -423,6 +422,8 @@ void LLToast::onToastMouseLeave() { mOnToastHoverSignal(this, MOUSE_LEAVE); + updateTransparency(); + //toasts fading is management by Screen Channel if(mHideBtn && mHideBtn->getEnabled()) @@ -450,20 +451,45 @@ void LLToast::setBackgroundOpaque(BOOL b) } } -void LLNotificationsUI::LLToast::stopFading() +void LLToast::updateTransparency() +{ + ETypeTransparency transparency_type; + + if (mCanFade) + { + // Notification toasts (including IM/chat toasts) change their transparency on hover. + if (isHovered()) + { + transparency_type = TT_ACTIVE; + } + else + { + transparency_type = mIsFading ? TT_FADING : TT_INACTIVE; + } + } + else + { + // Transparency of alert toasts depends on focus. + transparency_type = hasFocus() ? TT_ACTIVE : TT_INACTIVE; + } + + LLFloater::updateTransparency(transparency_type); +} + +void LLNotificationsUI::LLToast::stopTimer() { if(mCanFade) { - setTransparentState(false); + setFading(false); mTimer->stop(); } } -void LLNotificationsUI::LLToast::startFading() +void LLNotificationsUI::LLToast::startTimer() { if(mCanFade) { - setTransparentState(false); + setFading(false); mTimer->start(); } } diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h index fb534561c9..242f786bf2 100644 --- a/indra/newview/lltoast.h +++ b/indra/newview/lltoast.h @@ -90,8 +90,7 @@ public: fading_time_secs; // Number of seconds while a toast is transparent - Optional<toast_callback_t> on_delete_toast, - on_mouse_enter; + Optional<toast_callback_t> on_delete_toast; Optional<bool> can_fade, can_be_stored, enable_hide_btn, @@ -115,11 +114,11 @@ public: //Fading - /** Stop fading timer */ - virtual void stopFading(); + /** Stop lifetime/fading timer */ + virtual void stopTimer(); - /** Start fading timer */ - virtual void startFading(); + /** Start lifetime/fading timer */ + virtual void startTimer(); bool isHovered(); @@ -182,7 +181,6 @@ public: // Registers signals/callbacks for events toast_signal_t mOnFadeSignal; - toast_signal_t mOnMouseEnterSignal; toast_signal_t mOnDeleteToastSignal; toast_signal_t mOnToastDestroyedSignal; boost::signals2::connection setOnFadeCallback(toast_callback_t cb) { return mOnFadeSignal.connect(cb); } @@ -200,6 +198,9 @@ public: LLHandle<LLToast> getHandle() { mHandle.bind(this); return mHandle; } +protected: + void updateTransparency(); + private: void onToastMouseEnter(); @@ -208,7 +209,7 @@ private: void expire(); - void setTransparentState(bool transparent); + void setFading(bool fading); LLUUID mNotificationID; LLUUID mSessionID; @@ -234,7 +235,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; + bool mIsFading; commit_signal_t mToastMouseEnterSignal; commit_signal_t mToastMouseLeaveSignal; diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp index 371aad64bb..563c27c4d7 100644 --- a/indra/newview/lltoastgroupnotifypanel.cpp +++ b/indra/newview/lltoastgroupnotifypanel.cpp @@ -60,7 +60,7 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification 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 diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp index 9017f5ec55..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" @@ -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/lltoastscripttextbox.h b/indra/newview/lltoastscripttextbox.h new file mode 100644 index 0000000000..ae3b545e0a --- /dev/null +++ b/indra/newview/lltoastscripttextbox.h @@ -0,0 +1,58 @@ +/** + * @file lltoastscripttextbox.h + * @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$ + */ + +#ifndef LL_LLTOASTSCRIPTTEXTBOX_H +#define LL_LLTOASTSCRIPTTEXTBOX_H + +#include "lltoastnotifypanel.h" +#include "llnotificationptr.h" + +class LLButton; + +/** + * Toast panel for scripted llTextbox notifications. + */ +class LLToastScriptTextbox +: public LLToastNotifyPanel +{ +public: + void close(); + + static bool onNewNotification(const LLSD& notification); + + // 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); + + /*virtual*/ ~LLToastScriptTextbox(); +protected: + void onClickSubmit(); +private: + static const S32 DEFAULT_MESSAGE_MAX_LINE_COUNT; +}; + +#endif diff --git a/indra/newview/lltool.cpp b/indra/newview/lltool.cpp index 282d4e19c6..2d8ce95347 100644 --- a/indra/newview/lltool.cpp +++ b/indra/newview/lltool.cpp @@ -33,6 +33,7 @@ #include "llview.h" #include "llviewerwindow.h" +#include "llviewercontrol.h" #include "lltoolcomp.h" #include "lltoolfocus.h" #include "llfocusmgr.h" @@ -190,9 +191,12 @@ LLTool* LLTool::getOverrideTool(MASK mask) { return NULL; } - if (mask & MASK_ALT) + if (gSavedSettings.getBOOL("EnableAltZoom")) { - return LLToolCamera::getInstance(); + if (mask & MASK_ALT) + { + return LLToolCamera::getInstance(); + } } return NULL; } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index d992d808c7..562b9219b4 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -81,9 +81,11 @@ LLToolPie::LLToolPie() : LLTool(std::string("Pie")), mGrabMouseButtonDown( FALSE ), mMouseOutsideSlop( FALSE ), - mClickAction(0) -{ } - + mClickAction(0), + mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ), + mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") ) +{ +} BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktype, BOOL down) { @@ -211,12 +213,28 @@ BOOL LLToolPie::pickLeftMouseDownCallback() } // else nothing (fall through to touch) } case CLICK_ACTION_PAY: - if ((object && object->flagTakesMoney()) - || (parent && parent->flagTakesMoney())) + if ( mClickActionPayEnabled ) + { + if ((object && object->flagTakesMoney()) + || (parent && parent->flagTakesMoney())) + { + // pay event goes to object actually clicked on + mClickActionObject = object; + mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); + if (LLSelectMgr::getInstance()->selectGetAllValid()) + { + // call this right away, since we have all the info we need to continue the action + selectionPropertiesReceived(); + } + return TRUE; + } + } + break; + case CLICK_ACTION_BUY: + if ( mClickActionBuyEnabled ) { - // pay event goes to object actually clicked on - mClickActionObject = object; - mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE); + mClickActionObject = parent; + mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE, TRUE); if (LLSelectMgr::getInstance()->selectGetAllValid()) { // call this right away, since we have all the info we need to continue the action @@ -225,15 +243,6 @@ BOOL LLToolPie::pickLeftMouseDownCallback() return TRUE; } break; - case CLICK_ACTION_BUY: - mClickActionObject = parent; - mLeftClickSelection = LLToolSelect::handleObjectSelection(mPick, FALSE, TRUE, TRUE); - if (LLSelectMgr::getInstance()->selectGetAllValid()) - { - // call this right away, since we have all the info we need to continue the action - selectionPropertiesReceived(); - } - return TRUE; case CLICK_ACTION_OPEN: if (parent && parent->allowOpen()) { @@ -393,7 +402,7 @@ U8 final_click_action(LLViewerObject* obj) return click_action; } -ECursorType cursor_from_object(LLViewerObject* object) +ECursorType LLToolPie::cursorFromObject(LLViewerObject* object) { LLViewerObject* parent = NULL; if (object) @@ -413,7 +422,10 @@ ECursorType cursor_from_object(LLViewerObject* object) } break; case CLICK_ACTION_BUY: - cursor = UI_CURSOR_TOOLBUY; + if ( mClickActionBuyEnabled ) + { + cursor = UI_CURSOR_TOOLBUY; + } break; case CLICK_ACTION_OPEN: // Open always opens the parent. @@ -423,10 +435,13 @@ ECursorType cursor_from_object(LLViewerObject* object) } break; case CLICK_ACTION_PAY: - if ((object && object->flagTakesMoney()) - || (parent && parent->flagTakesMoney())) + if ( mClickActionPayEnabled ) { - cursor = UI_CURSOR_TOOLBUY; + if ((object && object->flagTakesMoney()) + || (parent && parent->flagTakesMoney())) + { + cursor = UI_CURSOR_TOOLBUY; + } } break; case CLICK_ACTION_ZOOM: @@ -474,10 +489,16 @@ void LLToolPie::selectionPropertiesReceived() switch (click_action) { case CLICK_ACTION_BUY: - handle_buy(); + if ( LLToolPie::getInstance()->mClickActionBuyEnabled ) + { + handle_buy(); + } break; case CLICK_ACTION_PAY: - handle_give_money_dialog(); + if ( LLToolPie::getInstance()->mClickActionPayEnabled ) + { + handle_give_money_dialog(); + } break; case CLICK_ACTION_OPEN: LLFloaterReg::showInstance("openobject"); @@ -518,7 +539,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit())) { show_highlight = true; - ECursorType cursor = cursor_from_object(click_action_object); + ECursorType cursor = cursorFromObject(click_action_object); gViewerWindow->setCursor(cursor); lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl; } @@ -571,7 +592,9 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask) { switch(click_action) { + // NOTE: mClickActionBuyEnabled flag enables/disables BUY action but setting cursor to default is okay case CLICK_ACTION_BUY: + // NOTE: mClickActionPayEnabled flag enables/disables PAY action but setting cursor to default is okay case CLICK_ACTION_PAY: case CLICK_ACTION_OPEN: case CLICK_ACTION_ZOOM: @@ -1228,15 +1251,17 @@ void LLToolPie::handleDeselect() LLTool* LLToolPie::getOverrideTool(MASK mask) { - if (mask == MASK_CONTROL) + if (gSavedSettings.getBOOL("EnableGrab")) { - return LLToolGrab::getInstance(); - } - else if (mask == (MASK_CONTROL | MASK_SHIFT)) - { - return LLToolGrab::getInstance(); + if (mask == MASK_CONTROL) + { + return LLToolGrab::getInstance(); + } + else if (mask == (MASK_CONTROL | MASK_SHIFT)) + { + return LLToolGrab::getInstance(); + } } - return LLTool::getOverrideTool(mask); } diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 65cb3e36a7..77200a1da4 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -80,6 +80,7 @@ private: BOOL useClickAction (MASK mask, LLViewerObject* object,LLViewerObject* parent); void showVisualContextMenuEffect(); + ECursorType cursorFromObject(LLViewerObject* object); bool handleMediaClick(const LLPickInfo& info); bool handleMediaHover(const LLPickInfo& info); @@ -96,8 +97,8 @@ private: LLPointer<LLViewerObject> mClickActionObject; U8 mClickAction; LLSafeHandle<LLObjectSelection> mLeftClickSelection; - + BOOL mClickActionBuyEnabled; + BOOL mClickActionPayEnabled; }; - #endif diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp index c3dd17def9..983108391f 100644 --- a/indra/newview/lltracker.cpp +++ b/indra/newview/lltracker.cpp @@ -109,6 +109,8 @@ void LLTracker::stopTracking(void* userdata) // static virtual void LLTracker::drawHUDArrow() { + if (!gSavedSettings.getBOOL("RenderTrackerBeacon")) return; + static LLUIColor map_track_color = LLUIColorTable::instance().getColor("MapTrackColor", LLColor4::white); /* tracking autopilot destination has been disabled @@ -155,7 +157,7 @@ void LLTracker::drawHUDArrow() // static void LLTracker::render3D() { - if (!gFloaterWorldMap) + if (!gFloaterWorldMap || !gSavedSettings.getBOOL("RenderTrackerBeacon")) { return; } diff --git a/indra/newview/lltransientfloatermgr.cpp b/indra/newview/lltransientfloatermgr.cpp index 78dd602f39..c648a6a28a 100644 --- a/indra/newview/lltransientfloatermgr.cpp +++ b/indra/newview/lltransientfloatermgr.cpp @@ -36,8 +36,11 @@ LLTransientFloaterMgr::LLTransientFloaterMgr() { - gViewerWindow->getRootView()->addMouseDownCallback(boost::bind( - &LLTransientFloaterMgr::leftMouseClickCallback, this, _1, _2, _3)); + if(gViewerWindow) + { + gViewerWindow->getRootView()->getChild<LLUICtrl>("popup_holder")->setMouseDownCallback(boost::bind( + &LLTransientFloaterMgr::leftMouseClickCallback, this, _2, _3, _4)); + } mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(GLOBAL, std::set<LLView*>())); mGroupControls.insert(std::pair<ETransientGroup, std::set<LLView*> >(DOCKED, std::set<LLView*>())); diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 249dc04694..f7159ae324 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -30,7 +30,7 @@ #include "llbufferstream.h" #include "llui.h" -#include "llversionviewer.h" +#include "llversioninfo.h" #include "llviewercontrol.h" #include "jsoncpp/reader.h" @@ -58,11 +58,11 @@ void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std getTranslateUrl(url, from_lang, to_lang, mesg); std::string user_agent = llformat("%s %d.%d.%d (%d)", - LL_CHANNEL, - LL_VERSION_MAJOR, - LL_VERSION_MINOR, - LL_VERSION_PATCH, - LL_VERSION_BUILD ); + LLVersionInfo::getChannel().c_str(), + LLVersionInfo::getMajor(), + LLVersionInfo::getMinor(), + LLVersionInfo::getPatch(), + LLVersionInfo::getBuild()); if (!m_Header.size()) { diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp index 733d05834a..673d0c24cf 100644 --- a/indra/newview/llversioninfo.cpp +++ b/indra/newview/llversioninfo.cpp @@ -95,9 +95,42 @@ const std::string &LLVersionInfo::getShortVersion() return version; } +namespace +{ + /// Storage of the channel name the viewer is using. + // The channel name is set by hardcoded constant, + // or by calling LLVersionInfo::resetChannel() + std::string sWorkingChannelName(LL_CHANNEL); + + // Storage for the "version and channel" string. + // This will get reset too. + std::string sVersionChannel(""); +} + +//static +const std::string &LLVersionInfo::getChannelAndVersion() +{ + if (sVersionChannel.empty()) + { + // cache the version string + std::ostringstream stream; + stream << LLVersionInfo::getChannel() + << " " + << LLVersionInfo::getVersion(); + sVersionChannel = stream.str(); + } + + return sVersionChannel; +} + //static const std::string &LLVersionInfo::getChannel() { - static std::string name(LL_CHANNEL); - return name; + return sWorkingChannelName; +} + +void LLVersionInfo::resetChannel(const std::string& channel) +{ + sWorkingChannelName = channel; + sVersionChannel.clear(); // Reset version and channel string til next use. } diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h index e468b6ae4e..6f64544f3b 100644 --- a/indra/newview/llversioninfo.h +++ b/indra/newview/llversioninfo.h @@ -58,8 +58,15 @@ public: /// return the viewer version as a string like "2.0.0" static const std::string &getShortVersion(); + /// return the viewer version and channel as a string + /// like "Second Life Release 2.0.0.200030" + static const std::string &getChannelAndVersion(); + /// return the channel name, e.g. "Second Life" static const std::string &getChannel(); + + /// reset the channel name used by the viewer. + static void resetChannel(const std::string& channel); }; #endif diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index 13dee0c7b7..8991c21518 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -70,6 +70,7 @@ #include "llpaneloutfitsinventory.h" #include "llpanellogin.h" #include "llpaneltopinfobar.h" +#include "llupdaterservice.h" #ifdef TOGGLE_HACKED_GODLIKE_VIEWER BOOL gHackGodmode = FALSE; @@ -82,7 +83,6 @@ LLControlGroup gCrashSettings("CrashSettings"); // saved at end of session LLControlGroup gWarningSettings("Warnings"); // persists ignored dialogs/warnings std::string gLastRunVersion; -std::string gCurrentVersion; extern BOOL gResizeScreenTexture; extern BOOL gDebugGL; @@ -117,56 +117,20 @@ static bool handleSetShaderChanged(const LLSD& newvalue) gBumpImageList.destroyGL(); gBumpImageList.restoreGL(); - LLViewerShaderMgr::instance()->setShaders(); - return true; -} - -static bool handleLightingDetailChanged(const LLSD& newvalue) -{ - if (gPipeline.isInit()) + // Changing shader also changes the terrain detail to high, reflect that change here + if (newvalue.asBoolean()) { - gPipeline.setLightingDetail(-1); + // shaders enabled, set terrain detail to high + gSavedSettings.setS32("RenderTerrainDetail", 1); } + // else, leave terrain detail as is + LLViewerShaderMgr::instance()->setShaders(); return true; } - -static bool handleRenderPerfTestChanged(const LLSD& newvalue) +bool handleRenderTransparentWaterChanged(const LLSD& newvalue) { - bool status = !newvalue.asBoolean(); - if (!status) - { - gPipeline.clearRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY, - LLPipeline::RENDER_TYPE_GROUND, - LLPipeline::RENDER_TYPE_TERRAIN, - LLPipeline::RENDER_TYPE_GRASS, - LLPipeline::RENDER_TYPE_TREE, - LLPipeline::RENDER_TYPE_WATER, - LLPipeline::RENDER_TYPE_PASS_GRASS, - LLPipeline::RENDER_TYPE_HUD, - LLPipeline::RENDER_TYPE_PARTICLES, - LLPipeline::RENDER_TYPE_CLOUDS, - LLPipeline::RENDER_TYPE_HUD_PARTICLES, - LLPipeline::END_RENDER_TYPES); - gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, false); - } - else - { - gPipeline.setRenderTypeMask(LLPipeline::RENDER_TYPE_WL_SKY, - LLPipeline::RENDER_TYPE_GROUND, - LLPipeline::RENDER_TYPE_TERRAIN, - LLPipeline::RENDER_TYPE_GRASS, - LLPipeline::RENDER_TYPE_TREE, - LLPipeline::RENDER_TYPE_WATER, - LLPipeline::RENDER_TYPE_PASS_GRASS, - LLPipeline::RENDER_TYPE_HUD, - LLPipeline::RENDER_TYPE_PARTICLES, - LLPipeline::RENDER_TYPE_CLOUDS, - LLPipeline::RENDER_TYPE_HUD_PARTICLES, - LLPipeline::END_RENDER_TYPES); - gPipeline.setRenderDebugFeatureControl(LLPipeline::RENDER_DEBUG_FEATURE_UI, true); - } - + LLWorld::getInstance()->updateWaterObjects(); return true; } @@ -369,11 +333,12 @@ static bool handleRenderDynamicLODChanged(const LLSD& newvalue) return true; } -static bool handleRenderUseFBOChanged(const LLSD& newvalue) +static bool handleRenderDeferredChanged(const LLSD& newvalue) { LLRenderTarget::sUseFBO = newvalue.asBoolean(); if (gPipeline.isInit()) { + gPipeline.updateRenderDeferred(); gPipeline.releaseGLBuffers(); gPipeline.createGLBuffers(); if (LLPipeline::sRenderDeferred && LLRenderTarget::sUseFBO) @@ -538,6 +503,18 @@ bool toggle_show_object_render_cost(const LLSD& newvalue) return true; } +void toggle_updater_service_active(LLControlVariable* control, const LLSD& new_value) +{ + if(new_value.asBoolean()) + { + LLUpdaterService().startChecking(); + } + else + { + LLUpdaterService().stopChecking(); + } +} + //////////////////////////////////////////////////////////////////////////// void settings_setup_listeners() @@ -547,12 +524,7 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2)); gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); - gSavedSettings.getControl("RenderBakeSunlight")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); - gSavedSettings.getControl("RenderNoAlpha")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); - gSavedSettings.getControl("RenderShaderLightingMaxLevel")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); - gSavedSettings.getControl("RenderLocalLights")->getSignal()->connect(boost::bind(&handleLightingDetailChanged, _2)); gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); - gSavedSettings.getControl("RenderPerformanceTest")->getSignal()->connect(boost::bind(&handleRenderPerfTestChanged, _2)); gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderUIBuffer")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderSpecularResX")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); @@ -584,13 +556,12 @@ void settings_setup_listeners() gSavedSettings.getControl("RenderAutoMaskAlphaNonDeferred")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderObjectBump")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); gSavedSettings.getControl("RenderMaxVBOSize")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2)); - gSavedSettings.getControl("RenderUseFBO")->getSignal()->connect(boost::bind(&handleRenderUseFBOChanged, _2)); gSavedSettings.getControl("RenderDeferredNoise")->getSignal()->connect(boost::bind(&handleReleaseGLBufferChanged, _2)); gSavedSettings.getControl("RenderUseImpostors")->getSignal()->connect(boost::bind(&handleRenderUseImpostorsChanged, _2)); gSavedSettings.getControl("RenderDebugGL")->getSignal()->connect(boost::bind(&handleRenderDebugGLChanged, _2)); gSavedSettings.getControl("RenderDebugPipeline")->getSignal()->connect(boost::bind(&handleRenderDebugPipelineChanged, _2)); gSavedSettings.getControl("RenderResolutionDivisor")->getSignal()->connect(boost::bind(&handleRenderResolutionDivisorChanged, _2)); - gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); + gSavedSettings.getControl("RenderDeferred")->getSignal()->connect(boost::bind(&handleRenderDeferredChanged, _2)); gSavedSettings.getControl("RenderShadowDetail")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderDeferredSSAO")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); gSavedSettings.getControl("RenderDeferredGI")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2)); @@ -690,7 +661,9 @@ void settings_setup_listeners() gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2)); 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("UpdaterServiceActive")->getSignal()->connect(&toggle_updater_service_active); 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/llviewercontrol.h b/indra/newview/llviewercontrol.h index 22b48f8906..d7191f5c8d 100644 --- a/indra/newview/llviewercontrol.h +++ b/indra/newview/llviewercontrol.h @@ -57,7 +57,5 @@ extern LLControlGroup gCrashSettings; // Set after settings loaded extern std::string gLastRunVersion; -extern std::string gCurrentVersion; - #endif // LL_LLVIEWERCONTROL_H diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp index 6d59b687f3..527f400c03 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,22 +219,15 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLMemType mt_render(LLMemType::MTYPE_RENDER);
LLFastTimer t(FTM_RENDER);
- if (gResizeScreenTexture)
- { //skip render on frames where screen texture is resizing
+ if (gWindowResized)
+ { //skip render on frames where window has been resized
gGL.flush();
- if (!for_snapshot)
- {
- glClear(GL_COLOR_BUFFER_BIT);
- gViewerWindow->mWindow->swapBuffers();
- }
-
- gResizeScreenTexture = FALSE;
+ glClear(GL_COLOR_BUFFER_BIT);
+ gViewerWindow->mWindow->swapBuffers();
gPipeline.resizeScreenTexture();
-
- if (!for_snapshot)
- {
- return;
- }
+ gResizeScreenTexture = FALSE;
+ gWindowResized = FALSE;
+ return;
}
if (LLPipeline::sRenderDeferred)
@@ -666,11 +660,11 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot) LLVertexBuffer::clientCopy(0.016);
}
- //if (gResizeScreenTexture)
- //{
- // gResizeScreenTexture = FALSE;
- // gPipeline.resizeScreenTexture();
- //}
+ if (gResizeScreenTexture)
+ {
+ gResizeScreenTexture = FALSE;
+ gPipeline.resizeScreenTexture();
+ }
gGL.setColorMask(true, true);
glClearColor(0,0,0,0);
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/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 9ee446bc71..849ac7c830 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -72,6 +72,7 @@ #include "llfloaterlandholdings.h" #include "llfloatermap.h" #include "llfloatermemleak.h" +#include "llfloatermodelwizard.h" #include "llfloaternamedesc.h" #include "llfloaternotificationsconsole.h" #include "llfloateropenobject.h" @@ -251,6 +252,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload"); LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload"); LLFloaterReg::add("upload_model", "floater_model_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelPreview>, "upload"); + LLFloaterReg::add("upload_model_wizard", "floater_model_wizard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterModelWizard>, "upload"); LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>); LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>); 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/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp index 58a31ecffa..14b9a03fd5 100644 --- a/indra/newview/llviewerjointmesh.cpp +++ b/indra/newview/llviewerjointmesh.cpp @@ -62,7 +62,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 | @@ -527,17 +526,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 @@ -586,19 +582,6 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy) gGL.getTexUnit(diffuse_channel)->bind(LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT)); } - if (gRenderForSelect) - { - if (isTransparent()) - { - gGL.getTexUnit(diffuse_channel)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_PREV_COLOR); - gGL.getTexUnit(diffuse_channel)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_CONST_ALPHA); - } - else - { - gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE); - } - } - mFace->mVertexBuffer->setBuffer(sRenderMask); U32 start = mMesh->mFaceVertexOffset; diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index d7e15e7d6c..1aa9fd8a45 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -40,6 +40,7 @@ #include "llviewerwindow.h" #include "llvoavatarself.h" #include "llfloatercamera.h" +#include "llinitparam.h" // // Constants @@ -53,6 +54,11 @@ const S32 NUDGE_FRAMES = 2; const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed const F32 YAW_NUDGE_RATE = 0.05f; // fraction of normal speed +struct LLKeyboardActionRegistry +: public LLRegistrySingleton<std::string, boost::function<void (EKeystate keystate)>, LLKeyboardActionRegistry> +{ +}; + LLViewerKeyboard gViewerKeyboard; void agent_jump( EKeystate s ) @@ -550,52 +556,50 @@ void start_gesture( EKeystate s ) } } -void bind_keyboard_functions() -{ - gViewerKeyboard.bindNamedFunction("jump", agent_jump); - gViewerKeyboard.bindNamedFunction("push_down", agent_push_down); - gViewerKeyboard.bindNamedFunction("push_forward", agent_push_forward); - gViewerKeyboard.bindNamedFunction("push_backward", agent_push_backward); - gViewerKeyboard.bindNamedFunction("look_up", agent_look_up); - gViewerKeyboard.bindNamedFunction("look_down", agent_look_down); - gViewerKeyboard.bindNamedFunction("toggle_fly", agent_toggle_fly); - gViewerKeyboard.bindNamedFunction("turn_left", agent_turn_left); - gViewerKeyboard.bindNamedFunction("turn_right", agent_turn_right); - gViewerKeyboard.bindNamedFunction("slide_left", agent_slide_left); - gViewerKeyboard.bindNamedFunction("slide_right", agent_slide_right); - gViewerKeyboard.bindNamedFunction("spin_around_ccw", camera_spin_around_ccw); - gViewerKeyboard.bindNamedFunction("spin_around_cw", camera_spin_around_cw); - gViewerKeyboard.bindNamedFunction("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); - gViewerKeyboard.bindNamedFunction("spin_around_cw_sitting", camera_spin_around_cw_sitting); - gViewerKeyboard.bindNamedFunction("spin_over", camera_spin_over); - gViewerKeyboard.bindNamedFunction("spin_under", camera_spin_under); - gViewerKeyboard.bindNamedFunction("spin_over_sitting", camera_spin_over_sitting); - gViewerKeyboard.bindNamedFunction("spin_under_sitting", camera_spin_under_sitting); - gViewerKeyboard.bindNamedFunction("move_forward", camera_move_forward); - gViewerKeyboard.bindNamedFunction("move_backward", camera_move_backward); - gViewerKeyboard.bindNamedFunction("move_forward_sitting", camera_move_forward_sitting); - gViewerKeyboard.bindNamedFunction("move_backward_sitting", camera_move_backward_sitting); - gViewerKeyboard.bindNamedFunction("pan_up", camera_pan_up); - gViewerKeyboard.bindNamedFunction("pan_down", camera_pan_down); - gViewerKeyboard.bindNamedFunction("pan_left", camera_pan_left); - gViewerKeyboard.bindNamedFunction("pan_right", camera_pan_right); - gViewerKeyboard.bindNamedFunction("pan_in", camera_pan_in); - gViewerKeyboard.bindNamedFunction("pan_out", camera_pan_out); - gViewerKeyboard.bindNamedFunction("move_forward_fast", camera_move_forward_fast); - gViewerKeyboard.bindNamedFunction("move_backward_fast", camera_move_backward_fast); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_ccw", edit_avatar_spin_ccw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_cw", edit_avatar_spin_cw); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_over", edit_avatar_spin_over); - gViewerKeyboard.bindNamedFunction("edit_avatar_spin_under", edit_avatar_spin_under); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_forward", edit_avatar_move_forward); - gViewerKeyboard.bindNamedFunction("edit_avatar_move_backward", edit_avatar_move_backward); - gViewerKeyboard.bindNamedFunction("stop_moving", stop_moving); - gViewerKeyboard.bindNamedFunction("start_chat", start_chat); - gViewerKeyboard.bindNamedFunction("start_gesture", start_gesture); -} - -LLViewerKeyboard::LLViewerKeyboard() : - mNamedFunctionCount(0) +#define REGISTER_KEYBOARD_ACTION(KEY, ACTION) LLREGISTER_STATIC(LLKeyboardActionRegistry, KEY, ACTION); +REGISTER_KEYBOARD_ACTION("jump", agent_jump); +REGISTER_KEYBOARD_ACTION("push_down", agent_push_down); +REGISTER_KEYBOARD_ACTION("push_forward", agent_push_forward); +REGISTER_KEYBOARD_ACTION("push_backward", agent_push_backward); +REGISTER_KEYBOARD_ACTION("look_up", agent_look_up); +REGISTER_KEYBOARD_ACTION("look_down", agent_look_down); +REGISTER_KEYBOARD_ACTION("toggle_fly", agent_toggle_fly); +REGISTER_KEYBOARD_ACTION("turn_left", agent_turn_left); +REGISTER_KEYBOARD_ACTION("turn_right", agent_turn_right); +REGISTER_KEYBOARD_ACTION("slide_left", agent_slide_left); +REGISTER_KEYBOARD_ACTION("slide_right", agent_slide_right); +REGISTER_KEYBOARD_ACTION("spin_around_ccw", camera_spin_around_ccw); +REGISTER_KEYBOARD_ACTION("spin_around_cw", camera_spin_around_cw); +REGISTER_KEYBOARD_ACTION("spin_around_ccw_sitting", camera_spin_around_ccw_sitting); +REGISTER_KEYBOARD_ACTION("spin_around_cw_sitting", camera_spin_around_cw_sitting); +REGISTER_KEYBOARD_ACTION("spin_over", camera_spin_over); +REGISTER_KEYBOARD_ACTION("spin_under", camera_spin_under); +REGISTER_KEYBOARD_ACTION("spin_over_sitting", camera_spin_over_sitting); +REGISTER_KEYBOARD_ACTION("spin_under_sitting", camera_spin_under_sitting); +REGISTER_KEYBOARD_ACTION("move_forward", camera_move_forward); +REGISTER_KEYBOARD_ACTION("move_backward", camera_move_backward); +REGISTER_KEYBOARD_ACTION("move_forward_sitting", camera_move_forward_sitting); +REGISTER_KEYBOARD_ACTION("move_backward_sitting", camera_move_backward_sitting); +REGISTER_KEYBOARD_ACTION("pan_up", camera_pan_up); +REGISTER_KEYBOARD_ACTION("pan_down", camera_pan_down); +REGISTER_KEYBOARD_ACTION("pan_left", camera_pan_left); +REGISTER_KEYBOARD_ACTION("pan_right", camera_pan_right); +REGISTER_KEYBOARD_ACTION("pan_in", camera_pan_in); +REGISTER_KEYBOARD_ACTION("pan_out", camera_pan_out); +REGISTER_KEYBOARD_ACTION("move_forward_fast", camera_move_forward_fast); +REGISTER_KEYBOARD_ACTION("move_backward_fast", camera_move_backward_fast); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_ccw", edit_avatar_spin_ccw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_cw", edit_avatar_spin_cw); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_over", edit_avatar_spin_over); +REGISTER_KEYBOARD_ACTION("edit_avatar_spin_under", edit_avatar_spin_under); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_forward", edit_avatar_move_forward); +REGISTER_KEYBOARD_ACTION("edit_avatar_move_backward", edit_avatar_move_backward); +REGISTER_KEYBOARD_ACTION("stop_moving", stop_moving); +REGISTER_KEYBOARD_ACTION("start_chat", start_chat); +REGISTER_KEYBOARD_ACTION("start_gesture", start_gesture); +#undef REGISTER_KEYBOARD_ACTION + +LLViewerKeyboard::LLViewerKeyboard() { for (S32 i = 0; i < MODE_COUNT; i++) { @@ -613,16 +617,6 @@ LLViewerKeyboard::LLViewerKeyboard() : } } - -void LLViewerKeyboard::bindNamedFunction(const std::string& name, LLKeyFunc func) -{ - S32 i = mNamedFunctionCount; - mNamedFunctions[i].mName = name; - mNamedFunctions[i].mFunction = func; - mNamedFunctionCount++; -} - - BOOL LLViewerKeyboard::modeFromString(const std::string& string, S32 *mode) { if (string == "FIRST_PERSON") @@ -695,8 +689,9 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { - S32 i,index; - void (*function)(EKeystate keystate) = NULL; + S32 index; + typedef boost::function<void(EKeystate)> function_t; + function_t function = NULL; std::string name; // Allow remapping of F2-F12 @@ -719,13 +714,11 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c } // Not remapped, look for a function - for (i = 0; i < mNamedFunctionCount; i++) + + function_t* result = LLKeyboardActionRegistry::getValue(function_name); + if (result) { - if (function_name == mNamedFunctions[i].mName) - { - function = mNamedFunctions[i].mFunction; - name = mNamedFunctions[i].mName; - } + function = *result; } if (!function) @@ -755,7 +748,6 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c mBindings[mode][index].mKey = key; mBindings[mode][index].mMask = mask; -// mBindings[mode][index].mName = name; mBindings[mode][index].mFunction = function; if (index == mBindingCount[mode]) @@ -764,6 +756,61 @@ BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, c return TRUE; } +LLViewerKeyboard::KeyBinding::KeyBinding() +: key("key"), + mask("mask"), + command("command") +{} + +LLViewerKeyboard::KeyMode::KeyMode(EKeyboardMode _mode) +: bindings("binding"), + mode(_mode) +{} + +LLViewerKeyboard::Keys::Keys() +: first_person("first_person", KeyMode(MODE_FIRST_PERSON)), + third_person("third_person", KeyMode(MODE_THIRD_PERSON)), + edit("edit", KeyMode(MODE_EDIT)), + sitting("sitting", KeyMode(MODE_SITTING)), + edit_avatar("edit_avatar", KeyMode(MODE_EDIT_AVATAR)) +{} + +S32 LLViewerKeyboard::loadBindingsXML(const std::string& filename) +{ + S32 binding_count = 0; + Keys keys; + LLSimpleXUIParser parser; + + if (parser.readXUI(filename, keys) + && keys.validateBlock()) + { + binding_count += loadBindingMode(keys.first_person); + binding_count += loadBindingMode(keys.third_person); + binding_count += loadBindingMode(keys.edit); + binding_count += loadBindingMode(keys.sitting); + binding_count += loadBindingMode(keys.edit_avatar); + } + return binding_count; +} + +S32 LLViewerKeyboard::loadBindingMode(const LLViewerKeyboard::KeyMode& keymode) +{ + S32 binding_count = 0; + for (LLInitParam::ParamIterator<KeyBinding>::const_iterator it = keymode.bindings.begin(), + end_it = keymode.bindings.end(); + it != end_it; + ++it) + { + KEY key; + MASK mask; + LLKeyboard::keyFromString(it->key, &key); + LLKeyboard::maskFromString(it->mask, &mask); + bindKey(keymode.mode, key, mask, it->command); + binding_count++; + } + + return binding_count; +} S32 LLViewerKeyboard::loadBindings(const std::string& filename) { @@ -912,18 +959,18 @@ void LLViewerKeyboard::scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_lev if (key_down && !repeat) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_DOWN ); + binding[i].mFunction( KEYSTATE_DOWN ); } else if (key_up) { // ...key went down this frame, call function - (*binding[i].mFunction)( KEYSTATE_UP ); + binding[i].mFunction( KEYSTATE_UP ); } else if (key_level) { // ...key held down from previous frame // Not windows, just call the function. - (*binding[i].mFunction)( KEYSTATE_LEVEL ); + binding[i].mFunction( KEYSTATE_LEVEL ); }//if }//if }//for diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 2fa5d5dfa6..925244e89b 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -55,26 +55,51 @@ typedef enum e_keyboard_mode void bind_keyboard_functions(); - class LLViewerKeyboard { public: + struct KeyBinding : public LLInitParam::Block<KeyBinding> + { + Mandatory<std::string> key, + mask, + command; + + KeyBinding(); + }; + + struct KeyMode : public LLInitParam::Block<KeyMode> + { + Multiple<KeyBinding> bindings; + EKeyboardMode mode; + KeyMode(EKeyboardMode mode); + }; + + struct Keys : public LLInitParam::Block<Keys> + { + Optional<KeyMode> first_person, + third_person, + edit, + sitting, + edit_avatar; + + Keys(); + }; + LLViewerKeyboard(); BOOL handleKey(KEY key, MASK mask, BOOL repeated); - void bindNamedFunction(const std::string& name, LLKeyFunc func); - S32 loadBindings(const std::string& filename); // returns number bound, 0 on error + S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error EKeyboardMode getMode(); BOOL modeFromString(const std::string& string, S32 *mode); // False on failure void scanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level); -protected: + +private: + S32 loadBindingMode(const LLViewerKeyboard::KeyMode& keymode); BOOL bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name); - S32 mNamedFunctionCount; - LLNamedFunction mNamedFunctions[MAX_NAMED_FUNCTIONS]; // Hold all the ugly stuff torn out to make LLKeyboard non-viewer-specific here S32 mBindingCount[MODE_COUNT]; diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 85c7521492..0cccea7f37 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -492,7 +492,7 @@ std::string LLViewerMedia::getCurrentUserAgent() // Just in case we need to check browser differences in A/B test // builds. - std::string channel = gSavedSettings.getString("VersionChannelName"); + std::string channel = LLVersionInfo::getChannel(); // append our magic version number string to the browser user agent id // See the HTTP 1.0 and 1.1 specifications for allowed formats: @@ -1083,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; diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 1fa99b4a8a..6d2d2fee91 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -45,7 +45,7 @@ #include "llconsole.h" #include "lldebugview.h" #include "llfilepicker.h" -//#include "llfirstuse.h" +#include "llfirstuse.h" #include "llfloaterbuy.h" #include "llfloaterbuycontents.h" #include "llbuycurrencyhtml.h" @@ -190,6 +190,8 @@ BOOL is_selection_buy_not_take(); S32 selection_price(); BOOL enable_take(); void handle_take(); +void handle_object_show_inspector(); +void handle_avatar_show_inspector(); bool confirm_take(const LLSD& notification, const LLSD& response); void handle_buy_object(LLSaleInfo sale_info); @@ -840,6 +842,35 @@ class LLAdvancedCheckFeature : public view_listener_t } }; +void LLDestinationAndAvatarShow(const LLSD& value) +{ + S32 panel_idx = value.isDefined() ? value.asInteger() : -1; + LLView* container = gViewerWindow->getRootView()->getChildView("avatar_picker_and_destination_guide_container"); + LLMediaCtrl* destinations = container->findChild<LLMediaCtrl>("destination_guide_contents"); + LLMediaCtrl* avatar_picker = container->findChild<LLMediaCtrl>("avatar_picker_contents"); + + switch(panel_idx) + { + case 0: + container->setVisible(true); + destinations->setVisible(true); + avatar_picker->setVisible(false); + LLFirstUse::notUsingDestinationGuide(false); + break; + case 1: + container->setVisible(true); + destinations->setVisible(false); + avatar_picker->setVisible(true); + LLFirstUse::notUsingAvatarPicker(false); + break; + default: + container->setVisible(false); + destinations->setVisible(false); + avatar_picker->setVisible(false); + break; + } +}; + ////////////////// // INFO DISPLAY // @@ -2029,7 +2060,7 @@ class LLAdvancedEnableRenderDeferred: public view_listener_t { bool handleEvent(const LLSD& userdata) { - bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT > 0) && + bool new_value = gGLManager.mHasFramebufferObject && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_WINDLIGHT > 0) && LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0; return new_value; } @@ -2042,7 +2073,7 @@ class LLAdvancedEnableRenderDeferredOptions: public view_listener_t { bool handleEvent(const LLSD& userdata) { - bool new_value = gSavedSettings.getBOOL("RenderUseFBO") && gSavedSettings.getBOOL("RenderDeferred"); + bool new_value = gSavedSettings.getBOOL("RenderDeferred"); return new_value; } }; @@ -4301,6 +4332,33 @@ void handle_take() } } +void handle_object_show_inspector() +{ + LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection(); + LLViewerObject* objectp = selection->getFirstRootObject(TRUE); + if (!objectp) + { + return; + } + + LLSD params; + params["object_id"] = objectp->getID(); + LLFloaterReg::showInstance("inspect_object", params); +} + +void handle_avatar_show_inspector() +{ + LLVOAvatar* avatar = find_avatar_from_object( LLSelectMgr::getInstance()->getSelection()->getPrimaryObject() ); + if(avatar) + { + LLSD params; + params["avatar_id"] = avatar->getID(); + LLFloaterReg::showInstance("inspect_avatar", params); + } +} + + + bool confirm_take(const LLSD& notification, const LLSD& response) { S32 option = LLNotificationsUtil::getSelectedOption(notification, response); @@ -6507,16 +6565,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; } }; @@ -7812,6 +7860,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"); @@ -7885,9 +7936,6 @@ void initialize_menus() // 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"); @@ -8063,6 +8111,7 @@ void initialize_menus() view_listener_t::addMenu(new LLAvatarVisibleDebug(), "Avatar.VisibleDebug"); view_listener_t::addMenu(new LLAvatarInviteToGroup(), "Avatar.InviteToGroup"); commit.add("Avatar.Eject", boost::bind(&handle_avatar_eject, LLSD())); + commit.add("Avatar.ShowInspector", boost::bind(&handle_avatar_show_inspector)); view_listener_t::addMenu(new LLAvatarSendIM(), "Avatar.SendIM"); view_listener_t::addMenu(new LLAvatarCall(), "Avatar.Call"); enable.add("Avatar.EnableCall", boost::bind(&LLAvatarActions::canCall)); @@ -8090,6 +8139,7 @@ void initialize_menus() commit.add("Object.Inspect", boost::bind(&handle_object_inspect)); commit.add("Object.Open", boost::bind(&handle_object_open)); commit.add("Object.Take", boost::bind(&handle_take)); + commit.add("Object.ShowInspector", boost::bind(&handle_object_show_inspector)); enable.add("Object.EnableOpen", boost::bind(&enable_object_open)); enable.add("Object.EnableTouch", boost::bind(&enable_object_touch, _1)); enable.add("Object.EnableDelete", boost::bind(&enable_object_delete)); @@ -8149,4 +8199,6 @@ void initialize_menus() view_listener_t::addMenu(new LLEditableSelectedMono(), "EditableSelectedMono"); view_listener_t::addMenu(new LLToggleUIHints(), "ToggleUIHints"); + + commit.add("DestinationAndAvatar.show", boost::bind(&LLDestinationAndAvatarShow, _2)); } diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 6062a443eb..cd5c7fa1b3 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -517,8 +517,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t gSavedSettings.getBOOL("RenderUIInSnapshot"), FALSE)) { - gViewerWindow->playSnapshotAnimAndSound(); - LLPointer<LLImageFormatted> formatted; switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))) { @@ -623,7 +621,7 @@ LLUUID upload_new_resource( "No file extension for the file: '%s'\nPlease make sure the file has a correct file extension", short_name.c_str()); args["FILE"] = short_name; - upload_error(error_message, "NofileExtension", filename, args); + upload_error(error_message, "NoFileExtension", filename, args); return LLUUID(); } else if( exten == "bmp") diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 7827e1a5bd..2f605c07f2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -39,6 +39,7 @@ #include "llfloaterreg.h" #include "llfollowcamparams.h" #include "llinventorydefines.h" +#include "lllslconstants.h" #include "llregionhandle.h" #include "llsdserialize.h" #include "llteleportflags.h" @@ -638,7 +639,7 @@ bool join_group_response(const LLSD& notification, const LLSD& response) if(option == 0 && !group_id.isNull()) { // check for promotion or demotion. - S32 max_groups = MAX_AGENT_GROUPS; + S32 max_groups = gMaxAgentGroups; if(gAgent.isInGroup(group_id)) ++max_groups; if(gAgent.mGroups.count() < max_groups) @@ -2509,15 +2510,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data) invite_bucket = (struct invite_bucket_t*) &binary_bucket[0]; S32 membership_fee = ntohl(invite_bucket->membership_fee); - // IDEVO Clean up legacy name "Resident" in message constructed in - // lldatagroups.cpp - U32 pos = message.find(" has invited you to join a group.\n"); - if (pos != std::string::npos) - { - // use cleaned-up name from above - message = name + message.substr(pos); - } - LLSD payload; payload["transaction_id"] = session_id; payload["group_id"] = from_id; @@ -3040,6 +3032,7 @@ void process_offer_callingcard(LLMessageSystem* msg, void**) } else { + args["NAME"] = source_name; LLNotificationsUtil::add("OfferCallingCard", args, payload); } } @@ -3354,6 +3347,8 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) // then this info is news to us. void process_teleport_start(LLMessageSystem *msg, void**) { + // on teleport, don't tell them about destination guide anymore + LLFirstUse::notUsingDestinationGuide(false); U32 teleport_flags = 0x0; msg->getU32("Info", "TeleportFlags", teleport_flags); @@ -3875,6 +3870,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); @@ -6443,8 +6439,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) { @@ -6457,7 +6467,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())); } @@ -6678,6 +6688,8 @@ void process_initiate_download(LLMessageSystem* msg, void**) void process_script_teleport_request(LLMessageSystem* msg, void**) { + if (!gSavedSettings.getBOOL("ScriptsCanShowUI")) return; + std::string object_name; std::string sim_name; LLVector3 pos; diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h index 6ff893f543..b4a9b8e677 100644 --- a/indra/newview/llviewermessage.h +++ b/indra/newview/llviewermessage.h @@ -117,7 +117,6 @@ void process_alert_core(const std::string& message, BOOL modal); typedef std::list<LLMeanCollisionData*> mean_collision_list_t; extern mean_collision_list_t gMeanCollisionList; -void handle_show_mean_events(void *); void process_mean_collision_alert_message(LLMessageSystem* msg, void**); void process_frozen_message(LLMessageSystem* msg, void**); diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 8d9f27556d..1209183229 100644 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -105,8 +105,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; @@ -117,6 +117,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 @@ -212,6 +217,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), @@ -1868,7 +1874,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, new_rot.normQuat(); - if (gPingInterpolate) + if (sPingInterpolate) { LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mesgsys->getSender()); if (cdp) @@ -1889,6 +1895,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) @@ -1898,6 +1906,7 @@ U32 LLViewerObject::processUpdateMessage(LLMessageSystem *mesgsys, } mLatestRecvPacketID = packet_id; + mCircuitPacketCount = 0; // Set the change flags for scale if (new_scale != getScale()) @@ -2029,7 +2038,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! @@ -2056,6 +2065,8 @@ BOOL LLViewerObject::isActive() const return TRUE; } + + BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) { static LLFastTimer::DeclareTimer ftm("Viewer Object"); @@ -2069,7 +2080,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); @@ -2159,33 +2170,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); } } @@ -2201,6 +2187,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); @@ -5112,6 +5250,7 @@ void LLViewerObject::setRegion(LLViewerRegion *regionp) } mLatestRecvPacketID = 0; + mCircuitPacketCount = 0; mRegionp = regionp; for (child_list_t::iterator i = mChildList.begin(); i != mChildList.end(); ++i) @@ -5124,6 +5263,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 f068b36358..3ba51a6448 100644 --- a/indra/newview/llviewerobject.h +++ b/indra/newview/llviewerobject.h @@ -487,7 +487,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); @@ -538,6 +538,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. @@ -655,6 +658,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; @@ -719,9 +724,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 //-------------------------------------------------------------------- @@ -792,7 +809,5 @@ public: 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 bf3d4d0107..7682d71e7f 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -843,9 +843,24 @@ private: 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 @@ -1640,34 +1655,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 64034091d3..2c5f789eb1 100644 --- a/indra/newview/llviewerobjectlist.h +++ b/indra/newview/llviewerobjectlist.h @@ -120,7 +120,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/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index 11de377410..fccd1156d3 100644 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -850,7 +850,7 @@ LLParcel* LLViewerParcelMgr::getCollisionParcel() const void LLViewerParcelMgr::render() { - if (mSelected && mRenderSelection) + if (mSelected && mRenderSelection && gSavedSettings.getBOOL("RenderParcelSelection")) { // Rendering is done in agent-coordinates, so need to supply // an appropriate offset to the render code. @@ -1784,8 +1784,7 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use void optionally_start_music(const std::string& music_url) { - if (gSavedSettings.getBOOL("AudioStreamingMusic") && - gSavedSettings.getBOOL("AudioStreamingMedia")) + if (gSavedSettings.getBOOL("AudioStreamingMusic")) { // only play music when you enter a new parcel if the UI control for this // was not *explicitly* stopped by the user. (part of SL-4878) diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 3f6082885c..75caf45175 100644 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -1410,6 +1410,8 @@ void LLViewerRegion::setSeedCapability(const std::string& url) capabilityNames.append("SimConsole"); capabilityNames.append("SimulatorFeatures"); capabilityNames.append("SetDisplayName"); + capabilityNames.append("SimConsole"); + capabilityNames.append("SimConsoleAsync"); capabilityNames.append("StartGroupProposal"); capabilityNames.append("TextureStats"); capabilityNames.append("UntrustedSimulatorMessage"); diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index a16257940e..7c84357de8 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -415,9 +415,6 @@ void LLViewerShaderMgr::setShaders() deferred_class = 1; } - //make sure framebuffer objects are enabled - gSavedSettings.setBOOL("RenderUseFBO", TRUE); - //make sure hardware skinning is enabled gSavedSettings.setBOOL("RenderAvatarVP", TRUE); diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 93450303ea..09d25af349 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -48,6 +48,7 @@ #include "llagent.h" #include "llagentcamera.h" #include "llviewercontrol.h" +#include "llversioninfo.h" #include "llfloatertools.h" #include "lldebugview.h" #include "llfasttimerview.h" @@ -750,7 +751,7 @@ void send_stats() // send fps only for time app spends in foreground agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); - agent["version"] = gCurrentVersion; + agent["version"] = LLVersionInfo::getChannelAndVersion(); std::string language = LLUI::getLanguage(); agent["language"] = language; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index 9173ea4176..092edafdbb 100644..100755 --- 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) ; } } @@ -1492,57 +1501,56 @@ void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height) //virtual void LLViewerFetchedTexture::processTextureStats() { - static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); - if(mFullyLoaded) - { - if(needsToSaveRawImage())//needs to reload + { + if(mDesiredDiscardLevel > mMinDesiredDiscardLevel)//need to load more { + mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ; mFullyLoaded = FALSE ; } - else - { - return ; - } - } - - //updateVirtualSize() ; - - if (textures_fullres) - { - mDesiredDiscardLevel = 0; - } - else if(!mFullWidth || !mFullHeight) - { - mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ; } else - { - if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) + { + updateVirtualSize() ; + + static LLCachedControl<bool> textures_fullres(gSavedSettings,"TextureLoadFullRes"); + + if (textures_fullres) + { + mDesiredDiscardLevel = 0; + } + else if(!mFullWidth || !mFullHeight) { - if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) + mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel) ; + } + else + { + if(!mKnownDrawWidth || !mKnownDrawHeight || mFullWidth <= mKnownDrawWidth || mFullHeight <= mKnownDrawHeight) { - mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + 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 + 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)) { - mDesiredDiscardLevel = 0; + mFullyLoaded = TRUE ; } } - 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. { @@ -1856,10 +1864,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) && @@ -2710,6 +2719,9 @@ void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard, bool from_ } void LLViewerFetchedTexture::destroySavedRawImage() { + mForceToSaveRawImage = FALSE ; + mSaveRawImage = FALSE ; + clearCallbackEntryList() ; mSavedRawImage = NULL ; @@ -3083,9 +3095,10 @@ void LLViewerLODTexture::scaleDown() { switchToCachedImage() ; - if(LLViewerTextureManager::sTesterp) + LLTexturePipelineTester* tester = (LLTexturePipelineTester*)LLMetricPerformanceTesterBasic::getTester(sTesterName); + if (tester) { - LLViewerTextureManager::sTesterp->setStablizingTime() ; + tester->setStablizingTime() ; } } } @@ -3595,23 +3608,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 ; @@ -3623,7 +3635,7 @@ LLTexturePipelineTester::LLTexturePipelineTester() : LLTexturePipelineTester::~LLTexturePipelineTester() { - LLViewerTextureManager::sTesterp = NULL ; + LLViewerTextureManager::sTesterp = NULL; } void LLTexturePipelineTester::update() @@ -3689,22 +3701,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) @@ -3793,7 +3806,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) ; @@ -3848,7 +3861,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) @@ -3875,12 +3888,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()) { @@ -3946,7 +3958,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 b779396293..b5636bbdc7 100644 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -735,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 { @@ -751,8 +751,6 @@ public: void updateGrayTextureBinding() ; void setStablizingTime() ; - /*virtual*/ void analyzePerformance(std::ofstream* os, LLSD* base, LLSD* current) ; - private: void reset() ; void updateStablizingTime() ; @@ -823,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 275dfaa996..10126219f8 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1531,42 +1531,45 @@ bool LLUIImageList::initFromFile() return false; } - std::vector<std::string> paths; - // path to current selected skin - paths.push_back(gDirUtilp->getSkinDir() - + gDirUtilp->getDirDelimiter() - + "textures" - + gDirUtilp->getDirDelimiter() - + "textures.xml"); - // path to user overrides on current skin - paths.push_back(gDirUtilp->getUserSkinDir() - + gDirUtilp->getDirDelimiter() - + "textures" - + gDirUtilp->getDirDelimiter() - + "textures.xml"); - - // apply skinned xml files incrementally - for(std::vector<std::string>::iterator path_it = paths.begin(); - path_it != paths.end(); - ++path_it) - { - // don't reapply base file to itself - if (!path_it->empty() && (*path_it) != base_file_path) - { - LLXMLNodePtr update_root; - if (LLXMLNode::parseFile(*path_it, update_root, NULL)) - { - LLXMLNode::updateNode(root, update_root); - } - } - } - UIImageDeclarations images; LLXUIParser parser; parser.readXUI(root, images, base_file_path); + // add components defined in current skin + std::string skin_update_path = gDirUtilp->getSkinDir() + + gDirUtilp->getDirDelimiter() + + "textures" + + gDirUtilp->getDirDelimiter() + + "textures.xml"; + LLXMLNodePtr update_root; + if (skin_update_path != base_file_path + && LLXMLNode::parseFile(skin_update_path, update_root, NULL)) + { + parser.readXUI(update_root, images, skin_update_path); + } + + // add components defined in user override of current skin + skin_update_path = gDirUtilp->getUserSkinDir() + + gDirUtilp->getDirDelimiter() + + "textures" + + gDirUtilp->getDirDelimiter() + + "textures.xml"; + if (skin_update_path != base_file_path + && LLXMLNode::parseFile(skin_update_path, update_root, NULL)) + { + parser.readXUI(update_root, images, skin_update_path); + } + if (!images.validateBlock()) return false; + std::map<std::string, UIImageDeclaration> merged_declarations; + for (LLInitParam::ParamIterator<UIImageDeclaration>::const_iterator image_it = images.textures.begin(); + image_it != images.textures.end(); + ++image_it) + { + merged_declarations[image_it->name].overwriteFrom(*image_it); + } + enum e_decode_pass { PASS_DECODE_NOW, @@ -1576,19 +1579,20 @@ 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 (std::map<std::string, UIImageDeclaration>::const_iterator image_it = merged_declarations.begin(); + image_it != merged_declarations.end(); ++image_it) { - std::string file_name = image_it->file_name.isProvided() ? image_it->file_name() : image_it->name(); + const UIImageDeclaration& image = image_it->second; + std::string file_name = image.file_name.isProvided() ? image.file_name() : image.name(); // load high priority textures on first pass (to kick off decode) - enum e_decode_pass decode_pass = image_it->preload ? PASS_DECODE_NOW : PASS_DECODE_LATER; + enum e_decode_pass decode_pass = image.preload ? PASS_DECODE_NOW : PASS_DECODE_LATER; if (decode_pass != cur_pass) { continue; } - preloadUIImage(image_it->name, file_name, image_it->use_mips, image_it->scale); + preloadUIImage(image.name, file_name, image.use_mips, image.scale); } if (cur_pass == PASS_DECODE_NOW && !gSavedSettings.getBOOL("NoPreload")) 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 972c9c255e..c929691d2d 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1430,13 +1430,22 @@ LLViewerWindow::LLViewerWindow( gSavedSettings.getBOOL("DisableVerticalSync"), !gNoRender, ignore_pixel_depth, - gSavedSettings.getBOOL("RenderUseFBO") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled + gSavedSettings.getBOOL("RenderDeferred") ? 0 : gSavedSettings.getU32("RenderFSAASamples")); //don't use window level anti-aliasing if FBOs are enabled if (!LLAppViewer::instance()->restoreErrorTrap()) { LL_WARNS("Window") << " Someone took over my signal/exception handler (post createWindow)!" << LL_ENDL; } + LLCoordScreen scr; + mWindow->getSize(&scr); + + if(fullscreen && ( scr.mX!=width || scr.mY!=height)) + { + llwarns << "Fullscreen has forced us in to a different resolution now using "<<scr.mX<<" x "<<scr.mY<<llendl; + gSavedSettings.setS32("FullScreenWidth",scr.mX); + gSavedSettings.setS32("FullScreenHeight",scr.mY); + } if (NULL == mWindow) { @@ -1448,7 +1457,7 @@ LLViewerWindow::LLViewerWindow( LL_WARNS("Window") << "Unable to create window, be sure screen is set at 32-bit color in Control Panels->Display->Settings" << LL_ENDL; #endif - LLAppViewer::instance()->forceExit(1); + LLAppViewer::instance()->fastQuit(1); } // Get the real window rect the window was created with (since there are various OS-dependent reasons why @@ -1615,8 +1624,9 @@ 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->findChild<LLPopupView>("popup_holder"); + mPopupView = main_view->getChild<LLPopupView>("popup_holder"); mHintHolder = main_view->getChild<LLView>("hint_holder")->getHandle(); + mLoginPanelHolder = main_view->getChild<LLView>("login_panel_holder")->getHandle(); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild<LLFloaterView>("Floater View"); @@ -1750,7 +1760,7 @@ void LLViewerWindow::initWorldUI() { LLRect hud_rect = full_window; hud_rect.mBottom += 50; - if (gMenuBarView) + if (gMenuBarView && gMenuBarView->isInVisibleChain()) { hud_rect.mTop -= gMenuBarView->getRect().getHeight(); } @@ -1779,6 +1789,20 @@ void LLViewerWindow::initWorldUI() buttons_panel->setShape(buttons_panel_container->getLocalRect()); buttons_panel->setFollowsAll(); buttons_panel_container->addChild(buttons_panel); + + LLView* avatar_picker_destination_guide_container = gViewerWindow->getRootView()->getChild<LLView>("avatar_picker_and_destination_guide_container"); + LLMediaCtrl* destinations = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("destination_guide_contents"); + LLMediaCtrl* avatar_picker = avatar_picker_destination_guide_container->findChild<LLMediaCtrl>("avatar_picker_contents"); + if (destinations) + { + destinations->navigateTo(gSavedSettings.getString("DestinationGuideURL"), "text/html"); + } + + if (avatar_picker) + { + avatar_picker->navigateTo(gSavedSettings.getString("AvatarPickerURL"), "text/html"); + } + } // Destroy the UI @@ -1933,6 +1957,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; @@ -2334,6 +2360,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)) @@ -2534,6 +2574,10 @@ void LLViewerWindow::updateUI() { LLFirstUse::notUsingDestinationGuide(); } + if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("AvatarPickerHintTimeout")) + { + LLFirstUse::notUsingAvatarPicker(); + } if (gLoggedInTime.getElapsedTimeF32() > gSavedSettings.getF32("SidePanelHintTimeout")) { LLFirstUse::notUsingSidePanel(); @@ -3031,18 +3075,20 @@ void LLViewerWindow::updateKeyboardFocus() LLUICtrl* parent = cur_focus->getParentUICtrl(); const LLUICtrl* focus_root = cur_focus->findRootMostFocusRoot(); + bool new_focus_found = false; while(parent) { - if (parent->isCtrl() && - (parent->hasTabStop() || parent == focus_root) && - !parent->getIsChrome() && - parent->isInVisibleChain() && - parent->isInEnabledChain()) + if (parent->isCtrl() + && (parent->hasTabStop() || parent == focus_root) + && !parent->getIsChrome() + && parent->isInVisibleChain() + && parent->isInEnabledChain()) { if (!parent->focusFirstItem()) { parent->setFocus(TRUE); } + new_focus_found = true; break; } parent = parent->getParentUICtrl(); @@ -3051,7 +3097,7 @@ void LLViewerWindow::updateKeyboardFocus() // if we didn't find a better place to put focus, just release it // hasFocus() will return true if and only if we didn't touch focus since we // are only moving focus higher in the hierarchy - if (cur_focus->hasFocus()) + if (!new_focus_found) { cur_focus->setFocus(FALSE); } @@ -3549,6 +3595,8 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de LLVector3 mouse_world_start = mouse_point_global; LLVector3 mouse_world_end = mouse_point_global + mouse_direction_global * depth; + //gDebugRaycastIntersection = mouse_world_end; + if (start) { *start = mouse_world_start; @@ -3570,8 +3618,7 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de { found = this_object; } - } - + } else // is a world object { if (this_object->lineSegmentIntersect(mouse_world_start, mouse_world_end, this_face, pick_transparent, @@ -3579,21 +3626,22 @@ LLViewerObject* LLViewerWindow::cursorIntersect(S32 mouse_x, S32 mouse_y, F32 de { found = this_object; } - } - } - + } + } else // check ALL objects - { + { found = gPipeline.lineSegmentIntersectInHUD(mouse_hud_start, mouse_hud_end, pick_transparent, face_hit, intersection, uv, normal, binormal); if (!found) // if not found in HUD, look in world: - - { + { found = gPipeline.lineSegmentIntersectInWorld(mouse_world_start, mouse_world_end, pick_transparent, face_hit, intersection, uv, normal, binormal); + if (found) + { + gDebugRaycastIntersection = *intersection; } - + } } return found; @@ -4092,30 +4140,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, TRUE); - } - else - { - display(do_rebuild, scale_factor, subfield, TRUE); + 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); - } + render_ui(scale_factor, subfield); } S32 subimage_x_offset = llclamp(buffer_x_offset - (subimage_x * window_width), 0, window_width); @@ -4138,7 +4175,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, @@ -4181,7 +4218,7 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei { mWindowRectRaw = window_rect; target.flush(); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } gDisplaySwapBuffers = FALSE; gDepthDirty = TRUE; @@ -4359,17 +4396,8 @@ void LLViewerWindow::setup3DRender() void LLViewerWindow::setup3DViewport(S32 x_offset, S32 y_offset) { - if (LLRenderTarget::getCurrentBoundTarget() != NULL) - { - // don't use translation component of mWorldViewRectRaw, as we are already in a properly sized render target - gGLViewport[0] = x_offset; - gGLViewport[1] = y_offset; - } - else - { - gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset; - gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset; - } + gGLViewport[0] = mWorldViewRectRaw.mLeft + x_offset; + gGLViewport[1] = mWorldViewRectRaw.mBottom + y_offset; gGLViewport[2] = mWorldViewRectRaw.getWidth(); gGLViewport[3] = mWorldViewRectRaw.getHeight(); glViewport(gGLViewport[0], gGLViewport[1], gGLViewport[2], gGLViewport[3]); @@ -4522,6 +4550,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 f0b36bb7b1..348cdbeb4c 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -288,6 +288,7 @@ public: LLView* getNonSideTrayView() { return mNonSideTrayView.get(); } LLView* getFloaterViewHolder() { return mFloaterViewHolder.get(); } LLView* getHintHolder() { return mHintHolder.get(); } + LLView* getLoginPanelHolder() { return mLoginPanelHolder.get(); } BOOL handleKey(KEY key, MASK mask); void handleScrollWheel (S32 clicks); @@ -316,8 +317,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, @@ -450,6 +450,7 @@ protected: 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 + LLHandle<LLView> mLoginPanelHolder; // container for login panel 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 9fc19fc915..9aa86ebed0 100644 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2355,8 +2355,19 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time) void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled) { - // disable voice visualizer when in mouselook - mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgentCamera.cameraMouselook()) ); + bool render_visualizer = voice_enabled; + + // Don't render the user's own voice visualizer when in mouselook, or when opening the mic is disabled. + if(isSelf()) + { + if(gAgentCamera.cameraMouselook() || gSavedSettings.getBOOL("VoiceDisableMic")) + { + render_visualizer = false; + } + } + + mVoiceVisualizer->setVoiceEnabled(render_visualizer); + if ( voice_enabled ) { //---------------------------------------------------------------- @@ -3056,7 +3067,7 @@ void LLVOAvatar::idleUpdateNameTagText(BOOL new_name) std::deque<LLChat>::iterator chat_iter = mChats.begin(); mNameText->clearString(); - LLColor4 new_chat = LLUIColorTable::instance().getColor( "NameTagChat" ); + LLColor4 new_chat = LLUIColorTable::instance().getColor( isSelf() ? "UserChatColor" : "AgentChatColor" ); 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) @@ -3447,14 +3458,14 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) LLVector3d ground_under_pelvis; if (isSelf()) - {
- if ( !mHasPelvisOffset )
- {
- gAgent.setPositionAgent(getRenderPosition());
- }
- else
- {
- gAgent.setPositionAgent( getRenderPosition() + mPelvisOffset );
+ { + if ( !mHasPelvisOffset ) + { + gAgent.setPositionAgent(getRenderPosition()); + } + else + { + gAgent.setPositionAgent( getRenderPosition() + mPelvisOffset ); } } @@ -3472,22 +3483,22 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent) mInAir = in_air; // correct for the fact that the pelvis is not necessarily the center - // of the agent's physical representation
+ // of the agent's physical representation root_pos.mdV[VZ] -= (0.5f * mBodySize.mV[VZ]) - mPelvisToFoot; LLVector3 newPosition = gAgent.getPosAgentFromGlobal(root_pos); if (newPosition != mRoot.getXform()->getWorldPosition()) { - if ( !mHasPelvisOffset )
- {
- mRoot.touch();
- mRoot.setWorldPosition( newPosition ); // regular update
- }
- else
- {
- mRoot.touch();
- mRoot.setWorldPosition( newPosition + mPelvisOffset );
+ if ( !mHasPelvisOffset ) + { + mRoot.touch(); + mRoot.setWorldPosition( newPosition ); // regular update + } + else + { + mRoot.touch(); + mRoot.setWorldPosition( newPosition + mPelvisOffset ); } } @@ -3792,21 +3803,21 @@ void LLVOAvatar::updateHeadOffset() //------------------------------------------------------------------------ // setPelvisOffset //------------------------------------------------------------------------ -void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount )
-{
- mHasPelvisOffset = hasOffset;
- if ( mHasPelvisOffset )
- {
- mPelvisOffset = offsetAmount;
- }
-}
+void LLVOAvatar::setPelvisOffset( bool hasOffset, const LLVector3& offsetAmount ) +{ + mHasPelvisOffset = hasOffset; + if ( mHasPelvisOffset ) + { + mPelvisOffset = offsetAmount; + } +} //------------------------------------------------------------------------ // postPelvisSetRecalc //------------------------------------------------------------------------ void LLVOAvatar::postPelvisSetRecalc( void ) { - computeBodySize();
- mRoot.updateWorldMatrixChildren();
+ computeBodySize(); + mRoot.updateWorldMatrixChildren(); dirtyMesh(); updateHeadOffset(); } @@ -4099,7 +4110,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]); @@ -4946,6 +4957,7 @@ void LLVOAvatar::resetJointPositions( void ) for(S32 i = 0; i < (S32)mNumJoints; ++i) { mSkeleton[i].restoreOldXform(); + mSkeleton[i].setId( LLUUID::null ); } mHasPelvisOffset = false; } @@ -4972,10 +4984,11 @@ void LLVOAvatar::resetJointPositionsToDefault( void ) for( S32 i = 0; i < (S32)mNumJoints; ++i ) { LLJoint* pJoint = (LLJoint*)&mSkeleton[i]; + pJoint->setId( LLUUID::null ); //restore joints to default positions, however skip over the pelvis if ( pJoint && pPelvis != pJoint ) { - pJoint->restoreToDefaultXform(); + pJoint->restoreOldXform(); } } //make sure we don't apply the joint offset @@ -5974,6 +5987,24 @@ void LLVOAvatar::resetHUDAttachments() } } +void LLVOAvatar::rebuildRiggedAttachments( void ) +{ + for ( attachment_map_t::iterator iter = mAttachmentPoints.begin(); iter != mAttachmentPoints.end(); ++iter ) + { + LLViewerJointAttachment* pAttachment = iter->second; + LLViewerJointAttachment::attachedobjs_vec_t::iterator attachmentIterEnd = pAttachment->mAttachedObjects.end(); + + for ( LLViewerJointAttachment::attachedobjs_vec_t::iterator attachmentIter = pAttachment->mAttachedObjects.begin(); + attachmentIter != attachmentIterEnd; ++attachmentIter) + { + const LLViewerObject* pAttachedObject = *attachmentIter; + if ( pAttachment && pAttachedObject->mDrawable.notNull() ) + { + gPipeline.markRebuild(pAttachedObject->mDrawable); + } + } + } +} //----------------------------------------------------------------------------- // detachObject() //----------------------------------------------------------------------------- @@ -8028,6 +8059,7 @@ BOOL LLVOAvatar::LLVOAvatarXmlInfo::parseXmlMorphNodes(LLXmlTreeNode* root) //virtual void LLVOAvatar::updateRegion(LLViewerRegion *regionp) { + LLViewerObject::updateRegion(regionp); } std::string LLVOAvatar::getFullname() const diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h index 833c30d6db..2e41940f28 100644 --- a/indra/newview/llvoavatar.h +++ b/indra/newview/llvoavatar.h @@ -690,6 +690,7 @@ public: protected:
LLViewerJointAttachment* getTargetAttachmentPoint(LLViewerObject* viewer_object);
void lazyAttach();
+ void rebuildRiggedAttachments( void );
//--------------------------------------------------------------------
// Map of attachment points, by ID
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp index 0993c55706..935bd4a588 100644 --- a/indra/newview/llvoavatarself.cpp +++ b/indra/newview/llvoavatarself.cpp @@ -625,6 +625,7 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent) mScreenp->updateWorldMatrixChildren(); resetHUDAttachments(); } + LLVOAvatar::rebuildRiggedAttachments(); return LLVOAvatar::updateCharacter(agent); } @@ -650,10 +651,10 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name) } return LLVOAvatar::getJoint(name); } - +//virtual void LLVOAvatarSelf::resetJointPositions( void ) { - return LLVOAvatar::resetJointPositionsToDefault(); + return LLVOAvatar::resetJointPositions(); } // virtual BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake ) @@ -789,11 +790,19 @@ void LLVOAvatarSelf::removeMissingBakedTextures() for (U32 i = 0; i < mBakedTextureDatas.size(); i++) { const S32 te = mBakedTextureDatas[i].mTextureIndex; - LLViewerTexture* tex = getTEImage(te) ; + const LLViewerTexture* tex = getTEImage(te); + + // Replace with default if we can't find the asset, assuming the + // default is actually valid (which it should be unless something + // is seriously wrong). if (!tex || tex->isMissingAsset()) { - setTEImage(te, LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR)); - removed = TRUE; + LLViewerTexture *imagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR); + if (imagep) + { + setTEImage(te, imagep); + removed = TRUE; + } } } @@ -812,7 +821,23 @@ 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) @@ -826,6 +851,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) { @@ -833,6 +861,7 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp) } } mRegionCrossingTimer.reset(); + LLViewerObject::updateRegion(regionp); } //-------------------------------------------------------------------- @@ -1133,7 +1162,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object) const int bindCnt = pSkinData->mAlternateBindMatrix.size(); if ( bindCnt > 0 ) { - resetJointPositions(); + LLVOAvatar::resetJointPositionsToDefault(); } } } diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h index 141a419fc8..51f06dee5f 100644 --- a/indra/newview/llvoavatarself.h +++ b/indra/newview/llvoavatarself.h @@ -125,6 +125,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 1cb3962daa..145ee31260 100644 --- a/indra/newview/llvocache.cpp +++ b/indra/newview/llvocache.cpp @@ -224,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"; @@ -296,9 +295,9 @@ void LLVOCache::initCache(ELLPath location, U32 size, U32 cache_version) if (!mReadOnly) { LLFile::mkdir(mObjectCacheDirName); - } - mCacheSize = llclamp(size, - MAX_NUM_OBJECT_ENTRIES, NUM_ENTRIES_TO_PURGE); + } + + mCacheSize = size; mMetaInfo.mVersion = cache_version; readCacheHeader(); @@ -434,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))) @@ -487,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))) diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 6c44f639ec..730f022c50 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -35,6 +35,7 @@ #include "llnotificationsutil.h" #include "llsdserialize.h" #include "llui.h" +#include "llkeyboard.h" const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; @@ -113,8 +114,18 @@ LLVoiceClient::LLVoiceClient() mVoiceModule(NULL), m_servicePump(NULL), mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")), - mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")) + mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault")), + mPTTDirty(true), + mPTT(true), + mUsePTT(true), + mPTTIsMiddleMouse(false), + mPTTKey(0), + mPTTIsToggle(false), + mUserPTTState(false), + mMuteMic(false), + mDisableMic(false) { + updateSettings(); } //--------------------------------------------------- @@ -173,6 +184,14 @@ const LLVoiceVersionInfo LLVoiceClient::getVersion() void LLVoiceClient::updateSettings() { + setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); + std::string keyString = gSavedSettings.getString("PushToTalkButton"); + setPTTKey(keyString); + setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); + mDisableMic = gSavedSettings.getBOOL("VoiceDisableMic"); + + updateMicMuteLogic(); + if (mVoiceModule) mVoiceModule->updateSettings(); } @@ -481,6 +500,26 @@ void LLVoiceClient::setVoiceEnabled(bool enabled) if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled); } +void LLVoiceClient::updateMicMuteLogic() +{ + // If not configured to use PTT, the mic should be open (otherwise the user will be unable to speak). + bool new_mic_mute = false; + + if(mUsePTT) + { + // If configured to use PTT, track the user state. + new_mic_mute = !mUserPTTState; + } + + if(mMuteMic || mDisableMic) + { + // Either of these always overrides any other PTT setting. + new_mic_mute = true; + } + + if (mVoiceModule) mVoiceModule->setMuteMic(new_mic_mute); +} + void LLVoiceClient::setLipSyncEnabled(BOOL enabled) { if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled); @@ -500,7 +539,8 @@ BOOL LLVoiceClient::lipSyncEnabled() void LLVoiceClient::setMuteMic(bool muted) { - if (mVoiceModule) mVoiceModule->setMuteMic(muted); + mMuteMic = muted; + updateMicMuteLogic(); } @@ -509,64 +549,116 @@ void LLVoiceClient::setMuteMic(bool muted) void LLVoiceClient::setUserPTTState(bool ptt) { - if (mVoiceModule) mVoiceModule->setUserPTTState(ptt); + mUserPTTState = ptt; + updateMicMuteLogic(); } bool LLVoiceClient::getUserPTTState() { - if (mVoiceModule) - { - return mVoiceModule->getUserPTTState(); - } - else - { - return false; - } + return mUserPTTState; } void LLVoiceClient::setUsePTT(bool usePTT) { - if (mVoiceModule) mVoiceModule->setUsePTT(usePTT); + if(usePTT && !mUsePTT) + { + // When the user turns on PTT, reset the current state. + mUserPTTState = false; + } + mUsePTT = usePTT; + + updateMicMuteLogic(); } void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle) { - if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle); + if(!PTTIsToggle && mPTTIsToggle) + { + // When the user turns off toggle, reset the current state. + mUserPTTState = false; + } + + mPTTIsToggle = PTTIsToggle; + + updateMicMuteLogic(); } bool LLVoiceClient::getPTTIsToggle() { - if (mVoiceModule) + return mPTTIsToggle; +} + +void LLVoiceClient::setPTTKey(std::string &key) +{ + if(key == "MiddleMouse") { - return mVoiceModule->getPTTIsToggle(); + mPTTIsMiddleMouse = true; } - else { - return false; + else + { + mPTTIsMiddleMouse = false; + if(!LLKeyboard::keyFromString(key, &mPTTKey)) + { + // If the call failed, don't match any key. + key = KEY_NONE; + } } - } void LLVoiceClient::inputUserControlState(bool down) { - if (mVoiceModule) mVoiceModule->inputUserControlState(down); + if(mPTTIsToggle) + { + if(down) // toggle open-mic state on 'down' + { + toggleUserPTTState(); + } + } + else // set open-mic state as an absolute + { + setUserPTTState(down); + } } void LLVoiceClient::toggleUserPTTState(void) { - if (mVoiceModule) mVoiceModule->toggleUserPTTState(); + setUserPTTState(!getUserPTTState()); } void LLVoiceClient::keyDown(KEY key, MASK mask) { - if (mVoiceModule) mVoiceModule->keyDown(key, mask); + if (gKeyboard->getKeyRepeated(key)) + { + // ignore auto-repeat keys + return; + } + + if(!mPTTIsMiddleMouse) + { + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } + } void LLVoiceClient::keyUp(KEY key, MASK mask) { - if (mVoiceModule) mVoiceModule->keyUp(key, mask); + if(!mPTTIsMiddleMouse) + { + bool down = (mPTTKey != KEY_NONE) + && gKeyboard->getKeyDown(mPTTKey); + inputUserControlState(down); + } } void LLVoiceClient::middleMouseState(bool down) { - if (mVoiceModule) mVoiceModule->middleMouseState(down); + if(mPTTIsMiddleMouse) + { + if(mPTTIsMiddleMouse) + { + inputUserControlState(down); + } + } } diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h index 24d7d7163e..c9aeea35a9 100644 --- a/indra/newview/llvoiceclient.h +++ b/indra/newview/llvoiceclient.h @@ -191,25 +191,9 @@ public: virtual void setVoiceEnabled(bool enabled)=0; virtual void setLipSyncEnabled(BOOL enabled)=0; virtual BOOL lipSyncEnabled()=0; - virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + virtual void setMuteMic(bool muted)=0; // Set the mute state of the local mic. //@} - - //////////////////////// - /// @name PTT - //@{ - virtual void setUserPTTState(bool ptt)=0; - virtual bool getUserPTTState()=0; - virtual void setUsePTT(bool usePTT)=0; - virtual void setPTTIsToggle(bool PTTIsToggle)=0; - virtual bool getPTTIsToggle()=0; - virtual void toggleUserPTTState(void)=0; - virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs - - virtual void keyDown(KEY key, MASK mask)=0; - virtual void keyUp(KEY key, MASK mask)=0; - virtual void middleMouseState(bool down)=0; - //@} - + ////////////////////////// /// @name nearby speaker accessors //@{ @@ -406,6 +390,9 @@ public: void setUsePTT(bool usePTT); void setPTTIsToggle(bool PTTIsToggle); bool getPTTIsToggle(); + void setPTTKey(std::string &key); + + void updateMicMuteLogic(); BOOL lipSyncEnabled(); @@ -471,6 +458,17 @@ protected: LLCachedControl<bool> mVoiceEffectEnabled; LLCachedControl<std::string> mVoiceEffectDefault; + + bool mPTTDirty; + bool mPTT; + + bool mUsePTT; + bool mPTTIsMiddleMouse; + KEY mPTTKey; + bool mPTTIsToggle; + bool mUserPTTState; + bool mMuteMic; + bool mDisableMic; }; /** diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp index 03e2da28b5..daaf2a4e96 100644 --- a/indra/newview/llvoicevivox.cpp +++ b/indra/newview/llvoicevivox.cpp @@ -46,7 +46,6 @@ #include "llviewernetwork.h" // for gGridChoice #include "llbase64.h" #include "llviewercontrol.h" -#include "llkeyboard.h" #include "llappviewer.h" // for gDisconnected, gDisableVoice // Viewer includes @@ -326,14 +325,8 @@ LLVivoxVoiceClient::LLVivoxVoiceClient() : mRenderDeviceDirty(false), mSpatialCoordsDirty(false), - mPTTDirty(true), - mPTT(true), - mUsePTT(true), - mPTTIsMiddleMouse(false), - mPTTKey(0), - mPTTIsToggle(false), - mUserPTTState(false), mMuteMic(false), + mMuteMicDirty(false), mFriendsListDirty(true), mEarLocation(0), @@ -435,10 +428,6 @@ const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion() void LLVivoxVoiceClient::updateSettings() { setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat")); - setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled")); - std::string keyString = gSavedSettings.getString("PushToTalkButton"); - setPTTKey(keyString); - setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle")); setEarLocation(gSavedSettings.getS32("VoiceEarLocation")); std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice"); @@ -950,7 +939,7 @@ void LLVivoxVoiceClient::stateMachine() setState(stateDaemonLaunched); // Dirty the states we'll need to sync with the daemon when it comes up. - mPTTDirty = true; + mMuteMicDirty = true; mMicVolumeDirty = true; mSpeakerVolumeDirty = true; mSpeakerMuteDirty = true; @@ -1535,7 +1524,7 @@ void LLVivoxVoiceClient::stateMachine() if(mAudioSession && mAudioSession->mVoiceEnabled) { // Dirty state that may need to be sync'ed with the daemon. - mPTTDirty = true; + mMuteMicDirty = true; mSpeakerVolumeDirty = true; mSpatialCoordsDirty = true; @@ -1576,35 +1565,6 @@ void LLVivoxVoiceClient::stateMachine() } else { - - // Figure out whether the PTT state needs to change - { - bool newPTT; - if(mUsePTT) - { - // If configured to use PTT, track the user state. - newPTT = mUserPTTState; - } - else - { - // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak). - newPTT = true; - } - - if(mMuteMic) - { - // This always overrides any other PTT setting. - newPTT = false; - } - - // Dirty if state changed. - if(newPTT != mPTT) - { - mPTT = newPTT; - mPTTDirty = true; - } - } - if(!inSpatialChannel()) { // When in a non-spatial channel, never send positional updates. @@ -1626,7 +1586,7 @@ void LLVivoxVoiceClient::stateMachine() // Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often // -- the user can only click so fast) or every 10hz, whichever is sooner. // Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged. - if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired()) + if((mAudioSession && mAudioSession->mMuteDirty) || mMuteMicDirty || mUpdateTimer.hasExpired()) { mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS); sendPositionalUpdate(); @@ -2749,19 +2709,17 @@ void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream) buildSetRenderDevice(stream); - if(mPTTDirty) + if(mMuteMicDirty) { - mPTTDirty = false; + mMuteMicDirty = false; // Send a local mute command. - // NOTE that the state of "PTT" is the inverse of "local mute". - // (i.e. when PTT is true, we send a mute command with "false", and vice versa) - LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL; + LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mMuteMic?"true":"false") << LL_ENDL; stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" - << "<Value>" << (mPTT?"false":"true") << "</Value>" + << "<Value>" << (mMuteMic?"true":"false") << "</Value>" << "</Request>\n\n\n"; } @@ -5238,40 +5196,13 @@ void LLVivoxVoiceClient::leaveChannel(void) void LLVivoxVoiceClient::setMuteMic(bool muted) { - mMuteMic = muted; -} - -void LLVivoxVoiceClient::setUserPTTState(bool ptt) -{ - mUserPTTState = ptt; -} - -bool LLVivoxVoiceClient::getUserPTTState() -{ - return mUserPTTState; -} - -void LLVivoxVoiceClient::inputUserControlState(bool down) -{ - if(mPTTIsToggle) + if(mMuteMic != muted) { - if(down) // toggle open-mic state on 'down' - { - toggleUserPTTState(); - } - } - else // set open-mic state as an absolute - { - setUserPTTState(down); + mMuteMic = muted; + mMuteMicDirty = true; } } - -void LLVivoxVoiceClient::toggleUserPTTState(void) -{ - mUserPTTState = !mUserPTTState; -} - void LLVivoxVoiceClient::setVoiceEnabled(bool enabled) { if (enabled != mVoiceEnabled) @@ -5320,48 +5251,6 @@ BOOL LLVivoxVoiceClient::lipSyncEnabled() } } -void LLVivoxVoiceClient::setUsePTT(bool usePTT) -{ - if(usePTT && !mUsePTT) - { - // When the user turns on PTT, reset the current state. - mUserPTTState = false; - } - mUsePTT = usePTT; -} - -void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle) -{ - if(!PTTIsToggle && mPTTIsToggle) - { - // When the user turns off toggle, reset the current state. - mUserPTTState = false; - } - - mPTTIsToggle = PTTIsToggle; -} - -bool LLVivoxVoiceClient::getPTTIsToggle() -{ - return mPTTIsToggle; -} - -void LLVivoxVoiceClient::setPTTKey(std::string &key) -{ - if(key == "MiddleMouse") - { - mPTTIsMiddleMouse = true; - } - else - { - mPTTIsMiddleMouse = false; - if(!LLKeyboard::keyFromString(key, &mPTTKey)) - { - // If the call failed, don't match any key. - key = KEY_NONE; - } - } -} void LLVivoxVoiceClient::setEarLocation(S32 loc) { @@ -5402,44 +5291,6 @@ void LLVivoxVoiceClient::setMicGain(F32 volume) } } -void LLVivoxVoiceClient::keyDown(KEY key, MASK mask) -{ - if (gKeyboard->getKeyRepeated(key)) - { - // ignore auto-repeat keys - return; - } - - if(!mPTTIsMiddleMouse) - { - bool down = (mPTTKey != KEY_NONE) - && gKeyboard->getKeyDown(mPTTKey); - inputUserControlState(down); - } - - -} -void LLVivoxVoiceClient::keyUp(KEY key, MASK mask) -{ - if(!mPTTIsMiddleMouse) - { - bool down = (mPTTKey != KEY_NONE) - && gKeyboard->getKeyDown(mPTTKey); - inputUserControlState(down); - } - -} -void LLVivoxVoiceClient::middleMouseState(bool down) -{ - if(mPTTIsMiddleMouse) - { - if(mPTTIsMiddleMouse) - { - inputUserControlState(down); - } - } -} - ///////////////////////////// // Accessors for data related to nearby speakers BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id) @@ -7015,8 +6866,8 @@ void LLVivoxVoiceClient::captureBufferRecordStartSendMessage() << "<Value>false</Value>" << "</Request>\n\n\n"; - // Dirty the PTT state so that it will get reset when we finishing previewing - mPTTDirty = true; + // Dirty the mute mic state so that it will get reset when we finishing previewing + mMuteMicDirty = true; writeString(stream.str()); } @@ -7030,7 +6881,7 @@ void LLVivoxVoiceClient::captureBufferRecordStopSendMessage() LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL; - // Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing. + // Mute the mic. Mic mute state was dirtied at recording start, so will be reset when finished previewing. stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">" << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>" << "<Value>true</Value>" diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h index 3ba517bf36..471545de56 100644 --- a/indra/newview/llvoicevivox.h +++ b/indra/newview/llvoicevivox.h @@ -173,25 +173,9 @@ public: virtual void setVoiceEnabled(bool enabled); virtual BOOL lipSyncEnabled(); virtual void setLipSyncEnabled(BOOL enabled); - virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state. + virtual void setMuteMic(bool muted); // Set the mute state of the local mic. //@} - - //////////////////////// - /// @name PTT - //@{ - virtual void setUserPTTState(bool ptt); - virtual bool getUserPTTState(); - virtual void setUsePTT(bool usePTT); - virtual void setPTTIsToggle(bool PTTIsToggle); - virtual bool getPTTIsToggle(); - virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs - virtual void toggleUserPTTState(void); - - virtual void keyDown(KEY key, MASK mask); - virtual void keyUp(KEY key, MASK mask); - virtual void middleMouseState(bool down); - //@} - + ////////////////////////// /// @name nearby speaker accessors //@{ @@ -534,9 +518,6 @@ protected: // Use this to determine whether to show a "no speech" icon in the menu bar. - // PTT - void setPTTKey(std::string &key); - ///////////////////////////// // Recording controls void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200); @@ -800,15 +781,8 @@ private: LLVector3 mAvatarVelocity; LLMatrix3 mAvatarRot; - bool mPTTDirty; - bool mPTT; - - bool mUsePTT; - bool mPTTIsMiddleMouse; - KEY mPTTKey; - bool mPTTIsToggle; - bool mUserPTTState; bool mMuteMic; + bool mMuteMicDirty; // Set to true when the friends list is known to have changed. bool mFriendsListDirty; diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 39e286ac38..fa0f48fce6 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -4057,7 +4057,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) if ( pAvatarVO )
{
- const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( vobj->getVolume()->getParams().getSculptID() );
+ LLUUID currentId = vobj->getVolume()->getParams().getSculptID();
+ const LLMeshSkinInfo* pSkinData = gMeshRepo.getSkinInfo( currentId );
if ( pSkinData )
{
@@ -4069,8 +4070,9 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group) {
std::string lookingForJoint = pSkinData->mJointNames[i].c_str();
LLJoint* pJoint = pAvatarVO->getJoint( lookingForJoint );
- if ( pJoint )
+ if ( pJoint && pJoint->getId() != currentId )
{
+ pJoint->setId( currentId );
const LLVector3& jointPos = pSkinData->mAlternateBindMatrix[i].getTranslation();
//If joint is a pelvis then handle by setting avPos+offset
if ( lookingForJoint == "mPelvis" )
diff --git a/indra/newview/llvowater.cpp b/indra/newview/llvowater.cpp index 6f821c266a..9f3ec9cadc 100644 --- a/indra/newview/llvowater.cpp +++ b/indra/newview/llvowater.cpp @@ -60,8 +60,10 @@ 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, pcode, 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. @@ -153,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); 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 73a37a6993..6028a8fbea 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -116,6 +116,13 @@ void LLWeb::loadURLExternal(const std::string& url, bool async, const std::strin // Act like the proxy window was closed, since we won't be able to track targeted windows in the external browser. LLViewerMedia::proxyWindowClosed(uuid); + if(gSavedSettings.getBOOL("DisableExternalBrowser")) + { + // Don't open an external browser under any circumstances. + llwarns << "Blocked attempt to open external browser." << llendl; + return; + } + 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/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 70997f7be6..fa9b9d5bc3 100644 --- a/indra/newview/llworld.cpp +++ b/indra/newview/llworld.cpp @@ -431,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); diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h index c60dc8dc29..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 diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4007d9d8f3..1f1c8d46f5 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -132,8 +132,6 @@ static S32 sDelayedVBOEnable = 0; BOOL gAvatarBacklight = FALSE; -BOOL gRenderForSelect = FALSE; - BOOL gDebugPipeline = FALSE; LLPipeline gPipeline; const LLMatrix4* gGLLastMatrix = NULL; @@ -563,6 +561,11 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) //never use more than 4 samples for render targets U32 samples = llmin(gSavedSettings.getU32("RenderFSAASamples"), (U32) 4); + if (gGLManager.mIsATI) + { //disable multisampling of render targets where ATI is involved + samples = 0; + } + U32 res_mod = gSavedSettings.getU32("RenderResolutionDivisor"); if (res_mod > 1 && res_mod < resX && res_mod < resY) @@ -582,7 +585,6 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) BOOL ssao = gSavedSettings.getBOOL("RenderDeferredSSAO"); bool gi = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_DEFERRED); - samples = llmin(samples, (U32) 8); //cap multisample buffers to 8 samples when rendering deferred //allocate deferred rendering color buffers mDeferredScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); mDeferredDepth.allocate(resX, resY, 0, TRUE, FALSE, LLTexUnit::TT_RECT_TEXTURE, FALSE); @@ -692,10 +694,8 @@ void LLPipeline::allocateScreenBuffer(U32 resX, U32 resY) mScreen.allocate(resX, resY, GL_RGBA, TRUE, TRUE, LLTexUnit::TT_RECT_TEXTURE, FALSE); } - - if (LLRenderTarget::sUseFBO && !sRenderDeferred && gGLManager.mHasFramebufferMultisample && samples > 1) - { // DON'T use multisample buffers when rendering deferred -- multisampling doesn't play nice with deferred rendering - //so a post-effect smooths edges in screen space + if (LLRenderTarget::sUseFBO && samples > 1) + { mSampleBuffer.allocate(resX,resY,GL_RGBA,TRUE,TRUE,LLTexUnit::TT_RECT_TEXTURE,FALSE,samples); if (LLPipeline::sRenderDeferred) { @@ -742,7 +742,11 @@ void LLPipeline::updateRenderDeferred() gSavedSettings.getBOOL("WindLightUseAtmosShaders")) ? TRUE : FALSE) && !gUseWireframe; - sRenderDeferred = deferred; + sRenderDeferred = deferred; + if (deferred) + { //must render glow when rendering deferred since post effect pass is needed to present any lighting at all + sRenderGlow = TRUE; + } } void LLPipeline::releaseGLBuffers() @@ -835,7 +839,6 @@ void LLPipeline::createGLBuffers() allocateScreenBuffer(resX,resY); mScreenWidth = 0; mScreenHeight = 0; - } if (sRenderDeferred) @@ -979,7 +982,7 @@ BOOL LLPipeline::canUseWindLightShadersOnObjects() const BOOL LLPipeline::canUseAntiAliasing() const { - return TRUE; //(gSavedSettings.getBOOL("RenderUseFBO")); + return TRUE; } void LLPipeline::unloadShaders() @@ -4243,185 +4246,6 @@ void LLPipeline::renderDebug() gPipeline.renderPhysicsDisplay(); } -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); @@ -5226,6 +5050,61 @@ void LLPipeline::enableLightsAvatar() enableLights(mask); } +void LLPipeline::enableLightsPreview() +{ + disableLights(); + + glEnable(GL_LIGHTING); + LLColor4 ambient = gSavedSettings.getColor4("PreviewAmbientColor"); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT,ambient.mV); + + + LLColor4 diffuse0 = gSavedSettings.getColor4("PreviewDiffuse0"); + LLColor4 specular0 = gSavedSettings.getColor4("PreviewSpecular0"); + LLColor4 diffuse1 = gSavedSettings.getColor4("PreviewDiffuse1"); + LLColor4 specular1 = gSavedSettings.getColor4("PreviewSpecular1"); + LLColor4 diffuse2 = gSavedSettings.getColor4("PreviewDiffuse2"); + LLColor4 specular2 = gSavedSettings.getColor4("PreviewSpecular2"); + + LLVector3 dir0 = gSavedSettings.getVector3("PreviewDirection0"); + LLVector3 dir1 = gSavedSettings.getVector3("PreviewDirection1"); + LLVector3 dir2 = gSavedSettings.getVector3("PreviewDirection2"); + + dir0.normVec(); + dir1.normVec(); + dir2.normVec(); + + LLVector4 light_pos(dir0, 0.0f); + glEnable(GL_LIGHT0); + glLightfv(GL_LIGHT0, GL_POSITION, light_pos.mV); + glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0.mV); + glLightfv(GL_LIGHT0, GL_AMBIENT, LLColor4::black.mV); + glLightfv(GL_LIGHT0, GL_SPECULAR, specular0.mV); + glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 0.0f); + glLightf (GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f); + + light_pos = LLVector4(dir1, 0.f); + glEnable(GL_LIGHT1); + glLightfv(GL_LIGHT1, GL_POSITION, light_pos.mV); + glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1.mV); + glLightfv(GL_LIGHT1, GL_AMBIENT, LLColor4::black.mV); + glLightfv(GL_LIGHT1, GL_SPECULAR, specular1.mV); + glLightf (GL_LIGHT1, GL_SPOT_EXPONENT, 0.0f); + glLightf (GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f); + + light_pos = LLVector4(dir2, 0.f); + glEnable(GL_LIGHT2); + glLightfv(GL_LIGHT2, GL_POSITION, light_pos.mV); + glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuse2.mV); + glLightfv(GL_LIGHT2, GL_AMBIENT, LLColor4::black.mV); + glLightfv(GL_LIGHT2, GL_SPECULAR, specular2.mV); + glLightf (GL_LIGHT2, GL_SPOT_EXPONENT, 0.0f); + glLightf (GL_LIGHT2, GL_SPOT_CUTOFF, 180.0f); + + +} + + void LLPipeline::enableLightsAvatarEdit(const LLColor4& color) { U32 mask = 0x2002; // Avatar backlight only, set ambient @@ -5978,21 +5857,21 @@ void apply_cube_face_rotation(U32 face) void validate_framebuffer_object() { GLenum status; - status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT); switch(status) { - case GL_FRAMEBUFFER_COMPLETE_EXT: + case GL_FRAMEBUFFER_COMPLETE: //framebuffer OK, no error. break; - case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: // frame buffer not OK: probably means unsupported depth buffer format - llerrs << "Framebuffer Incomplete Dimensions." << llendl; + llerrs << "Framebuffer Incomplete Missing Attachment." << llendl; break; - case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT: + case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: // frame buffer not OK: probably means unsupported depth buffer format llerrs << "Framebuffer Incomplete Attachment." << llendl; break; - case GL_FRAMEBUFFER_UNSUPPORTED_EXT: + case GL_FRAMEBUFFER_UNSUPPORTED: /* choose different formats */ llerrs << "Framebuffer unsupported." << llendl; break; @@ -6230,7 +6109,7 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) if (LLRenderTarget::sUseFBO) { LLFastTimer ftm(FTM_RENDER_BLOOM_FBO); - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); } gGLViewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft; @@ -6253,15 +6132,77 @@ void LLPipeline::renderBloom(BOOL for_snapshot, F32 zoom_factor, int subfield) { shader = &gDeferredGIFinalProgram; } - + LLGLDisable blend(GL_BLEND); bindDeferredShader(*shader); + + //depth of field focal plane calculations + + F32 subject_distance = 16.f; + if (LLViewerJoystick::getInstance()->getOverrideCamera()) + { + //flycam mode, use mouse cursor as focus point + LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); + subject_distance = (eye-gDebugRaycastIntersection).magVec(); + } + else + { + LLViewerObject* obj = gAgentCamera.getFocusObject(); + if (obj) + { + LLVector3 focus = LLVector3(gAgentCamera.getFocusGlobal()-gAgent.getRegion()->getOriginGlobal()); + LLVector3 eye = LLViewerCamera::getInstance()->getOrigin(); + subject_distance = (focus-eye).magVec(); + } + } + + //convert to mm + subject_distance *= 1000.f; + F32 fnumber = gSavedSettings.getF32("CameraFNumber"); + const F32 default_focal_length = gSavedSettings.getF32("CameraFocalLength"); + + F32 fov = LLViewerCamera::getInstance()->getView(); + + const F32 default_fov = gSavedSettings.getF32("CameraFieldOfView") * F_PI/180.f; + //const F32 default_aspect_ratio = gSavedSettings.getF32("CameraAspectRatio"); + + //F32 aspect_ratio = (F32) mScreen.getWidth()/(F32)mScreen.getHeight(); + + F32 dv = 2.f*default_focal_length * tanf(default_fov/2.f); + //F32 dh = 2.f*default_focal_length * tanf(default_fov*default_aspect_ratio/2.f); + + F32 focal_length = dv/(2*tanf(fov/2.f)); + + //F32 tan_pixel_angle = tanf(LLDrawable::sCurPixelAngle); + + // from wikipedia -- c = |s2-s1|/s2 * f^2/(N(S1-f)) + // where N = fnumber + // s2 = dot distance + // s1 = subject distance + // f = focal length + // + + F32 blur_constant = focal_length*focal_length/(fnumber*(subject_distance-focal_length)); + blur_constant /= 1000.f; //convert to meters for shader + F32 magnification = focal_length/(subject_distance-focal_length); + + shader->uniform1f("focal_distance", -subject_distance/1000.f); + shader->uniform1f("blur_constant", blur_constant); + shader->uniform1f("tan_pixel_angle", tanf(1.f/LLDrawable::sCurPixelAngle)); + shader->uniform1f("magnification", magnification); + S32 channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_RECT_TEXTURE); if (channel > -1) { mScreen.bindTexture(0, channel); + gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); } + //channel = shader->enableTexture(LLViewerShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_RECT_TEXTURE); + //if (channel > -1) + //{ + //gGL.getTexUnit(channel)->setTextureFilteringOption(LLTexUnit::TFO_BILINEAR); + //} gGL.begin(LLRender::TRIANGLE_STRIP); gGL.texCoord2f(tc1.mV[0], tc1.mV[1]); @@ -6753,6 +6694,7 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, U32 light_index, LLRen shader.uniform2f("proj_shadow_res", mShadow[4].getWidth(), mShadow[4].getHeight()); shader.uniform1f("depth_cutoff", gSavedSettings.getF32("RenderEdgeDepthCutoff")); shader.uniform1f("norm_cutoff", gSavedSettings.getF32("RenderEdgeNormCutoff")); + if (shader.getUniformLocation("norm_mat") >= 0) { @@ -6923,7 +6865,7 @@ void LLPipeline::renderDeferredLighting() mLuminanceMap.flush(); gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true); gGL.getTexUnit(0)->setTextureFilteringOption(LLTexUnit::TFO_TRILINEAR); - glGenerateMipmapEXT(GL_TEXTURE_2D); + glGenerateMipmap(GL_TEXTURE_2D); } } diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h index e63fbbf147..49269932f5 100644 --- a/indra/newview/pipeline.h +++ b/indra/newview/pipeline.h @@ -264,7 +264,6 @@ public: void renderDebug(); void renderPhysicsDisplay(); - 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 @@ -279,6 +278,7 @@ public: void enableLightsStatic(); void enableLightsDynamic(); void enableLightsAvatar(); + void enableLightsPreview(); void enableLightsAvatarEdit(const LLColor4& color); void enableLightsFullbright(const LLColor4& color); void disableLights(); @@ -742,7 +742,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/res/toolbuy.cur b/indra/newview/res/toolbuy.cur Binary files differindex a1bc278116..65bbf01d45 100644 --- a/indra/newview/res/toolbuy.cur +++ b/indra/newview/res/toolbuy.cur diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur Binary files differindex a72cdfe4c0..22ecbd5228 100644 --- a/indra/newview/res/toolopen.cur +++ b/indra/newview/res/toolopen.cur diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur Binary files differindex 6327bdb281..d26b6f8638 100644 --- a/indra/newview/res/toolsit.cur +++ b/indra/newview/res/toolsit.cur diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index 2a5d034789..feb6c1bb2a 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -139,9 +139,6 @@ name="AvatarListItemIconVoiceLeftColor" reference="AvatarListItemIconOfflineColor" /> <color - name="BackgroundChatColor" - reference="DkGray_66" /> - <color name="ButtonBorderColor" reference="Unused?" /> <color @@ -400,9 +397,6 @@ name="HighlightParentColor" value="0.67 0.83 0.96 1" /> <color - name="IMChatColor" - reference="LtGray" /> - <color name="IMHistoryBgColor" reference="Unused?" /> <color @@ -767,9 +761,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/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.png Binary files differnew file mode 100644 index 0000000000..f19af59251 --- /dev/null +++ b/indra/newview/skins/default/textures/arrow_keys.png diff --git a/indra/newview/skins/default/textures/model_wizard/check_mark.png b/indra/newview/skins/default/textures/model_wizard/check_mark.png Binary files differnew file mode 100644 index 0000000000..2c05297f4f --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/check_mark.png diff --git a/indra/newview/skins/default/textures/model_wizard/left_button_disabled.png b/indra/newview/skins/default/textures/model_wizard/left_button_disabled.png Binary files differnew file mode 100644 index 0000000000..c7c0eaa96b --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/left_button_disabled.png diff --git a/indra/newview/skins/default/textures/model_wizard/left_button_off.png b/indra/newview/skins/default/textures/model_wizard/left_button_off.png Binary files differnew file mode 100644 index 0000000000..4a73c254fc --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/left_button_off.png diff --git a/indra/newview/skins/default/textures/model_wizard/left_button_over.png b/indra/newview/skins/default/textures/model_wizard/left_button_over.png Binary files differnew file mode 100644 index 0000000000..6fb5c432de --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/left_button_over.png diff --git a/indra/newview/skins/default/textures/model_wizard/left_button_press.png b/indra/newview/skins/default/textures/model_wizard/left_button_press.png Binary files differnew file mode 100644 index 0000000000..fa18517933 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/left_button_press.png diff --git a/indra/newview/skins/default/textures/model_wizard/middle_button_disabled.png b/indra/newview/skins/default/textures/model_wizard/middle_button_disabled.png Binary files differnew file mode 100644 index 0000000000..bed1a701bd --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/middle_button_disabled.png diff --git a/indra/newview/skins/default/textures/model_wizard/middle_button_off.png b/indra/newview/skins/default/textures/model_wizard/middle_button_off.png Binary files differnew file mode 100644 index 0000000000..57ce9af574 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/middle_button_off.png diff --git a/indra/newview/skins/default/textures/model_wizard/middle_button_over.png b/indra/newview/skins/default/textures/model_wizard/middle_button_over.png Binary files differnew file mode 100644 index 0000000000..2c43022f0e --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/middle_button_over.png diff --git a/indra/newview/skins/default/textures/model_wizard/middle_button_press.png b/indra/newview/skins/default/textures/model_wizard/middle_button_press.png Binary files differnew file mode 100644 index 0000000000..6b8c1baca4 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/middle_button_press.png diff --git a/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png b/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png Binary files differnew file mode 100644 index 0000000000..d0b213cdc5 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/progress_bar_bg.png diff --git a/indra/newview/skins/default/textures/model_wizard/progress_light.png b/indra/newview/skins/default/textures/model_wizard/progress_light.png Binary files differnew file mode 100644 index 0000000000..019344f812 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/progress_light.png diff --git a/indra/newview/skins/default/textures/model_wizard/right_button_disabled.png b/indra/newview/skins/default/textures/model_wizard/right_button_disabled.png Binary files differnew file mode 100644 index 0000000000..51505e80c5 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/right_button_disabled.png diff --git a/indra/newview/skins/default/textures/model_wizard/right_button_off.png b/indra/newview/skins/default/textures/model_wizard/right_button_off.png Binary files differnew file mode 100644 index 0000000000..9f93efbd93 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/right_button_off.png diff --git a/indra/newview/skins/default/textures/model_wizard/right_button_over.png b/indra/newview/skins/default/textures/model_wizard/right_button_over.png Binary files differnew file mode 100644 index 0000000000..3a4ec1a315 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/right_button_over.png diff --git a/indra/newview/skins/default/textures/model_wizard/right_button_press.png b/indra/newview/skins/default/textures/model_wizard/right_button_press.png Binary files differnew file mode 100644 index 0000000000..1f1b4c2ed5 --- /dev/null +++ b/indra/newview/skins/default/textures/model_wizard/right_button_press.png diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index b8030bfa91..5c188173ce 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -256,6 +256,10 @@ with the same filename but different name <texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" /> + <texture name="ModelImport_Status_Good" file_name="lag_status_good.tga" preload="false"/> + <texture name="ModelImport_Status_Warning" file_name="lag_status_warning.tga" preload="false"/> + <texture name="ModelImport_Status_Error" file_name="lag_status_critical.tga" preload="false"/> + <texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" /> <texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" /> @@ -372,8 +376,8 @@ with the same filename but different name <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" /> <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" /> <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" /> - - <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" /> + + <texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="11" scale.right="48" scale.bottom="3" /> <texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" /> <texture name="PushButton_Disabled" file_name="widgets/PushButton_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" /> diff --git a/indra/newview/skins/default/textures/widgets/ProgressBar.png b/indra/newview/skins/default/textures/widgets/ProgressBar.png Binary files differindex edf11ac1f5..3f0e4eba28 100644 --- a/indra/newview/skins/default/textures/widgets/ProgressBar.png +++ b/indra/newview/skins/default/textures/widgets/ProgressBar.png diff --git a/indra/newview/skins/default/xui/da/floater_avatar_picker.xml b/indra/newview/skins/default/xui/da/floater_avatar_picker.xml index a337da9b51..e97089f61e 100644 --- a/indra/newview/skins/default/xui/da/floater_avatar_picker.xml +++ b/indra/newview/skins/default/xui/da/floater_avatar_picker.xml @@ -24,6 +24,10 @@ Indtast en del af beboerens navn: </text> <button label="Find" label_selected="Find" name="Find"/> + <scroll_list name="SearchResults"> + <columns label="Navn" name="name"/> + <columns label="Brugernavn" name="username"/> + </scroll_list> </panel> <panel label="Venner" name="FriendsPanel"> <text name="InstructSelectFriend"> @@ -39,6 +43,10 @@ meter </text> <button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh"/> + <scroll_list name="NearMe"> + <columns label="Navn" name="name"/> + <columns label="Brugernavn" name="username"/> + </scroll_list> </panel> </tab_container> <button label="OK" label_selected="OK" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/da/floater_bumps.xml b/indra/newview/skins/default/xui/da/floater_bumps.xml index d22de6e7f1..6b265832cd 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] puffede til dig </floater.string> <floater.string name="llpushobject"> - [TIME] [FIRST] [LAST] skubbede dig med et script + [TIME] [NAME] skubbede til dig via 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_buy_object.xml b/indra/newview/skins/default/xui/da/floater_buy_object.xml index f9e18dcf65..7eb4787139 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_object.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_object.xml @@ -1,26 +1,29 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <floater name="contents" title="KØB KOPI AF OBJEKT"> + <floater.string name="title_buy_text"> + Køb + </floater.string> + <floater.string name="title_buy_copy_text"> + Køb en kopi af + </floater.string> + <floater.string name="no_copy_text"> + (kopiér ej) + </floater.string> + <floater.string name="no_modify_text"> + (ændre ej) + </floater.string> + <floater.string name="no_transfer_text"> + (videregiv ej) + </floater.string> <text name="contents_text"> Indeholder: </text> <text name="buy_text"> - Køb for L$[AMOUNT] fra [NAME]? + Køb for L$[AMOUNT] af: + </text> + <text name="buy_name_text"> + [NAME]? </text> - <button label="Annullér" label_selected="Annullér" name="cancel_btn"/> <button label="Køb" label_selected="Køb" name="buy_btn"/> - <string name="title_buy_text"> - Køb - </string> - <string name="title_buy_copy_text"> - Køb en kopi af - </string> - <string name="no_copy_text"> - (kopiér ej) - </string> - <string name="no_modify_text"> - (ændre ej) - </string> - <string name="no_transfer_text"> - (videregiv ej) - </string> + <button label="Annullér" label_selected="Annullér" name="cancel_btn"/> </floater> diff --git a/indra/newview/skins/default/xui/da/floater_display_name.xml b/indra/newview/skins/default/xui/da/floater_display_name.xml new file mode 100644 index 0000000000..e848006d8b --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_display_name.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="Display Name" title="ÆNDRE VISNINGSNAVN"> + <text name="info_text"> + Det navn du giver din avatar kaldes dit visningsnavn. Du kan ændre dette en gang om ugen. + </text> + <text name="lockout_text"> + Du kan ikke ændre dit visningsnavn før: [TIME]. + </text> + <text name="set_name_label"> + Nyt visningsnavn: + </text> + <text name="name_confirm_label"> + Indtast dit nye navn igen for at bekræfte: + </text> + <button label="Gem" name="save_btn" tool_tip="Gem dit nye visningsnavn"/> + <button label="Nulstil" name="reset_btn" tool_tip="Omdøb visningsnavn til samme som brugernavn"/> + <button label="Annullér" name="cancel_btn"/> +</floater> diff --git a/indra/newview/skins/default/xui/da/floater_event.xml b/indra/newview/skins/default/xui/da/floater_event.xml index 58f2e555dd..a9eddaaf8d 100644 --- a/indra/newview/skins/default/xui/da/floater_event.xml +++ b/indra/newview/skins/default/xui/da/floater_event.xml @@ -1,40 +1,11 @@ -<?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"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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"> Henter... </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.string name="done_text"> + Færdig + </floater.string> + <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/da/floater_hardware_settings.xml b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml index 2b10afe7e3..a5942eb625 100644 --- a/indra/newview/skins/default/xui/da/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/da/floater_hardware_settings.xml @@ -14,6 +14,9 @@ <combo_box.item label="8x" name="8x"/> <combo_box.item label="16x" name="16x"/> </combo_box> + <text name="antialiasing restart"> + (kræver genstart af din Second Life klient) + </text> <spinner label="Gamma:" name="gamma"/> <text name="(brightness, lower is brighter)"> (Lysstyrke, lavere er lysere, 0=benyt standard) diff --git a/indra/newview/skins/default/xui/da/floater_incoming_call.xml b/indra/newview/skins/default/xui/da/floater_incoming_call.xml index 7a3c3e466a..dd8cb6f97a 100644 --- a/indra/newview/skins/default/xui/da/floater_incoming_call.xml +++ b/indra/newview/skins/default/xui/da/floater_incoming_call.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<floater name="incoming call" title="UKENDT PERSON KALDER OP"> +<floater name="incoming call" title="Indgående opkald"> <floater.string name="lifetime"> 5 </floater.string> diff --git a/indra/newview/skins/default/xui/da/floater_pay.xml b/indra/newview/skins/default/xui/da/floater_pay.xml index b2cdc0bfe7..96ec106803 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 navn der er meget lang for at checke afkortning </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_preferences.xml b/indra/newview/skins/default/xui/da/floater_preferences.xml index a53586eaaf..6caac14cf5 100644 --- a/indra/newview/skins/default/xui/da/floater_preferences.xml +++ b/indra/newview/skins/default/xui/da/floater_preferences.xml @@ -5,10 +5,12 @@ <tab_container name="pref core"> <panel label="Generelt" name="general"/> <panel label="Grafik" name="display"/> - <panel label="Privatliv" name="im"/> <panel label="Lyd & medier" name="audio"/> <panel label="Chat" name="chat"/> + <panel label="Flyt & se" name="move"/> <panel label="Beskeder" name="msgs"/> + <panel label="Farver" name="colors"/> + <panel label="Privatliv" name="im"/> <panel label="Opsætning" name="input"/> <panel label="Avanceret" name="advanced1"/> </tab_container> diff --git a/indra/newview/skins/default/xui/da/floater_region_debug_console.xml b/indra/newview/skins/default/xui/da/floater_region_debug_console.xml new file mode 100644 index 0000000000..71313f4fea --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_region_debug_console.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="region_debug_console" title="Debug region"/> diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml index 6fda088b51..781adcd50b 100644 --- a/indra/newview/skins/default/xui/da/floater_tools.xml +++ b/indra/newview/skins/default/xui/da/floater_tools.xml @@ -168,13 +168,13 @@ Skaber: </text> <text name="Creator Name"> - Thrax Linden + Mrs. Esbee Linden (esbee.linden) </text> <text name="Owner:"> Ejer: </text> <text name="Owner Name"> - Thrax Linden + Mrs. Erica "Moose" Linden (erica.linden) </text> <text name="Group:"> Gruppe: 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 4c956f13a7..69de696bf5 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,10 @@ <layout_panel name="my_panel"> <text name="user_text" value="Min avatar:"/> </layout_panel> - <layout_panel name="leave_call_panel"> + <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"/> + <button label="Forlad samtale" name="leave_call_btn"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/da/inspect_avatar.xml b/indra/newview/skins/default/xui/da/inspect_avatar.xml index d4bc0813e5..f581210e1b 100644 --- a/indra/newview/skins/default/xui/da/inspect_avatar.xml +++ b/indra/newview/skins/default/xui/da/inspect_avatar.xml @@ -10,6 +10,11 @@ <string name="Details"> [SL_PROFILE] </string> + <text name="user_name_small" value="Grumpity ProductEngine med et langt navn"/> + <text name="user_slid" value="james.linden"/> + <text name="user_details"> + Dette er min second life beskrivelse og jeg synes den er rigtig god. Men af en eller ande grund er min beskrivelse meget lang fordi jeg taler en hel masse + </text> <slider name="volume_slider" tool_tip="Stemme lydstyrke" value="0.5"/> <button label="Tilføj ven" name="add_friend_btn"/> <button label="IM" name="im_btn"/> diff --git a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml index 75ce7b22f6..b359d94f07 100644 --- a/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/da/menu_inventory_gear_default.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_gear_default"> +<toggleable_menu name="menu_gear_default"> <menu_item_call label="Nyt vindue" name="new_window"/> - <menu_item_call label="Sortér efter navn" name="sort_by_name"/> - <menu_item_call label="Sortér efter nyeste" name="sort_by_recent"/> + <menu_item_check label="Sortér efter navn" name="sort_by_name"/> + <menu_item_check label="Sortér efter nyeste" name="sort_by_recent"/> + <menu_item_check label="Vis System mapper øverst" name="sort_system_folders_to_top"/> <menu_item_call label="Vis filtre" name="show_filters"/> <menu_item_call label="Nulstil filtre" name="reset_filters"/> <menu_item_call label="Luk alle mapper" name="close_folders"/> @@ -12,4 +13,4 @@ <menu_item_call label="Find original" name="Find Original"/> <menu_item_call label="Find alle links" name="Find All Links"/> <menu_item_call label="Tøm papirkurv" name="empty_trash"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml index 73986372ce..a3dcfdf4cc 100644 --- a/indra/newview/skins/default/xui/da/menu_viewer.xml +++ b/indra/newview/skins/default/xui/da/menu_viewer.xml @@ -10,6 +10,12 @@ <menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/> <menu_item_check label="Mine bevægelser" name="Gestures"/> <menu_item_check label="Min stemme" name="ShowVoice"/> + <menu label="Bevægelser" name="Movement"> + <menu_item_call label="Sid ned" name="Sit Down Here"/> + <menu_item_check label="Flyv" name="Fly"/> + <menu_item_check label="Løb altid" name="Always Run"/> + <menu_item_call label="Stop animering" name="Stop Animating My Avatar"/> + </menu> <menu label="Min status" name="Status"> <menu_item_call label="Væk" name="Set Away"/> <menu_item_call label="Optaget" name="Set Busy"/> @@ -45,6 +51,7 @@ <menu_item_check label="Grundejere" name="Land Owners"/> <menu_item_check label="Koordinater" name="Coordinates"/> <menu_item_check label="Parcel egenskaber" name="Parcel Properties"/> + <menu_item_check label="Avanceret menu" name="Show Advanced Menu"/> </menu> <menu_item_call label="Teleport hjem" name="Teleport Home"/> <menu_item_call label="Sæt dette sted som 'Hjem'" name="Set Home to Here"/> @@ -83,6 +90,7 @@ <menu_item_call label="Tag kopi" name="Take Copy"/> <menu_item_call label="Opdatér ændringer til beholdning" name="Save Object Back to My Inventory"/> <menu_item_call label="Opdater ændringer i indhold til objekt" name="Save Object Back to Object Contents"/> + <menu_item_call label="Returnér objekt" name="Return Object back to Owner"/> </menu> <menu label="Scripts" name="Scripts"> <menu_item_call label="Genoversæt scripts (Mono)" name="Mono"/> @@ -96,6 +104,7 @@ <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/> <menu_item_check label="Vis kun flytbare objekter" name="Select Only Movable Objects"/> <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/> + <menu_item_check label="Vis selektions afgrænsning" name="Show Selection Outlines"/> <menu_item_check label="Vis skjulte objekter" name="Show Hidden Selection"/> <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/> <menu_item_check label="Vis pejlelys for valgte" name="Show Selection Beam"/> @@ -116,9 +125,9 @@ <menu_item_call label="Rapporter misbrug" name="Report Abuse"/> <menu_item_call label="Rapportér fejl" name="Report Bug"/> <menu_item_call label="Om [APP_NAME]" name="About Second Life"/> + <menu_item_check label="Aktiver tips" name="Enable Hints"/> </menu> <menu label="Avanceret" name="Advanced"> - <menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/> <menu_item_call label="Gendan teksturer" name="Rebake Texture"/> <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/> <menu_item_call label="Vælg vinduesstørrelse..." name="Set Window Size..."/> @@ -172,8 +181,7 @@ <menu_item_check label="Søg" name="Search"/> <menu_item_call label="Frigør taster" name="Release Keys"/> <menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/> - <menu_item_check label="Løb altid" name="Always Run"/> - <menu_item_check label="Flyv" name="Fly"/> + <menu_item_check label="Vis avanceret menu (gammel genvej)" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="Luk vindue" name="Close Window"/> <menu_item_call label="Luk alle vinduer" name="Close All Windows"/> <menu_item_call label="Foto til disk" name="Snapshot to Disk"/> @@ -191,7 +199,6 @@ <menu_item_call label="Zoom ind" name="Zoom In"/> <menu_item_call label="Zoom standard" name="Zoom Default"/> <menu_item_call label="Zoom ud" name="Zoom Out"/> - <menu_item_check label="Vis avanceret menu" name="Show Advanced Menu"/> </menu> <menu_item_call label="Vis debug valg" name="Debug Settings"/> <menu_item_check label="Vis udviklingsmenu" name="Debug Mode"/> @@ -262,18 +269,16 @@ <menu_item_call label="Test web browser" name="Web Browser Test"/> <menu_item_call label="Print info om valgt objekt" name="Print Selected Object Info"/> <menu_item_call label="Hukommelse statistik" name="Memory Stats"/> - <menu_item_check label="Dobbeltklik for auto-pilot" name="Double-Click Auto-Pilot"/> - <menu_item_check label="Dobeltklik for at teleportere" name="DoubleClick Teleport"/> + <menu_item_check label="Debug konsol for region" name="Region Debug Console"/> <menu_item_check label="Debug klik" name="Debug Clicks"/> <menu_item_check label="Debug muse-hændelser" name="Debug Mouse Events"/> </menu> <menu label="XUI" name="XUI"> <menu_item_call label="Genindlæs farveopsætning" name="Reload Color Settings"/> <menu_item_call label="Vis font test" name="Show Font Test"/> - <menu_item_call label="Hent fra XML" name="Load from XML"/> - <menu_item_call label="Gem til XML" name="Save to XML"/> <menu_item_check label="Vis XUI navne" name="Show XUI Names"/> <menu_item_call label="Send testbeskeder (IM)" name="Send Test IMs"/> + <menu_item_call label="Skriv navne-cache til disk" name="Flush Names Caches"/> </menu> <menu label="Avatar" name="Character"> <menu label="Grab Baked Texture" name="Grab Baked Texture"> @@ -297,9 +302,9 @@ </menu> <menu_item_check label="HTTP teksturer" name="HTTP Textures"/> <menu_item_check label="Benyt consol vindue ved næste opstart" name="Console Window"/> - <menu_item_check label="Vis administrationsmenu" name="View Admin Options"/> <menu_item_call label="Anmod om administrator status" name="Request Admin Options"/> <menu_item_call label="Forlad administrationsstatus" name="Leave Admin Options"/> + <menu_item_check label="Vis administrationsmenu" name="View Admin Options"/> </menu> <menu label="Administrér" name="Admin"> <menu label="Object"> diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml index 917b7cc21e..70299c61b4 100644 --- a/indra/newview/skins/default/xui/da/notifications.xml +++ b/indra/newview/skins/default/xui/da/notifications.xml @@ -110,8 +110,8 @@ Vælg kun en genstand, og prøv igen. <usetemplate name="okbutton" yestext="OK"/> </notification> <notification name="GrantModifyRights"> - At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du måtte have i verden. Vær MEGET forsigtig når uddeler denne tilladelse. -Ønsker du at ændre rettigheder for [FIRST_NAME] [LAST_NAME]? + Tildeling af ændre-rettigheder til andre beboere, tillader dem at ændre, slette eller tage ETHVERT objekt du måtte have. Vær MEGET forsigtig ved tildeling af denne rettighed. +Ønsker du at give ændre-rettgheder til [NAME]? <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> </notification> <notification name="GrantModifyRightsMultiple"> @@ -120,7 +120,7 @@ Vælg kun en genstand, og prøv igen. <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> </notification> <notification name="RevokeModifyRights"> - Vil du tilbagekalde rettighederne for [FIRST_NAME] [LAST_NAME]? + Ønsker du at tilbagekalder ændre-rettigheder for [NAME]? <usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/> </notification> <notification name="RevokeModifyRightsMultiple"> @@ -202,14 +202,14 @@ Hvis media kun skal vises på en overflade, vælg 'Vælg overflade' og Overskrider vedhæftnings begrænsning på [MAX_ATTACHMENTS] objekter. Tag venligst en anden vedhæftning af først. </notification> <notification name="MustHaveAccountToLogIn"> - Ups! Noget var tomt. -Du skal skrive både fornavn og efternavn på din figur. + Ups. Noget mangler at blive udfyldt. +Du skal indtaste brugernavnet for din avatar. -Du har brug for en konto for at logge ind i [SECOND_LIFE]. Vil du oprette en nu? +Du skal bruge en konto for at benytte [SECOND_LIFE]. Ønsker du at oprette en konto nu? <usetemplate name="okcancelbuttons" notext="Prøv igen" yestext="Lav ny konto"/> </notification> <notification name="InvalidCredentialFormat"> - Du skal indtaste både fornavn og efternavn i din avatars brugernavn felt og derefter logge på igen. + Du skal indtaste enten dit brugernavn eller både dit fornavn og efternavn for din avatar i brugernavn feltet, derefter log på igen. </notification> <notification name="AddClassified"> Annoncer vil vises i 'Annoncer' sektionen i søge biblioteket og på [http://secondlife.com/community/classifieds secondlife.com] i en uge. @@ -247,6 +247,9 @@ Note: This will clear the cache. <notification name="ChangeSkin"> Den nye hud vil blive vist ved næste genstart af [APP_NAME]. </notification> + <notification name="ChangeLanguage"> + Ændring af sprog vil først have effekt efter genstart af [APP_NAME]. + </notification> <notification name="StartRegionEmpty"> Ups, din start region er ikke angivet. Indtast venligst navn på region i Start lokation feltet eller vælg "Min sidste lokation" eller "Hjem". @@ -288,6 +291,10 @@ og du vil miste dem fra din beholdning hvis du forærer dem væk. Er du sikker p Gå til [_URL] for information om køb af L$? </notification> + <notification name="SoundFileInvalidChunkSize"> + Fejl i WAV fil (chunk size): +[FILE] + </notification> <notification name="CannotEncodeFile"> Kunne ikke 'forstå' filen: [FILE] </notification> @@ -390,13 +397,6 @@ Dette er typisk en midlertidig fejl. Venligst rediger og gem igen om et par minu [MESSAGE] <usetemplate name="okcancelbuttons" notext="Afslut" yestext="Se PB & Chat"/> </notification> - <notification label="Tilføj ven" name="AddFriend"> - Venner kan give tilladelse til at følge hinanden -på Verdenskortet eller modtage status opdateringer. - -Tilbyd venskab til [NAME]? - <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> - </notification> <notification label="Tilføj ven" name="AddFriendWithMessage"> Venner kan give tilladelse til at følge hinanden på Verdenskortet eller modtage status opdateringer. @@ -440,12 +440,22 @@ Tilbyd venskab til [NAME]? <button name="Cancel" text="Annullér"/> </form> </notification> + <notification name="RemoveFromFriends"> + Ønsker du at fjerne [NAME] fra din venneliste? + </notification> <notification name="ConfirmItemDeleteHasLinks"> Mindst en af genstandene har lænkede genstande der peger på den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først. Er du sikker på at du vil slette disse genstande? <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/> </notification> + <notification name="DeedLandToGroupWithContribution"> + Ved at dedikere denne parcel, vil gruppen skulle have og vedblive med at have nok kreditter til brug af land. +Dedikeringen vil inkludere samtidige bidrag til gruppen fra '[NAME]'. +Købsprisen for dette land er ikke refunderet til ejeren. Hvis en dedikeret parvel sælges, vil salgsprisen blive delt ligeligt mellem gruppe medlemmerne. + +Dediker disse [AREA] m² land til gruppen '[GROUP_NAME]'? + </notification> <notification name="ErrorMessage"> <usetemplate name="okbutton" yestext="OK"/> </notification> @@ -582,6 +592,16 @@ Denne opdatering er ikke påkrævet, men det anbefales at installere den for at Download til dit Program bibliotek? </notification> + <notification name="FailedUpdateInstall"> + Der opstod en fejl ved installation af opdatering. +Hent og installér venligst den nyeste version fra +http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DownloadBackground"> + En opdateret version af [APP_NAME] er hentet. +Den vil blive anvendt næste gang du genstarter [APP_NAME] + </notification> <notification name="DeedObjectToGroup"> <usetemplate ignoretext="Bekræft før jeg dedikerer et objekt til en gruppe" name="okcancelignore" notext="Cancel" yestext="Deed"/> </notification> @@ -651,6 +671,46 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &a <notification name="UnFreezeUser"> Fjern frysning af beboeren med hvilken besked? </notification> + <notification name="SetDisplayNameSuccess"> + Hej [DISPLAY_NAME]! + +Præcist som i virkeligheden tager det et stykke tid at vænne sig til et nyt navn. Det kan tage flere dage for [http://wiki.secondlife.com/wiki/Setting_your_display_name your name to update] i objekter, scripts, søgninger m.v. + </notification> + <notification name="SetDisplayNameBlocked"> + Beklager, du kan ikke ændre dit visningsnavn. Hvis du mener dette skyldes en fejl, kontakt venligst support. + </notification> + <notification name="SetDisplayNameFailedLength"> + Beklager, mavnet er for langt. Visningsnavne kan ikke indholde mere end [LENGTH] karakterer. + +Prøv venligst med et kortere navn. + </notification> + <notification name="SetDisplayNameFailedGeneric"> + Beklager, vi kunne ikke sætte dit visningsnavn. Prøv venligst igen senere. + </notification> + <notification name="SetDisplayNameMismatch"> + Visningsnavnene du angav matcher ikke. Prøv at taste ind igen. + </notification> + <notification name="AgentDisplayNameUpdateThresholdExceeded"> + Beklager, du er nødt til at vente længere, inden du kan ændre visningsnavn. + +Se mere under http://wiki.secondlife.com/wiki/Setting_your_display_name + +Prøv venligst igen senere. + </notification> + <notification name="AgentDisplayNameSetBlocked"> + Beklager, vi kunne ikke sætte dit valgte navn da det indholder et ikke tilladt ord. + + Prøv med et andet navn. + </notification> + <notification name="AgentDisplayNameSetInvalidUnicode"> + Visningsnavnet du prøver at angive indeholder ugyldige karakterer. + </notification> + <notification name="AgentDisplayNameSetOnlyPunctuation"> + Dit vinsningsnavn skal indeholde andre bogstaver end tegnsætningstegn. + </notification> + <notification name="DisplayNameUpdate"> + [OLD_NAME] ([SLID]) er nu kendt som [NEW_NAME]. + </notification> <notification name="OfferTeleport"> <form name="form"> <input name="message"> @@ -806,6 +866,7 @@ For at få adgang til voksen regioner, skal beboere være alders-checket, enten <usetemplate ignoretext="Start min browser for at se min konto historik" name="okcancelignore" notext="Cancel" yestext="Go to page"/> </notification> <notification name="ConfirmQuit"> + Er du sikker på at du vil afslutte? <usetemplate ignoretext="Bekræft før jeg afslutter" name="okcancelignore" notext="Afslut ikke" yestext="Quit"/> </notification> <notification name="DeleteItems"> @@ -931,10 +992,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 logget på </notification> <notification name="FriendOffline"> - [FIRST] [LAST] er Offline + [NAME] er logget af </notification> <notification name="AddSelfFriend"> Selvom du nok er meget sød, kan du ikke tilføje dig selv som ven. @@ -1002,9 +1063,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. @@ -1076,7 +1134,10 @@ Prøv at vælge mindre stykker land. <notification name="SystemMessage"> [MESSAGE] </notification> - <notification name="PaymentRecived"> + <notification name="PaymentReceived"> + [MESSAGE] + </notification> + <notification name="PaymentSent"> [MESSAGE] </notification> <notification name="EventNotification"> @@ -1085,7 +1146,7 @@ Prøv at vælge mindre stykker land. [NAME] [DATE] <form name="form"> - <button name="Details" text="Beskrivelse"/> + <button name="Details" text="Detaljer"/> <button name="Cancel" text="Annullér"/> </form> </notification> @@ -1120,7 +1181,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. + Objekterne på den valgte parcel, ejet af [NAME], er blevet returneret til vedkommendes beholdning. </notification> <notification name="OtherObjectsReturned2"> Objekterne i den valgte parcel, ejet af beboeren '[NAME]', er blevet returneret til deres ejer. @@ -1244,7 +1305,7 @@ Prøv igen om lidt. No valid parcel could be found. </notification> <notification name="ObjectGiveItem"> - Et objekt med navnet [OBJECTFROMNAME] ejet af [NAME_SLURL] har givet dig denne/dette [OBJECTTYPE]: + Et object med navnet <nolink>[OBJECTFROMNAME]</nolink> ejet af [NAME_SLURL] har givet dig denne [OBJECTTYPE]: [ITEM_SLURL] <form name="form"> <button name="Keep" text="Behold"/> @@ -1308,6 +1369,11 @@ Prøv igen om lidt. <notification name="FriendshipOffered"> Du har tilbudt venskab til [TO_NAME] </notification> + <notification name="OfferFriendshipNoMessage"> + [NAME_SLURL] tilbyder venskab. + +(Som udgangspunkt, vil du være i stand til at se den andens online status) + </notification> <notification name="FriendshipAccepted"> [NAME] accepterede dit tilbud om venskab. </notification> @@ -1321,8 +1387,8 @@ Prøv igen om lidt. Tilbud om venskab afvist. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] tilbyder dig et visitkort. -Dette vil lave et bogmørke i din beholding, så du hurtigt kan sende en IM til denne beboer. + [NAME] tilbyder sit visitkort. +Dette vil tilføje et bogmærke i din beholdning, så du hurtigt kan sende en personlig besked til denne beboer. <form name="form"> <button name="Accept" text="Acceptér"/> <button name="Decline" text="Afvis"/> @@ -1337,11 +1403,11 @@ Hvis du ikke forlader regionen, vil du blive logget af. Hvis du ikke forlader regionen, vil du blive logget af. </notification> <notification name="LoadWebPage"> - Indlæs internetside [URL]? + Indlæas websiden [URL]? [MESSAGE] -Fra genstand: [OBJECTNAME], ejer: [NAME]? +Fra objekt: <nolink>[OBJECTNAME]</nolink>, ejer: [NAME]? <form name="form"> <button name="Gotopage" text="Gå til side"/> <button name="Cancel" text="Afbryd"/> @@ -1357,9 +1423,10 @@ Fra genstand: [OBJECTNAME], ejer: [NAME]? Den genstand du prøver at tage på benytter en funktion din klient ikke kan forstå. Upgradér venligst din version af [APP_NAME] for at kunne tage denne genstand på. </notification> <notification name="ScriptQuestion"> - '[OBJECTNAME]', en genstand, ejet af '[NAME]', vil gerne: - [QUESTIONS] -Er det iorden? + '<nolink>[OBJECTNAME]</nolink>', et objekt ved ejet af '[NAME]', ønsker at: + +[QUESTIONS] +Er dette OK? <form name="form"> <button name="Yes" text="Ja"/> <button name="No" text="Nej"/> @@ -1367,12 +1434,12 @@ Er det iorden? </form> </notification> <notification name="ScriptQuestionCaution"> - Et objekt med navnet '[OBJECTNAME]', ejet af '[NAME]', ønsker at: + Et objeckt med navn '<nolink>[OBJECTNAME]</nolink>', ejet af '[NAME]' ønsker at: [QUESTIONS] -Hvis du ikke stoler på dette objekt og dets skaber, bør du afvise denne forespørgsel. +Hvis du ikke stoler på dette objekt og dets skaber, bør du afvise dette ønske. -Tillad denne anmodning? +Opfyld dette ønske? <form name="form"> <button name="Grant" text="Imødekom"/> <button name="Deny" text="Afvis"/> @@ -1380,14 +1447,14 @@ 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"/> </form> </notification> <notification name="ScriptDialogGroup"> - [GROUPNAME]'s '[TITLE]' + [GROUPNAME]'s '<nolink>[TITLE]</nolink>' [MESSAGE] <form name="form"> <button name="Ignore" text="Ignorér"/> @@ -1424,13 +1491,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] har fået sendt en besked og blokering er derfor automatisk blevet fjernet. </notification> <notification name="AutoUnmuteByMoney"> - [FIRST] [LAST] blev givet penge og er dermed automatisk ikke mere blokeret. + [NAME] har fået givet penge og blokering er derfor automatisk blevet fjernet. </notification> <notification name="AutoUnmuteByInventory"> - [FIRST] [LAST] blev tilbudt en genstand og er dermed automatisk ikke mere blokeret. + [NAME] er blevet tilbud noget fra beholdning og blokering er derfor automatisk blevet fjernet. </notification> <notification name="VoiceInviteGroup"> [NAME] har has sluttet sig til stemme-chaten i gruppen [GROUP]. @@ -1658,6 +1725,37 @@ vil have lyden slukket - selv efter de har forladt kaldet. Sluk for alles lyd? <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="Annullér" yestext="Ok"/> </notification> + <notification label="Chat" name="HintChat"> + For at deltage i samtalen tast tekst ind i chat feltet nedenfor. + </notification> + <notification label="Stå op" name="HintSit"> + For at rejse dig op og forlad siddeposition, tryk på "Stå op" knappen. + </notification> + <notification label="Undersøg verden" name="HintDestinationGuide"> + Destinationsguiden indeholder tusinder af nye steder der kan opleves. Vælg venligst et sted og vælg Teleport for at komme derhen. + </notification> + <notification label="Side panel" name="HintSidePanel"> + Få hurtig tilgang til din beholdning, sæt, profiler og andet i dette side panel. + </notification> + <notification label="Flyt" name="HintMove"> + For at gå eller løbe, åben Flyt panelet for neden og brug pilene til at navigere. Du kan også bruge pile-tasterne på dit tastatur. + </notification> + <notification label="Visningsnavn" name="HintDisplayName"> + Angiv dit konfigurérbare visningsnavn her. Dette er i tillæg til dit unikke brugernavn, som ikke kan ændres. Du kan ændre hvordan du ser andre beboeres navne i dine indstillinger. + </notification> + <notification label="Beholdning" name="HintInventory"> + Undersøg din beholdning for at finde ting. Nyeste genstand findes lettes under fanen "Nye ting" + </notification> + <notification label="Der er kommet Linden Dollars" name="HintLindenDollar"> + Her er din nuværende balance af L$. Klik på Køb L$ for at købe flere Linden dollars. + </notification> + <notification name="PopupAttempt"> + En pop-up blev hindret i at blive vist. + <form name="form"> + <ignore name="ignore" text="Tillad alle pop-ups"/> + <button name="open" text="Åben pop-up vindue"/> + </form> + </notification> <global name="UnsupportedGLRequirements"> Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter 'multitexture'. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem. diff --git a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml index 837abdac80..36f58428a6 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_gloves_panel"> <panel name="avatar_gloves_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge bilede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml index 62934e96c8..4e7336747d 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_jacket_panel"> <panel name="avatar_jacket_color_panel"> - <texture_picker label="Stof foroven" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/> - <texture_picker label="Stof forneden" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Øvre tekstur" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Nedre tekstur" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_pants.xml b/indra/newview/skins/default/xui/da/panel_edit_pants.xml index 36a9bc60a9..61056e9e6c 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_pants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et bilede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et bilede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml index 27a6000419..80b20f15e9 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml @@ -23,6 +23,14 @@ <scroll_container name="profile_scroll"> <panel name="scroll_content_panel"> <panel name="data_panel"> + <text name="display_name_label" value="Visningsnavn:"/> + <text name="solo_username_label" value="Bugernavn:"/> + <button name="set_name" tool_tip="Sæt visningsnavn"/> + <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="Brugernavn:"/> + <text name="user_slid" value="hamilton.linden"/> <panel name="lifes_images_panel"> <icon label="" name="2nd_life_edit_icon" tool_tip="Klik for at vælge et billede"/> </panel> @@ -39,7 +47,7 @@ <text name="my_account_link" value="[[URL] Go to My Dashboard]"/> <text name="title_partner_text" value="Min partner:"/> <panel name="partner_data_panel"> - <name_box initial_value="(henter)" name="partner_text"/> + <text initial_value="(henter)" name="partner_text"/> </panel> <text name="partner_edit_link" value="[[URL] Edit]"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml index e49667dc8f..4dfb47aab2 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml index 00d31da95a..653ea421b5 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shoes_panel"> <panel name="avatar_shoes_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml index 44a5beca45..e80e60efd8 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_socks.xml b/indra/newview/skins/default/xui/da/panel_edit_socks.xml index b7abd9d1a0..82a7341317 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_socks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge et billede"/> <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml index 32596be57b..aacfae79e1 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_underpants_panel"> <panel name="avatar_underpants_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge bilede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml index 14cf79b97f..a9db5d2ab0 100644 --- a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_undershirt_panel"> <panel name="avatar_undershirt_color_panel"> - <texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/> + <texture_picker label="Tekstur" name="Fabric" tool_tip="Klik for at vælge bilede"/> <color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/da/panel_group_land_money.xml b/indra/newview/skins/default/xui/da/panel_group_land_money.xml index efad4d0c34..49d415e515 100644 --- a/indra/newview/skins/default/xui/da/panel_group_land_money.xml +++ b/indra/newview/skins/default/xui/da/panel_group_land_money.xml @@ -24,6 +24,7 @@ <scroll_list.columns label="Region" name="location"/> <scroll_list.columns label="Type" name="type"/> <scroll_list.columns label="Areal" name="area"/> + <scroll_list.columns label="Skjult" name="hidden"/> </scroll_list> <text name="total_contributed_land_label"> Totalt bidrag: diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml index d4bf9a7d78..268f138185 100644 --- a/indra/newview/skins/default/xui/da/panel_login.xml +++ b/indra/newview/skins/default/xui/da/panel_login.xml @@ -14,7 +14,7 @@ <text name="username_text"> Brugernavn: </text> - <line_editor label="Brugernavn" name="username_edit" tool_tip="[SECOND_LIFE] Brugernavn"/> + <line_editor label="bobsmith12 eller Steller Sunshine" name="username_edit" tool_tip="Det brugernavn du valgte da du registrerede, som f.eks. bobsmith12 eller Steller Sunshine"/> <text name="password_text"> Password: </text> @@ -34,7 +34,7 @@ Opret bruger </text> <text name="forgot_password_text"> - Glemt navn eller password? + Har du glemt brugernavn eller password? </text> <text name="login_help"> Hjælp til login diff --git a/indra/newview/skins/default/xui/da/panel_notify_textbox.xml b/indra/newview/skins/default/xui/da/panel_notify_textbox.xml new file mode 100644 index 0000000000..949ff1a058 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_notify_textbox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_notify_textbox"> + <string name="message_max_lines_count" value="7"/> + <panel label="info_panel" name="info_panel"> + <text_editor name="message" value="besked"/> + parse_urls="false" + <button label="Send" name="btn_submit"/> + </panel> + <panel label="control_panel" name="control_panel"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml index 6c910cc3b2..599686d360 100644 --- a/indra/newview/skins/default/xui/da/panel_people.xml +++ b/indra/newview/skins/default/xui/da/panel_people.xml @@ -22,7 +22,7 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Worl <tab_container name="tabs"> <panel label="TÆT PÅ" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="nearby_view_sort_btn" tool_tip="Valg"/> + <menu_button name="nearby_view_sort_btn" tool_tip="Valg"/> <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/> </panel> </panel> @@ -34,27 +34,27 @@ Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap Worl <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="bottom_panel"> <layout_panel name="options_gear_btn_panel"> - <button name="friends_viewsort_btn" tool_tip="Vis flere valg"/> + <menu_button name="friends_viewsort_btn" tool_tip="Vis flere valg"/> </layout_panel> <layout_panel name="add_btn_panel"> <button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/> </layout_panel> <layout_panel name="trash_btn_panel"> - <dnd_button name="trash_btn" tool_tip="Fjern valgte personer fra venneliste"/> + <dnd_button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/> </layout_panel> </layout_stack> </panel> </panel> <panel label="MINE GRUPPER" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="groups_viewsort_btn" tool_tip="Valg"/> + <menu_button name="groups_viewsort_btn" tool_tip="Valg"/> <button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/> <button name="activate_btn" tool_tip="Activér valgte gruppe"/> </panel> </panel> <panel label="NYLIGE" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="recent_viewsort_btn" tool_tip="Valg"/> + <menu_button name="recent_viewsort_btn" tool_tip="Valg"/> <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_place_profile.xml b/indra/newview/skins/default/xui/da/panel_place_profile.xml index 05ef22328f..8dd0fb2d21 100644 --- a/indra/newview/skins/default/xui/da/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_place_profile.xml @@ -76,7 +76,7 @@ <text name="region_rating_label" value="Rating:"/> <text name="region_rating" value="Voksent"/> <text name="region_owner_label" value="Ejer:"/> - <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="Gruppe:"/> <text name="region_group"> The Mighty Moose of mooseville soundvillemoose @@ -89,6 +89,7 @@ <text name="estate_name_label" value="Estate:"/> <text name="estate_rating_label" value="Rating:"/> <text name="estate_owner_label" value="Ejer:"/> + <text name="estate_owner" value="Tester brugernavn længde med langt navn"/> <text name="covenant_label" value="Regler:"/> </panel> </accordion_tab> diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml index ca3d7c71bb..fe8ca69f34 100644 --- a/indra/newview/skins/default/xui/da/panel_places.xml +++ b/indra/newview/skins/default/xui/da/panel_places.xml @@ -21,7 +21,7 @@ <button label="Redigér" name="edit_btn" tool_tip="Redigér landemærke information"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="▼" name="overflow_btn" tool_tip="Vis flere valg"/> + <menu_button label="▼" name="overflow_btn" tool_tip="Vis flere valg"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml index b267c75673..48106c7dfe 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml @@ -3,35 +3,16 @@ <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <panel.string name="middle_mouse"> - Midterste mus - </panel.string> - <slider label="Synsvinkel" name="camera_fov"/> - <slider label="Distance" name="camera_offset_scale"/> - <text name="heading2"> - Automatisk positionering for: - </text> - <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/> - <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/> - <check_box initial_value="sand" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk positionering af kamera"/> - <check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/> - <check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/> - <check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/> - <check_box label="Bevæg avatarlæber når der tales" name="enable_lip_sync"/> - <check_box label="Talebobler" name="bubble_text_chat"/> - <slider label="Synlighed" name="bubble_chat_opacity"/> - <color_swatch name="background" tool_tip="Vælg farve for talebobler"/> <text name="UI Size:"> - Brugerflade størrelse + UI størrelse: </text> <check_box label="Vis script fejl i:" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="Chat" name="0"/> <radio_item label="Separat vindue" name="1"/> </radio_group> - <check_box label="Knap til aktiverering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/> - <line_editor label="Brug walkie-talkie modus" name="modifier_combo"/> - <button label="Angiv taste" name="set_voice_hotkey_button"/> - <button label="Midterste museknap" name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste musetaste"/> - <button label="Andre enheder" name="joystick_setup_button"/> + <check_box label="Tillad flere åbne klienter" name="allow_multiple_viewer_check"/> + <check_box label="Vælg netværk ved login" name="show_grid_selection_check"/> + <check_box label="Vælg avanceret menu" name="show_advanced_menu_check"/> + <check_box label="Vis udvikler menu" name="show_develop_menu_check"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index 72f8476094..3705a5902a 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -8,44 +8,10 @@ <radio_item label="Mellem" name="radio2" value="1"/> <radio_item label="Stor" name="radio3" value="2"/> </radio_group> - <text name="font_colors"> - Skriftfarve: - </text> - <color_swatch label="Dig" name="user"/> - <text name="text_box1"> - Dig - </text> - <color_swatch label="Andre" name="agent"/> - <text name="text_box2"> - Andre - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="System" name="system"/> - <text name="text_box4"> - System - </text> - <color_swatch label="Fejl" name="script_error"/> - <text name="text_box5"> - Fejl - </text> - <color_swatch label="Objekter" name="objects"/> - <text name="text_box6"> - Objekter - </text> - <color_swatch label="Ejer" name="owner"/> - <text name="text_box7"> - Ejer - </text> - <color_swatch label="URL'er" name="links"/> - <text name="text_box9"> - URL'er - </text> <check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/> <check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/> <check_box label="Åben for almindelig tekst i IM og chat historik" name="plain_text_chat_history"/> + <check_box label="Boble chat" name="bubble_text_chat"/> <text name="show_ims_in_label"> Vis IM'er i: </text> @@ -56,6 +22,13 @@ <radio_item label="Separate vinduer" name="radio" value="0"/> <radio_item label="Faner" name="radio2" value="1"/> </radio_group> + <text name="disable_toast_label"> + Tillad ingående chat popup vinduer: + </text> + <check_box label="Gruppe chats" name="EnableGroupChatPopups" tool_tip="Vælg for at se popup vindue når gruppe chat beskeder modtages"/> + <check_box label="IM chats" name="EnableIMChatPopups" tool_tip="Vælg for at se popup vindue når personlige beskeder (IM) modtages"/> + <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_lifetime"/> + <spinner label="Tid før chatvisning forsvinder:" name="nearby_toasts_fadingtime"/> <check_box label="Benyt maskin-oversættelse ved chat (håndteret af Google)" name="translate_chat_checkbox"/> <text name="translate_language_text" width="110"> Oversæt chat til : diff --git a/indra/newview/skins/default/xui/da/panel_preferences_colors.xml b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml new file mode 100644 index 0000000000..604a00e0b4 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_preferences_colors.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Farver" name="colors_panel"> + <text name="effects_color_textbox"> + Mine effekter (selektions-stråle): + </text> + <color_swatch name="effect_color_swatch" tool_tip="Klik for at åbne farve-vælger"/> + <text name="font_colors"> + Chat bogstavsfarver: + </text> + <text name="text_box1"> + Mig + </text> + <text name="text_box2"> + Andre + </text> + <text name="text_box3"> + Objekter + </text> + <text name="text_box4"> + System + </text> + <text name="text_box5"> + Fejl + </text> + <text name="text_box7"> + Ejer + </text> + <text name="text_box9"> + URL'er + </text> + <text name="bubble_chat"> + Chat-boble baggrund: + </text> + <color_swatch name="background" tool_tip="Vælg farve til chat-boble"/> + <slider label="Uigennemsigtighed:" name="bubble_chat_opacity"/> + <text name="floater_opacity"> + Vindue uigennemsigtighed: + </text> + <slider label="Aktiv:" name="active"/> + <slider label="Inaktiv:" name="inactive"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml index 6a85cf4aae..5702d48e97 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml @@ -42,16 +42,22 @@ <radio_item label="Vis" name="radio2" value="1"/> <radio_item label="Vis et øjeblik" name="radio3" value="2"/> </radio_group> - <check_box label="Vis mit navn" name="show_my_name_checkbox1"/> - <check_box initial_value="true" label="Små avatar navne" name="small_avatar_names_checkbox"/> - <check_box label="Gruppetitler" name="show_all_title_checkbox1"/> - <text name="effects_color_textbox"> - Farve til mine effekter: + <check_box label="Mit navn" name="show_my_name_checkbox1"/> + <check_box label="Brugernavne" name="show_slids" tool_tip="Vis brugernavne, som bobsmith123"/> + <check_box label="Gruppe titler" name="show_all_title_checkbox1" tool_tip="Vis hgruppetitler, som f.eks. administrator eller medlem"/> + <check_box label="Fremhæv venner" name="show_friends" tool_tip="Fremhæv navne-tags for dine venner"/> + <check_box label="Vis visningsnavne" name="display_names_check" tool_tip="Vælg for at bruge visningsnavne i chat, IM, navne-tags m.v."/> + <check_box label="Aktivér UI tips i klient" name="viewer_hints_check"/> + <text name="inworld_typing_rg_label"> + Trykker bogstav taster: </text> + <radio_group name="inworld_typing_preference"> + <radio_item label="Starter lokal chat" name="radio_start_chat" value="1"/> + <radio_item label="Påvirker bevægelse (f.eks. WASD)" name="radio_move" value="0"/> + </radio_group> <text name="title_afk_text"> Tid inden "væk": </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/> <combo_box label="Timeout før 'væk':" name="afk"> <combo_box.item label="2 minutter" name="item0"/> <combo_box.item label="5 minutter" name="item1"/> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml index 5bc5025ff1..15da1f9ec5 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml @@ -26,6 +26,7 @@ <text name="ShadersText"> Overflader: </text> + <check_box initial_value="sand" label="Gennemsigtig vand" name="TransparentWater"/> <check_box initial_value="true" label="Glatte flader og skin" name="BumpShiny"/> <check_box initial_value="true" label="Basale flader" name="BasicShaders" tool_tip="Ved at slå dette valg fra, kan det forhindres at visse grafikkort drivere crasher."/> <check_box initial_value="true" label="Atmosfæriske flader" name="WindLightUseAtmosShaders"/> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_move.xml b/indra/newview/skins/default/xui/da/panel_preferences_move.xml new file mode 100644 index 0000000000..98dfed92c1 --- /dev/null +++ b/indra/newview/skins/default/xui/da/panel_preferences_move.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Flyv" name="move_panel"> + <slider label="Se vinkel" name="camera_fov"/> + <slider label="Distance" name="camera_offset_scale"/> + <text name="heading2"> + Automatisk position for: + </text> + <check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering når edit modus aktiveres og forlades"/> + <check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering i edit modus"/> + <check_box initial_value="sand" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk kamera positionering ved sidepanel"/> + <check_box label="Vis avatar i første-person" name="first_person_avatar_visible"/> + <text name=" Mouse Sensitivity"> + Muse-følsomhed i første-person: + </text> + <check_box label="Omvend" name="invert_mouse"/> + <check_box label="Piletaster bevæger altid avatar" name="arrow_keys_move_avatar_check"/> + <check_box label="Tryk to gange for at løbe" name="tap_tap_hold_to_run"/> + <check_box label="Dobbelt-klik for at:" name="double_click_chkbox"/> + <radio_group name="double_click_action"> + <radio_item label="Teleportere" name="radio_teleport"/> + <radio_item label="Auto-pilot" name="radio_autopilot"/> + </radio_group> + <button label="Andre enheder" name="joystick_setup_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml index cdb407dbad..2843f0d339 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml @@ -10,16 +10,19 @@ <check_box label="Kun venner og grupper ved jeg er online" name="online_visibility"/> <check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/> <check_box label="Slå mikrofon fra når opkald slutter" name="auto_disengage_mic_check"/> - <check_box label="Acceptér cookies" name="cookies_enabled"/> <text name="Logs:"> - Logs: + Chat Logs: </text> <check_box label="Gem en log med lokal chat på min computer" name="log_nearby_chat"/> <check_box label="Gem en log med private beskeder (IM) på min computer" name="log_instant_messages"/> - <check_box label="Tilføj tidsstempel" name="show_timestamps_check_im"/> + <check_box label="Tilføj klokkeslæt til hver linie i chat log" name="show_timestamps_check_im"/> + <check_box label="Tilføj datostempel til log filnavn." name="logfile_name_datestamp"/> <text name="log_path_desc"> Placering af logfiler: </text> <button label="Ændre sti" label_selected="Ændre sti" left="150" name="log_path_button"/> <button label="Liste med blokeringer" name="block_list"/> + <text name="block_list_label"> + (Personer og/eller objekter du har blokeret) + </text> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml index 38bc9c0a2a..332b5ed1c4 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml @@ -1,13 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Opsætning" name="Input panel"> - <button label="Andre enheder" name="joystick_setup_button"/> - <text name="Mouselook:"> - Første person: - </text> - <text name=" Mouse Sensitivity"> - Mus - følsomhed - </text> - <check_box label="Omvendt" name="invert_mouse"/> <text name="Network:"> Netværk: </text> @@ -37,13 +29,15 @@ <radio_item label="Benyt min browser(IE, Firefox, Safari)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm." value="1"/> <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser åbner et nyt vindue i [APP_NAME]." value=""/> </radio_group> - <check_box label="Aktivér plugins" name="browser_plugins_enabled"/> - <check_box label="Acceptér cookies" name="cookies_enabled"/> - <check_box label="Aktivér Javascript" name="browser_javascript_enabled"/> - <check_box label="Aktivér web proxy" name="web_proxy_enabled"/> + <check_box initial_value="true" label="Aktivér plugins" name="browser_plugins_enabled"/> + <check_box initial_value="true" label="Acceptér cookies" name="cookies_enabled"/> + <check_box initial_value="true" label="Aktivér Javascript" name="browser_javascript_enabled"/> + <check_box initial_value="fra" label="Tilad media browser pop-ups" name="media_popup_enabled"/> + <check_box initial_value="false" label="Aktivér web proxy" name="web_proxy_enabled"/> <text name="Proxy location"> Proxy placering: </text> <line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse på den proxy du ønsker at anvende"/> <spinner label="Port nummer:" name="web_proxy_port"/> + <check_box initial_value="sand" label="Hent og installer automatisk [APP_NAME] opdateringer" name="updater_service_active"/> </panel> diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml index 18cb0e47b9..75600a93f6 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Lyde" name="Preference Media panel"> + <panel.string name="middle_mouse"> + Midterste museknap + </panel.string> <slider label="Generel" name="System Volume"/> <check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/> <slider label="Knapper" name="UI Volume"/> @@ -23,6 +26,11 @@ <radio_item label="Kamera position" name="0"/> <radio_item label="Avatar position" name="1"/> </radio_group> + <check_box label="Bevæg avatar-læber når der snakkes" name="enable_lip_sync"/> + <check_box label="Skift tale tænd/sluk når jeg trykker:" name="push_to_talk_toggle_check" tool_tip="Når du er i skift-modus, vil hvert tryk tænde eller slukke din mikrofon. Når du ikke er i skift-modus, vil din mikrofon kun være tændt når knappen/tasten holdes nede (som en Walkie Talkie)"/> + <line_editor label="Tryk-for-tale udløser" name="modifier_combo"/> + <button label="Angiv taste" name="set_voice_hotkey_button"/> + <button name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste muse-knap"/> <button label="Input/Output enheder" name="device_settings_btn"/> <panel label="Enhedsopsætning" name="device_settings_panel"> <panel.string name="default_text"> diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml index b2d1e9791a..b8b99a9c21 100644 --- a/indra/newview/skins/default/xui/da/panel_profile.xml +++ b/indra/newview/skins/default/xui/da/panel_profile.xml @@ -42,7 +42,7 @@ <button label="Teleportér" name="teleport" tool_tip="Tilbyd teleport"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="▼" name="overflow_btn" tool_tip="Betal eller del beholdning med denne beboer"/> + <menu_button label="▼" name="overflow_btn" tool_tip="Betal eller del beholdning med denne beboer"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/da/panel_profile_view.xml b/indra/newview/skins/default/xui/da/panel_profile_view.xml index 23b9d3ba83..5e0a51eb28 100644 --- a/indra/newview/skins/default/xui/da/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/da/panel_profile_view.xml @@ -6,8 +6,14 @@ <string name="status_offline"> Offline </string> - <text_editor name="user_name" value="(Henter...)"/> + <text name="display_name_label" value="Visningsnavn:"/> + <text name="solo_username_label" value="Brugernavn:"/> <text name="status" value="Online"/> + <text name="user_name_small" value="Se på mig med dette enormt ekstremt super lange navn"/> + <text name="user_name" value="Jack Linden"/> + <button name="copy_to_clipboard" tool_tip="Kopiér til udskriftsholder"/> + <text name="user_label" value="Brugernavn:"/> + <text name="user_slid" value="jack.linden"/> <tab_container name="tabs"> <panel label="PROFIL" name="panel_profile"/> <panel label="FAVORITTER" name="panel_picks"/> diff --git a/indra/newview/skins/default/xui/da/panel_script_ed.xml b/indra/newview/skins/default/xui/da/panel_script_ed.xml index 0bdfa89d3b..8997cab30c 100644 --- a/indra/newview/skins/default/xui/da/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/da/panel_script_ed.xml @@ -15,11 +15,6 @@ <panel.string name="Title"> Script: [NAME] </panel.string> - <text_editor name="Script Editor"> - Henter... - </text_editor> - <button label="Gem" label_selected="Gem" name="Save_btn"/> - <combo_box label="Indsæt..." name="Insert..."/> <menu_bar name="script_menu"> <menu label="Filer" name="File"> <menu_item_call label="Gem" name="Save"/> @@ -40,4 +35,10 @@ <menu_item_call label="Hjælp med keywords..." name="Keyword Help..."/> </menu> </menu_bar> + <text_editor name="Script Editor"> + Henter... + </text_editor> + <combo_box label="Indsæt..." name="Insert..."/> + <button label="Gem" label_selected="Gem" name="Save_btn"/> + <button label="Redigér..." name="Edit_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/da/role_actions.xml b/indra/newview/skins/default/xui/da/role_actions.xml index 5ec90a759a..7e581200a5 100644 --- a/indra/newview/skins/default/xui/da/role_actions.xml +++ b/indra/newview/skins/default/xui/da/role_actions.xml @@ -1,76 +1,73 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <role_actions> <action_set description="Disse rettigheder inkluderer adgang til at tilføje og fjerne gruppe medlemmer og tillade nye medlemmer at melde sig ind uden invitation" name="Membership"> - <action description="Invitér personer til denne gruppe" longdescription="Invitér personer til denne gruppe via 'Invitér ny person...' knappen i fanen: medlemmer & roller > underfanen: medlemmer" name="member invite"/> - <action description="Fjern medlemmer fra denne gruppe" longdescription="Fjern medlemmer i denne gruppe via 'Fjern fra gruppe' knappen i fanen: medlemmer & roller > underfanen: medlemmer. En ejer kan fjerne alle undtagen en anden ejer. Hvis du ikke er en ejer, kan et medlem kun fjernes fra gruppen hvis, og kun hvis, medlemmet kun findes i Alle rollen, og ikke i andre roller. for at fjerne medlemmer fra roller, skal du have rettigheden 'Fjern medlemmer fra roller" name="member eject"/> - <action description="Åben eller luk for 'fri tilmelding' og ændre 'tilmeldingsgebyr'" longdescription="Åben for 'fri tilmelding' så alle kan blive medlem af gruppen, eller luk for 'fri tilmelding' så kun inveterede kan blive medlem. ændre 'tilmeldingsgebyr' i gruppe opsætningsbilledet sektionen i Generelt fanen" name="member options"/> + <action description="Invitér personer til denne gruppe" longdescription="Invitér personer til denne gruppe via 'Invitér ny person...' knappen i fanen: medlemmer & roller > underfanen: medlemmer" name="member invite" value="1"/> + <action description="Fjern medlemmer fra denne gruppe" longdescription="Fjern medlemmer i denne gruppe via 'Fjern fra gruppe' knappen i fanen: medlemmer & roller > underfanen: medlemmer. En ejer kan fjerne alle undtagen en anden ejer. Hvis du ikke er en ejer, kan et medlem kun fjernes fra gruppen hvis, og kun hvis, medlemmet kun findes i Alle rollen, og ikke i andre roller. for at fjerne medlemmer fra roller, skal du have rettigheden 'Fjern medlemmer fra roller" name="member eject" value="2"/> + <action description="Åben eller luk for 'fri tilmelding' og ændre 'tilmeldingsgebyr'" longdescription="Åben for 'fri tilmelding' så alle kan blive medlem af gruppen, eller luk for 'fri tilmelding' så kun inveterede kan blive medlem. ændre 'tilmeldingsgebyr' i gruppe opsætningsbilledet sektionen i Generelt fanen" name="member options" value="3"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at tilføje, fjerne og ændre gruppe-roller, tilføje og fjerne medlemmer i roller, og give rettigheder til roller" name="Roles"> - <action description="Opret nye roller" longdescription="Opret nye roller i fanen: Medlemmer & roller > under-fanen: Roller." name="role create"/> - <action description="Slet roller" longdescription="Slet roller i roller i fanen: Medlemmer & roller > under-fanen: Roller." name="role delete"/> - <action description="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen" longdescription="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen. Dette håndteres i bunden af fanen:: Medlemmer & roller > under-fanen: Roller efter at have valgt en rolle." name="role properties"/> - <action description="Tildel andre samme roller som dig selv" longdescription="Tildel andre medlemmer til roller i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Et medlem med denne rettighed kan kun tildele andre medlemmer en rolle som tildeleren allerede selv har." name="role assign member limited"/> - <action description="Tildele medlemmer enhver rolle" longdescription="Tildel andre medlemmer til en hvilken som helst rolle i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - roller som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="role assign member"/> - <action description="Fjern medlemmer fra roller" longdescription="Fjern medlemmer fra roller i in Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Ejere kan ikke fjernes." name="role remove member"/> - <action description="Tildel og fjern rettigheder for roller" longdescription="Tildel og fjern rettigheder for roller i tilladte rettigheder sektionen på fanen: Medlemmer & roller > under-fanen: Roller. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - rettigheder som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du gør inden du tildeler denne rettighed." name="role change actions"/> + <action description="Opret nye roller" longdescription="Opret nye roller i fanen: Medlemmer & roller > under-fanen: Roller." name="role create" value="4"/> + <action description="Slet roller" longdescription="Slet roller i roller i fanen: Medlemmer & roller > under-fanen: Roller." name="role delete" value="5"/> + <action description="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen" longdescription="Ændre rolle navne, titler, beskrivelser og angivelse af om rollemedlemmer kan ses af andre udenfor gruppen. Dette håndteres i bunden af fanen:: Medlemmer & roller > under-fanen: Roller efter at have valgt en rolle." name="role properties" value="6"/> + <action description="Tildel andre samme roller som dig selv" longdescription="Tildel andre medlemmer til roller i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Et medlem med denne rettighed kan kun tildele andre medlemmer en rolle som tildeleren allerede selv har." name="role assign member limited" value="7"/> + <action description="Tildele medlemmer enhver rolle" longdescription="Tildel andre medlemmer til en hvilken som helst rolle i Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - roller som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="role assign member" value="8"/> + <action description="Fjern medlemmer fra roller" longdescription="Fjern medlemmer fra roller i in Tildelte roller sektionen på fanen: Medlemmer & roller > under-fanen: Medlemmer. Ejere kan ikke fjernes." name="role remove member" value="9"/> + <action description="Tildel og fjern rettigheder for roller" longdescription="Tildel og fjern rettigheder for roller i tilladte rettigheder sektionen på fanen: Medlemmer & roller > under-fanen: Roller. *ADVARSEL* Ethvert medlem i en rolle med denne rettighed kan tildele sig selv - og enhver anden - rettigheder som giver dem flere rettigheder end de havde tidligere, og dermed potentielt få næsten samme magt som ejer. Vær sikker på at vide hvad du gør inden du tildeler denne rettighed." name="role change actions" value="10"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at ændre denne gruppes identitetsoplysninger, som f.eks. om gruppen kan ses af andre, gruppens fundats og billede." name="Group Identity"> - <action description="Ændre fundats, billede og 'Vis i søgning'" longdescription="Ændre fundats og 'Vis i søgning'. Dette gøres under fanen Generelt." name="group change identity"/> + <action description="Ændre fundats, billede og 'Vis i søgning'" longdescription="Ændre fundats og 'Vis i søgning'. Dette gøres under fanen Generelt." name="group change identity" value="11"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til dedikere, ændre og sælge land fra denne gruppes besiddelser. For at åbne 'Om land...' vinduet, højre-klik på jorden og vælg 'Om land...', eller klik på 'Om land...' i 'Verden' menuen." name="Parcel Management"> - <action description="Dedikér eller køb land til gruppen" longdescription="Dedikér eller køb land til gruppen. Dette gøres i fanen Generelt i 'Om land...'." name="land deed"/> - <action description="Forlad land og overgiv det til guvernør Linden" longdescription="Forlad land og overgiv det til guvernør Linden. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan overdrage gruppe-ejet land via fanen Generelt i 'Om land...' til Lindens ejerskab uden salg! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land release"/> - <action description="Sæt land til salg" longdescription="Sæt land til salg. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan sælge gruppe-ejet land via fanen Generelt i 'Om land...'! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land set sale info"/> - <action description="Opdel og saml parceller" longdescription="Opdel og saml parceller. Dette gøres ved at højreklikke på jorden og vælge 'Redigér terræn'" name="land divide join"/> + <action description="Dedikér eller køb land til gruppen" longdescription="Dedikér eller køb land til gruppen. Dette gøres i fanen Generelt i 'Om land...'." name="land deed" value="12"/> + <action description="Forlad land og overgiv det til guvernør Linden" longdescription="Forlad land og overgiv det til guvernør Linden. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan overdrage gruppe-ejet land via fanen Generelt i 'Om land...' til Lindens ejerskab uden salg! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land release" value="13"/> + <action description="Sæt land til salg" longdescription="Sæt land til salg. *ADVARSEL* Ethvert medlem med en rolle med denne rettighed kan sælge gruppe-ejet land via fanen Generelt i 'Om land...'! Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land set sale info" value="14"/> + <action description="Opdel og saml parceller" longdescription="Opdel og saml parceller. Dette gøres ved at højreklikke på jorden og vælge 'Redigér terræn'" name="land divide join" value="15"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at ændre parcel navn og en række parametre om f.eks. landingspunkt, teleports m.v.." name="Parcel Identity"> - <action description="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori" longdescription="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori i 'Om land...' > Indstillinger fanen." name="land find places"/> - <action description="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning" longdescription="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning. Dette håndteres i 'Om land...'> Opsætning fanen." name="land change identity"/> - <action description="Sæt landingspunkt og teleport muligheder" longdescription="På en gruppe-ejet parcel kan medlemmer, med en rolle med denne rettighed, sætte landingspunktet og dermed angive hvor indkommende teleporte skal ankomme og desuden angive dealjer om teleporte. Dette håndteres i 'Om land...'> Opsætning fanen." name="land set landing point"/> + <action description="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori" longdescription="Angive om sted skal vises i 'vis i Søg steder' og angivelse af kategori i 'Om land...' > Indstillinger fanen." name="land find places" value="17"/> + <action description="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning" longdescription="Ændre parcel navn, beskrivelse, og 'Vis i Søg' opsætning. Dette håndteres i 'Om land...'> Opsætning fanen." name="land change identity" value="18"/> + <action description="Sæt landingspunkt og teleport muligheder" longdescription="På en gruppe-ejet parcel kan medlemmer, med en rolle med denne rettighed, sætte landingspunktet og dermed angive hvor indkommende teleporte skal ankomme og desuden angive dealjer om teleporte. Dette håndteres i 'Om land...'> Opsætning fanen." name="land set landing point" value="19"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at opsætte parcel indstillinger som f.eks. 'Lave objekter', 'Redigere terræn', samt musik og media indstillinger." name="Parcel Settings"> - <action description="Ændre musik og media indstillinger" longdescription="Ændre oplysninger om streaming musik og film i 'Om land...' > Media fanen." name="land change media"/> - <action description="Ændre rettighed til 'Redigere terræn'" longdescription="Ændre rettighed til 'Redigere terræn'. *ADVARSEL*: Redigere terræn' kan give alle og enhver ret til at ændre terræn og opsætte og flytte Linden planter. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land edit"/> - <action description="Ændre diverse andre indstillinger i 'Om land...'> indstillinger fanen" longdescription="Giv adgang til at ændre 'Sikker (ingen skade)', 'Flyve', og tillad andre beboere at: 'Lave objekter', 'Redigere terræn', 'Lave landemærker', og 'Køre scripts' på gruppe-ejet land via About Land > Indstillinger fanen." name="land options"/> + <action description="Ændre musik og media indstillinger" longdescription="Ændre oplysninger om streaming musik og film i 'Om land...' > Media fanen." name="land change media" value="20"/> + <action description="Ændre rettighed til 'Redigere terræn'" longdescription="Ændre rettighed til 'Redigere terræn'. *ADVARSEL*: Redigere terræn' kan give alle og enhver ret til at ændre terræn og opsætte og flytte Linden planter. Vær sikker på at vide hvad du ør inden du tildeler denne rettighed." name="land edit" value="21"/> + <action description="Ændre diverse andre indstillinger i 'Om land...'> indstillinger fanen" longdescription="Giv adgang til at ændre 'Sikker (ingen skade)', 'Flyve', og tillad andre beboere at: 'Lave objekter', 'Redigere terræn', 'Lave landemærker', og 'Køre scripts' på gruppe-ejet land via About Land > Indstillinger fanen." name="land options" value="22"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at medlemmer kan omgå restriktioner på gruppe-ejede parceller." name="Parcel Powers"> - <action description="Tillad altid 'Rediger Terræn'" longdescription="Medlemmer med denne rolle har adgang til at redigere terræn på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow edit land"/> - <action description="Tillad altid at 'Flyve'" longdescription="Medlemmer med denne rolle har adgang til at flyve på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow fly"/> - <action description="Tillad altid 'Lave objekter'" longdescription="Medlemmer med denne rolle har adgang til at lave nye objekter på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow create"/> - <action description="Tillad altid at 'Lave landemærker'" longdescription="Medlemmer med denne rolle har adgang til at lave landemærker på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow landmark"/> - <action description="Tillad altid 'sæt til hjem' på gruppe-ejet land" longdescription="Medlemmer med denne rolle har adgang til at benytte 'Verden' menuen og vælge 'sæt til hjem' på en parcel der er dedikeret til gruppen." name="land allow set home"/> + <action description="Tillad altid 'Rediger Terræn'" longdescription="Medlemmer med denne rolle har adgang til at redigere terræn på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow edit land" value="23"/> + <action description="Tillad altid at 'Flyve'" longdescription="Medlemmer med denne rolle har adgang til at flyve på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow fly" value="24"/> + <action description="Tillad altid 'Lave objekter'" longdescription="Medlemmer med denne rolle har adgang til at lave nye objekter på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow create" value="25"/> + <action description="Tillad altid at 'Lave landemærker'" longdescription="Medlemmer med denne rolle har adgang til at lave landemærker på gruppe-ejede parceller, også selvom denne mulighed ikke er aktiveret på 'Om land...' > Indstillinger fanen." name="land allow landmark" value="26"/> + <action description="Tillad altid 'sæt til hjem' på gruppe-ejet land" longdescription="Medlemmer med denne rolle har adgang til at benytte 'Verden' menuen og vælge 'sæt til hjem' på en parcel der er dedikeret til gruppen." name="land allow set home" value="28"/> + <action description="Tillad 'Event Hosting' på gruppe ejet land" longdescription="Medlemmer med denne rolle kan vælge gruppe ejede parceller som sted når der afholdes et event." name="land allow host event" value="41"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at medlemmer kan tillade eller forbyde adgang til gruppe-ejede parceller, inkluderende at 'fryse' og udsmide beboere." name="Parcel Access"> - <action description="Administrér adgangsregler for parceller" longdescription="Administrér adgangsregler for parceller i 'Om land' > 'Adgang' fanen." name="land manage allowed"/> - <action description="Administrér liste med blokerede beboere på parceller" longdescription="Administrér liste med blokerede beboere på parceller i 'Om land' > 'Adgang' fanen." name="land manage banned"/> - <action description="Ændre indstillinger for at 'Sælge adgang til' parceller" longdescription="Ændre indstillinger for at 'Sælge adgang til' parceller i 'Om land' > 'Adgang' fanen." name="land manage passes"/> - <action description="Adgang til at smide beboere ud og 'fryse' beboere på parceller" longdescription="Medlemmer med denne rolle kan håndtere beboere som ikke er velkomne på gruppe-ejet parceller ved at højreklikke på dem, vælge Mere>, og vælge 'Smid ud...' eller 'Frys...'." name="land admin"/> + <action description="Administrér adgangsregler for parceller" longdescription="Administrér adgangsregler for parceller i 'Om land' > 'Adgang' fanen." name="land manage allowed" value="29"/> + <action description="Administrér liste med blokerede beboere på parceller" longdescription="Administrér liste med blokerede beboere på parceller i 'Om land' > 'Adgang' fanen." name="land manage banned" value="30"/> + <action description="Ændre indstillinger for at 'Sælge adgang til' parceller" longdescription="Ændre indstillinger for at 'Sælge adgang til' parceller i 'Om land' > 'Adgang' fanen." name="land manage passes" value="31"/> + <action description="Adgang til at smide beboere ud og 'fryse' beboere på parceller" longdescription="Medlemmer med denne rolle kan håndtere beboere som ikke er velkomne på gruppe-ejet parceller ved at højreklikke på dem, vælge Mere>, og vælge 'Smid ud...' eller 'Frys...'." name="land admin" value="32"/> </action_set> <action_set description="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="Parcel Content"> - <action description="Returnere objekter ejet af gruppen" longdescription="Returne objekter på gruppe-ejede parceller der er ejet af gruppen. Dette håndteres i 'Om land...'> 'Objekter' fanen." name="land return group owned"/> - <action description="Returnere objekter der er sat til 'gruppe'" longdescription="Returnere objekter på gruppe-ejede parceller, der er 'sat til gruppe' i 'Om land...'> 'Objekter' fanen." name="land return group set"/> - <action description="Returnere objekter der ikke er ejet af andre" longdescription="Returnere objekter på gruppe-ejede parceller, der er 'Ejet af andre' i 'Om land...'> 'Objekter' fanen." name="land return non group"/> - <action description="Ændre landskab med Linden planter" longdescription="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="land gardening"/> + <action description="Returnere objekter ejet af gruppen" longdescription="Returne objekter på gruppe-ejede parceller der er ejet af gruppen. Dette håndteres i 'Om land...'> 'Objekter' fanen." name="land return group owned" value="48"/> + <action description="Returnere objekter der er sat til 'gruppe'" longdescription="Returnere objekter på gruppe-ejede parceller, der er 'sat til gruppe' i 'Om land...'> 'Objekter' fanen." name="land return group set" value="33"/> + <action description="Returnere objekter der ikke er ejet af andre" longdescription="Returnere objekter på gruppe-ejede parceller, der er 'Ejet af andre' i 'Om land...'> 'Objekter' fanen." name="land return non group" value="34"/> + <action description="Ændre landskab med Linden planter" longdescription="Disse rettigheder inkluderer mulighed til at tillade beboere at returnere objekter og placere og flytte Linden planter. Dette er brugbart for at medlemmer kan holde orden og tilpasse landskabet. Denne mulighed skal benyttes med varsomhed, da der ikke er mulighed for at fortryde returnering af objekter og ændringer i landskabet." name="land gardening" value="35"/> </action_set> <action_set description="Disse rettigheder inkluderer mulighed til at dedikere, ændre og sælge gruppe-ejede objekter. Disse ændringer sker i 'Rediger'> 'Generelt' fanen." name="Object Management"> - <action description="Dediker objekter til gruppe" longdescription="Dediker objekter til gruppe i 'Rediger'> 'Generelt' fanen." name="object deed"/> - <action description="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter" longdescription="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter i 'Rediger'> 'Generelt' fanen." name="object manipulate"/> - <action description="Sæt gruppe-ejede objekter til salg" longdescription="Sæt gruppe-ejede objekter til salg i 'Rediger'> 'Generelt' fanen." name="object set sale"/> + <action description="Dediker objekter til gruppe" longdescription="Dediker objekter til gruppe i 'Rediger'> 'Generelt' fanen." name="object deed" value="36"/> + <action description="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter" longdescription="Manipulér (flyt, kopiér, ændre) gruppe-ejede objekter i 'Rediger'> 'Generelt' fanen." name="object manipulate" value="38"/> + <action description="Sæt gruppe-ejede objekter til salg" longdescription="Sæt gruppe-ejede objekter til salg i 'Rediger'> 'Generelt' fanen." name="object set sale" value="39"/> </action_set> <action_set description="Disse rettigheder inkluderer mulighed til at håndtere betalinger for gruppen og styre adgang til gruppens kontobevægelser." name="Accounting"> - <action description="Betale gruppe regninger og modtage gruppe udbytte" longdescription="Medlemmer med denne rolle vil automatisk betale gruppe regninger og modtage gruppe udbytte. Det betyder at de vil modtager en andel af indtægter fra salg af gruppe-ejet land og bidrage til betaling af gruppe-relaterede betalinger, som f.eks. betaling for at paceller vises i lister. " name="accounting accountable"/> + <action description="Betale gruppe regninger og modtage gruppe udbytte" longdescription="Medlemmer med denne rolle vil automatisk betale gruppe regninger og modtage gruppe udbytte. Det betyder at de vil modtager en andel af indtægter fra salg af gruppe-ejet land og bidrage til betaling af gruppe-relaterede betalinger, som f.eks. betaling for at paceller vises i lister. " name="accounting accountable" value="40"/> </action_set> <action_set description="Disse rettigheder inkluderer adgang til at kunne sende, modtage og se gruppe beskeder." name="Notices"> - <action description="Send beskeder" longdescription="Medlemmer med denne rolle kan sende beskeder i 'Beskeder' fanen." name="notices send"/> - <action description="Modtage og se tidligere beskeder" longdescription="Medlemmer med denne rolle kan modtage og se tidligere beskeder i 'Beskeder' fanen." name="notices receive"/> - </action_set> - <action_set description="Disse rettigheder inkluderer adgang til at kunne oprette forslag, stemme på forslag og se historik med forslag." name="Proposals"> - <action description="Opret forslag" longdescription="Medlemmer med denne rolle kan oprette forslag som der kan stemmes om i 'Forslag' fanen." name="proposal start"/> - <action description="Stem på forslag" longdescription="Medlemmer med denne rolle kan stemme på forslag i 'Forslag' fanen." name="proposal vote"/> + <action description="Send beskeder" longdescription="Medlemmer med denne rolle kan sende beskeder i 'Beskeder' fanen." name="notices send" value="42"/> + <action description="Modtage og se tidligere beskeder" longdescription="Medlemmer med denne rolle kan modtage og se tidligere beskeder i 'Beskeder' fanen." name="notices receive" value="43"/> </action_set> <action_set description="Disse rettigheder styrer hvem der kan deltage i gruppe-chat og gruppe stemme-chat." name="Chat"> - <action description="Deltage i gruppe-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe-chat sessioner" name="join group chat"/> - <action description="Deltag i gruppe stemme-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe stemme-chat sessioner. BEMÆRK: Medlemmet skal også have rollen 'Deltage i gruppe-chat' for at denne rolle har effekt." name="join voice chat"/> - <action description="Styr gruppe-chat" longdescription="Medlemmer med denne rolle kan kontrollere adgang og deltagelse i gruppe-chat og gruppe stemme-chat sessioner." name="moderate group chat"/> + <action description="Deltage i gruppe-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe-chat sessioner" name="join group chat" value="16"/> + <action description="Deltag i gruppe stemme-chat" longdescription="Medlemmer med denne rolle kan deltage i gruppe stemme-chat sessioner. BEMÆRK: Medlemmet skal også have rollen 'Deltage i gruppe-chat' for at denne rolle har effekt." name="join voice chat" value="27"/> + <action description="Styr gruppe-chat" longdescription="Medlemmer med denne rolle kan kontrollere adgang og deltagelse i gruppe-chat og gruppe stemme-chat sessioner." name="moderate group chat" value="37"/> </action_set> </role_actions> diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml index afd933c7fa..6f891b8d1b 100644 --- a/indra/newview/skins/default/xui/da/strings.xml +++ b/indra/newview/skins/default/xui/da/strings.xml @@ -191,6 +191,9 @@ <string name="TooltipAgentUrl"> Klik for at se beboers profil </string> + <string name="TooltipAgentInspect"> + Lær mere om denne beboer + </string> <string name="TooltipAgentMute"> Klik for at slukke for denne beboer </string> @@ -738,6 +741,12 @@ <string name="Estate / Full Region"> Estate / Hel region </string> + <string name="Estate / Homestead"> + Estate / Homestead + </string> + <string name="Mainland / Homestead"> + Mainland / Homestead + </string> <string name="Mainland / Full Region"> Mainland / Hel region </string> @@ -775,7 +784,7 @@ XML Fil </string> <string name="raw_file"> - RAW Fil + RAW fil </string> <string name="compressed_image_files"> Komprimerede billeder @@ -1728,11 +1737,8 @@ <string name="InvOfferGaveYou"> gav dig </string> - <string name="InvOfferYouDecline"> - Du afslår - </string> - <string name="InvOfferFrom"> - fra + <string name="InvOfferDecline"> + Du afslår [DESC] fra <nolink>[NAME]</nolink>. </string> <string name="GroupMoneyTotal"> Total @@ -3469,7 +3475,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 logget af. </string> <string name="invite_message"> Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat. @@ -3538,7 +3544,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. http://secondlife.com/landing/voicemorphing </string> <string name="paid_you_ldollars"> - [NAME] betalte dig L$[AMOUNT] + [NAME] betalte dig L$[AMOUNT] [REASON]. + </string> + <string name="paid_you_ldollars_no_reason"> + [NAME] betalte dig L$[AMOUNT]. </string> <string name="you_paid_ldollars"> Du betalte [NAME] L$[AMOUNT] [REASON]. @@ -3552,6 +3561,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="you_paid_ldollars_no_name"> Du betalte L$[AMOUNT] [REASON]. </string> + <string name="for item"> + til [ITEM] + </string> <string name="for a parcel of land"> for en parcel land </string> @@ -3570,6 +3582,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE]. <string name="to upload"> for at uploade </string> + <string name="to publish a classified ad"> + til offentliggørelse af annonce + </string> <string name="giving"> Giver L$ [AMOUNT] </string> 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_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 87fb580aba..5b3267d7c9 100644 --- a/indra/newview/skins/default/xui/de/floater_event.xml +++ b/indra/newview/skins/default/xui/de/floater_event.xml @@ -1,40 +1,11 @@ -<?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"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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="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.string name="done_text"> + Fertig + </floater.string> + <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_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml index d931596efe..9644bbbaea 100644 --- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml @@ -14,6 +14,9 @@ <combo_box.item label="8x" name="8x"/> <combo_box.item label="16x" name="16x"/> </combo_box> + <text name="antialiasing restart"> + (Neustart des Viewers erforderlich) + </text> <spinner label="Gamma:" name="gamma"/> <text name="(brightness, lower is brighter)"> (0 = Standard-Helligkeit, weniger = heller) 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_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_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml index a2712c437b..3624c4c968 100644 --- a/indra/newview/skins/default/xui/de/floater_preferences.xml +++ b/indra/newview/skins/default/xui/de/floater_preferences.xml @@ -5,10 +5,12 @@ <tab_container name="pref core"> <panel label="Allgemein" name="general"/> <panel label="Grafik" name="display"/> - <panel label="Privatsphäre" name="im"/> <panel label="Sound & Medien" name="audio"/> <panel label="Chat" name="chat"/> + <panel label="Bewegen und anzeigen" name="move"/> <panel label="Meldungen" name="msgs"/> + <panel label="Farben" name="colors"/> + <panel label="Privatsphäre" name="im"/> <panel label="Konfiguration" name="input"/> <panel label="Erweitert" name="advanced1"/> </tab_container> diff --git a/indra/newview/skins/default/xui/de/floater_region_debug_console.xml b/indra/newview/skins/default/xui/de/floater_region_debug_console.xml new file mode 100644 index 0000000000..b8a1a89c30 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_region_debug_console.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="region_debug_console" title="Regions-Debug"/> 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 22f2fd93ab..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,7 +19,7 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mein Avatar:"/> </layout_panel> - <layout_panel name="leave_call_panel"> + <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"/> 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_inventory_gear_default.xml b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml index 3fa68a27bd..df86a5cf71 100644 --- a/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/de/menu_inventory_gear_default.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_gear_default"> +<toggleable_menu name="menu_gear_default"> <menu_item_call label="Neues Inventar-Fenster" name="new_window"/> - <menu_item_call label="Nach Name sortieren" name="sort_by_name"/> - <menu_item_call label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/> + <menu_item_check label="Nach Name sortieren" name="sort_by_name"/> + <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_by_recent"/> + <menu_item_check label="Systemordner nach oben" name="sort_system_folders_to_top"/> <menu_item_call label="Filter anzeigen" name="show_filters"/> <menu_item_call label="Filter zurücksetzen" name="reset_filters"/> <menu_item_call label="Alle Ordner schließen" name="close_folders"/> @@ -12,4 +13,4 @@ <menu_item_call label="Original suchen" name="Find Original"/> <menu_item_call label="Alle Links suchen" name="Find All Links"/> <menu_item_call label="Papierkorb ausleeren" name="empty_trash"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml index bb9a4c8354..9eeeaccdea 100644 --- a/indra/newview/skins/default/xui/de/menu_viewer.xml +++ b/indra/newview/skins/default/xui/de/menu_viewer.xml @@ -12,6 +12,12 @@ <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/> <menu_item_check label="Meine Gesten" name="Gestures"/> <menu_item_check label="Meine Stimme" name="ShowVoice"/> + <menu label="Bewegung" name="Movement"> + <menu_item_call label="Hinsetzen" name="Sit Down Here"/> + <menu_item_check label="Fliegen" name="Fly"/> + <menu_item_check label="Immer rennen" name="Always Run"/> + <menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/> + </menu> <menu label="Mein Status" name="Status"> <menu_item_call label="Abwesend" name="Set Away"/> <menu_item_call label="Beschäftigt" name="Set Busy"/> @@ -47,6 +53,7 @@ <menu_item_check label="Landeigentümer" name="Land Owners"/> <menu_item_check label="Koordinaten" name="Coordinates"/> <menu_item_check label="Parzelleneigenschaften" name="Parcel Properties"/> + <menu_item_check label="Menü „Erweitert“" name="Show Advanced Menu"/> </menu> <menu_item_call label="Teleport nach Hause" name="Teleport Home"/> <menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/> @@ -85,6 +92,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 +106,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,9 +127,9 @@ <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"/> <menu_item_call label="Textur neu laden" name="Rebake Texture"/> <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/> <menu_item_call label="Fenstergröße einstellen..." name="Set Window Size..."/> @@ -175,8 +184,7 @@ <menu_item_check label="Suchen" name="Search"/> <menu_item_call label="Tasten freigeben" name="Release Keys"/> <menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/> - <menu_item_check label="Immer rennen" name="Always Run"/> - <menu_item_check label="Fliegen" name="Fly"/> + <menu_item_check label="Erweitert-Menü anzeigen - veraltetet" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="Fenster schließen" name="Close Window"/> <menu_item_call label="Alle Fenster schließen" name="Close All Windows"/> <menu_item_call label="Foto auf Datenträger" name="Snapshot to Disk"/> @@ -194,7 +202,6 @@ <menu_item_call label="Hineinzoomen" name="Zoom In"/> <menu_item_call label="Zoom-Standard" name="Zoom Default"/> <menu_item_call label="Wegzoomen" name="Zoom Out"/> - <menu_item_check label="Menü „Erweitert“ anzeigen" name="Show Advanced Menu"/> </menu> <menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/> <menu_item_check label="Menü „Entwickler“ anzeigen" name="Debug Mode"/> @@ -309,8 +316,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: Teleport" name="DoubleClick Teleport"/> + <menu_item_check label="Regions-Debug-Konsole" name="Region Debug Console"/> <menu_item_check label="Fehler in SelectMgr beseitigen" name="Debug SelectMgr"/> <menu_item_check label="Fehler in Klicks beseitigen" name="Debug Clicks"/> <menu_item_check label="Debug-Ansichten" name="Debug Views"/> @@ -322,10 +328,9 @@ <menu label="XUI" name="XUI"> <menu_item_call label="Farbeinstellungen neu laden" name="Reload Color Settings"/> <menu_item_call label="Schriftarttest anzeigen" name="Show Font Test"/> - <menu_item_call label="Von XML laden" name="Load from XML"/> - <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"> @@ -362,9 +367,9 @@ <menu_item_call label="Bilder komprimieren" name="Compress Images"/> <menu_item_check label="Ausgabe Fehlerbeseitigung ausgeben" name="Output Debug Minidump"/> <menu_item_check label="Bei nächster Ausführung Fenster öffnen" name="Console Window"/> - <menu_item_check label="Admin-Menü anzeigen" name="View Admin Options"/> <menu_item_call label="Admin-Status anfordern" name="Request Admin Options"/> <menu_item_call label="Admin-Status verlassen" name="Leave Admin Options"/> + <menu_item_check label="Admin-Menü anzeigen" name="View Admin Options"/> </menu> <menu label="Admin" name="Admin"> <menu label="Object"> diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml index c518c193a0..06cc02cd84 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. @@ -395,6 +395,9 @@ Hinweis: Der Cache wird dabei gelöscht/geleert. <notification name="ChangeSkin"> Die neue Benutzeroberfläche wird nach einem Neustart von [APP_NAME] angezeigt. </notification> + <notification name="ChangeLanguage"> + Die Sprachänderung tritt nach Neustart von [APP_NAME] in Kraft. + </notification> <notification name="GoToAuctionPage"> Zur [SECOND_LIFE]-Webseite, um Auktionen anzuzeigen oder ein Gebot abzugeben? <url name="url"> @@ -607,6 +610,10 @@ Erwartet wurde [VALIDS] „Daten“-Chunk in WAV-Header nicht gefunden: [FILE] </notification> + <notification name="SoundFileInvalidChunkSize"> + Falsche Chunk-Größe in WAV-Datei: +[FILE] + </notification> <notification name="SoundFileInvalidTooLong"> Audiodatei ist zu lang (max. 10 Sekunden): [FILE] @@ -932,12 +939,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 +982,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 +1105,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"> @@ -1350,6 +1350,15 @@ Dieses Update ist nicht erforderlich, für bessere Leistung und Stabilität soll In Ihren Anwendungsordner herunterladen? <usetemplate name="okcancelbuttons" notext="Weiter" yestext="Herunterladen"/> </notification> + <notification name="FailedUpdateInstall"> + Beim Installieren des Viewer-Updates ist ein Fehler aufgetreten. +Laden Sie den neuesten Viewer von http://secondlife.com/download herunter und installieren Sie ihn. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DownloadBackground"> + Eine aktualisierte Version von [APP_NAME] wurde heruntergeladen. +Sie wird beim nächsten Neustart von [APP_NAME] verwendet. + </notification> <notification name="DeedObjectToGroup"> Bei Übertragung dieses Objekts erhält die Gruppe: * An das Objekt bezahlte L$ @@ -1479,6 +1488,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 +2096,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 +2166,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 +2236,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,7 +2248,7 @@ Wählen Sie eine kleinere Landfläche. [NAME] [DATE] <form name="form"> - <button name="Details" text="Beschreibung"/> + <button name="Details" text="Details"/> <button name="Cancel" text="Abbrechen"/> </form> </notification> @@ -2235,7 +2284,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. @@ -2362,7 +2411,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"/> @@ -2427,9 +2476,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"/> @@ -2448,8 +2497,8 @@ Versuchen Sie es in einigen Minuten erneut. Ihr Freundschaftsangebot wurde abgelehnt. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] bietet Ihnen ihre/seine Visitenkarte an. -Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach eine IM schicken können. + [NAME] bietet Ihnen eine Visitenkarte an. +In Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner schnell IMs senden können. <form name="form"> <button name="Accept" text="Akzeptieren"/> <button name="Decline" text="Ablehnen"/> @@ -2468,7 +2517,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"/> @@ -2484,7 +2533,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? @@ -2495,7 +2544,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. @@ -2508,14 +2557,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"/> @@ -2553,13 +2602,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. @@ -2786,6 +2835,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_edit_gloves.xml b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml index ad87e432d6..fb7d18f66c 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_gloves_panel"> <panel name="avatar_gloves_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml index 8fe76f6225..1b7c1d79a5 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_jacket_panel"> <panel name="avatar_jacket_color_panel"> - <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> - <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Obere Textur" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Untere Textur" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_pants.xml b/indra/newview/skins/default/xui/de/panel_edit_pants.xml index d40a27c5fd..533cf20412 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_pants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_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_edit_shirt.xml b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml index 344b0b412a..4f140a2b01 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml index 56aee5d0fe..abedb8d89e 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shoes_panel"> <panel name="avatar_shoes_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml index c8931bc947..07ce8a7436 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_socks.xml b/indra/newview/skins/default/xui/de/panel_edit_socks.xml index abbeefa44e..4e72b63f49 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_socks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml index 03c61a495d..1fad0ccedb 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_underpants_panel"> <panel name="avatar_underpants_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml index 39919393e1..9d193ffedb 100644 --- a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_undershirt_panel"> <panel name="avatar_undershirt_color_panel"> - <texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> + <texture_picker label="Textur" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/> <color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> </panel> <panel name="accordion_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_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_notify_textbox.xml b/indra/newview/skins/default/xui/de/panel_notify_textbox.xml new file mode 100644 index 0000000000..7187be570c --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_notify_textbox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_notify_textbox"> + <string name="message_max_lines_count" value="7"/> + <panel label="info_panel" name="info_panel"> + <text_editor name="message" value="message"/> + parse_urls="false" + <button label="Senden" name="btn_submit"/> + </panel> + <panel label="control_panel" name="control_panel"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml index 6c859da4d6..99e0b933b8 100644 --- a/indra/newview/skins/default/xui/de/panel_people.xml +++ b/indra/newview/skins/default/xui/de/panel_people.xml @@ -22,7 +22,7 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <tab_container name="tabs"> <panel label="IN DER NÄHE" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="nearby_view_sort_btn" tool_tip="Optionen"/> + <menu_button name="nearby_view_sort_btn" tool_tip="Optionen"/> <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> </panel> </panel> @@ -34,27 +34,27 @@ Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte]. <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="bottom_panel"> <layout_panel name="options_gear_btn_panel"> - <button name="friends_viewsort_btn" tool_tip="Zusätzliche Optionen anzeigen"/> + <menu_button name="friends_viewsort_btn" tool_tip="Zusätzliche Optionen anzeigen"/> </layout_panel> <layout_panel name="add_btn_panel"> <button name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/> </layout_panel> <layout_panel name="trash_btn_panel"> - <dnd_button name="trash_btn" tool_tip="Ausgewählte Person von Ihrer Freundesliste entfernen"/> + <dnd_button name="del_btn" tool_tip="Ausgewählte Person aus Ihrer Freundesliste entfernen"/> </layout_panel> </layout_stack> </panel> </panel> <panel label="MEINE GRUPPEN" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="groups_viewsort_btn" tool_tip="Optionen"/> + <menu_button name="groups_viewsort_btn" tool_tip="Optionen"/> <button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/> <button name="activate_btn" tool_tip="Ausgewählte Gruppe aktivieren"/> </panel> </panel> <panel label="AKTUELL" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="recent_viewsort_btn" tool_tip="Optionen"/> + <menu_button name="recent_viewsort_btn" tool_tip="Optionen"/> <button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/> </panel> </panel> 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_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml index 0e85829a0b..36c77d4fe1 100644 --- a/indra/newview/skins/default/xui/de/panel_places.xml +++ b/indra/newview/skins/default/xui/de/panel_places.xml @@ -21,7 +21,7 @@ <button label="Bearbeiten" name="edit_btn" tool_tip="Landmarken-Info bearbeiten"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="▼" name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/> + <menu_button label="▼" name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml index 7b6918ae24..0a596f2b25 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml @@ -3,35 +3,16 @@ <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <panel.string name="middle_mouse"> - Mittlere Maustaste - </panel.string> - <slider label="Sichtwinkel" name="camera_fov"/> - <slider label="Abstand" name="camera_offset_scale"/> - <text name="heading2"> - Automatische Position für: - </text> - <check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/> - <check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/> - <check_box initial_value="true" label="Seitenleiste" name="appearance_sidebar_positioning" tool_tip="Automatische Kameraposition für Seitenleiste verwenden"/> - <check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/> - <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/> - <check_box label="2-mal-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/> - <check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/> - <check_box label="Blasen-Chat" name="bubble_text_chat"/> - <slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/> - <color_swatch left_pad="35" name="background" tool_tip="Farbe für Blasen-Chat auswählen"/> <text name="UI Size:"> - UI-Größe + UI-Größe: </text> <check_box label="Skript-Fehler anzeigen:" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="Chat in der Nähe" name="0"/> <radio_item label="Getrenntes Fenster" name="1"/> </radio_group> - <check_box label="Sprachfunktion ein-/ausschalten, wenn gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/> - <line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/> - <button label="Taste festlegen" name="set_voice_hotkey_button"/> - <button label="Mittlere Maustaste" name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/> - <button label="Andere Geräte" name="joystick_setup_button"/> + <check_box label="Mehrere Viewer zulassen" name="allow_multiple_viewer_check"/> + <check_box label="Bei Anmeldung Rasterauswahl anzeigen" name="show_grid_selection_check"/> + <check_box label="Menü „Erweitert“ anzeigen" name="show_advanced_menu_check"/> + <check_box label="Menü „Entwickler“ anzeigen" name="show_develop_menu_check"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index aa314a1a57..8086128dd7 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -8,44 +8,10 @@ <radio_item label="Mittel" name="radio2" value="1"/> <radio_item label="Groß" name="radio3" value="2"/> </radio_group> - <text name="font_colors"> - Schriftfarben: - </text> - <color_swatch label="Sie" name="user"/> - <text name="text_box1"> - Ich - </text> - <color_swatch label="Andere" name="agent"/> - <text name="text_box2"> - Andere - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="System" name="system"/> - <text name="text_box4"> - System - </text> - <color_swatch label="Skriptfehler" name="script_error"/> - <text name="text_box5"> - Skriptfehler - </text> - <color_swatch label="Objekte" name="objects"/> - <text name="text_box6"> - Objekte - </text> - <color_swatch label="Eigentümer" name="owner"/> - <text name="text_box7"> - Eigentümer - </text> - <color_swatch label="URLs" name="links"/> - <text name="text_box9"> - URLs - </text> <check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/> <check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/> <check_box label="Kompakten IM- und Text-Chatverlauf aktivieren" name="plain_text_chat_history"/> + <check_box label="Blasen-Chat" name="bubble_text_chat"/> <text name="show_ims_in_label"> IMs anzeigen in: </text> @@ -56,6 +22,13 @@ <radio_item label="Getrennte Fenster" name="radio" value="0"/> <radio_item label="Registerkarten" name="radio2" value="1"/> </radio_group> + <text name="disable_toast_label"> + Popups für eingehende Chats aktivieren: + </text> + <check_box label="Gruppen-Chats" name="EnableGroupChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Gruppen-Chat-Message eintrifft"/> + <check_box label="IM-Chats" name="EnableIMChatPopups" tool_tip="Markieren, um Popups zu sehen, wenn Instant Message eintrifft"/> + <spinner label="Lebenszeit von Toasts für Chat in der Nähe:" name="nearby_toasts_lifetime"/> + <spinner label="Ein-/Ausblenddauer von Toasts für Chat in der Nähe:" name="nearby_toasts_fadingtime"/> <check_box label="Bei Chat Maschinenübersetzung verwenden (Service von Google)" name="translate_chat_checkbox"/> <text name="translate_language_text"> Chat übersetzen in: diff --git a/indra/newview/skins/default/xui/de/panel_preferences_colors.xml b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml new file mode 100644 index 0000000000..d9e5c7f2b5 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_preferences_colors.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Farben" name="colors_panel"> + <text name="effects_color_textbox"> + Meine Effekte (Auswahlstrahl): + </text> + <color_swatch name="effect_color_swatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> + <text name="font_colors"> + Schriftfarben für Chat: + </text> + <text name="text_box1"> + Ich + </text> + <text name="text_box2"> + Andere + </text> + <text name="text_box3"> + Objekte + </text> + <text name="text_box4"> + System + </text> + <text name="text_box5"> + Fehler + </text> + <text name="text_box7"> + Eigentümer + </text> + <text name="text_box9"> + URLs + </text> + <text name="bubble_chat"> + Hintergrund für Blasen-Chat: + </text> + <color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen"/> + <slider label="Deckkraft:" name="bubble_chat_opacity"/> + <text name="floater_opacity"> + Floater-Deckkraft: + </text> + <slider label="Aktiv:" name="active"/> + <slider label="Inaktiv:" name="inactive"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml index b59a779853..79b2a544f9 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml @@ -44,16 +44,22 @@ <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"/> - <text name="effects_color_textbox"> - Meine Effekte: + <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"/> + <check_box label="Anzeigenamen anzeigen" name="display_names_check" tool_tip="Aktivieren Sie diese Option, um Anzeigenamen in Chat, IM, Avatarnamen usw. zu verwenden."/> + <check_box label="Viewer-UI-Tipps aktivieren" name="viewer_hints_check"/> + <text name="inworld_typing_rg_label"> + Drücken von Buchstabentasten: </text> + <radio_group name="inworld_typing_preference"> + <radio_item label="Startet lokalen Chat" name="radio_start_chat" value="1"/> + <radio_item label="Beeinflusst Bewegung (z. B. WASD)" name="radio_move" value="0"/> + </radio_group> <text name="title_afk_text"> Zeit bis zur Abwesenheit: </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/> <combo_box label="Timeout für Abwesenheit:" name="afk"> <combo_box.item label="2 Minuten" name="item0"/> <combo_box.item label="5 Minuten" name="item1"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml index ae3c791ab9..63161c954e 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml @@ -25,6 +25,7 @@ <text name="ShadersText"> Shader: </text> + <check_box initial_value="true" label="Transparentes Wasser" name="TransparentWater"/> <check_box initial_value="true" label="Bumpmapping und Glanz" name="BumpShiny"/> <check_box initial_value="true" label="Einfache Shader" name="BasicShaders" tool_tip="Deaktivieren Sie diese Option, wenn der Grafikkartentreiber Abstürze verursacht"/> <check_box initial_value="true" label="Atmosphären-Shader" name="WindLightUseAtmosShaders"/> @@ -46,7 +47,7 @@ <slider label="Max. Anzahl an voll dargestellten Avataren:" name="MaxNumberAvatarDrawn"/> <slider label="Post-Processing-Qualität:" name="RenderPostProcess"/> <text name="MeshDetailText"> - Gitterdetails: + Darstellungsgrad: </text> <slider label=" Objekte:" name="ObjectMeshDetail"/> <slider label=" Flexiprimitiva:" name="FlexibleMeshDetail"/> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_move.xml b/indra/newview/skins/default/xui/de/panel_preferences_move.xml new file mode 100644 index 0000000000..fb749a16d7 --- /dev/null +++ b/indra/newview/skins/default/xui/de/panel_preferences_move.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Bewegen" name="move_panel"> + <slider label="Sichtwinkel" name="camera_fov"/> + <slider label="Abstand" name="camera_offset_scale"/> + <text name="heading2"> + Automatische Position für: + </text> + <check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/> + <check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/> + <check_box initial_value="true" label="Seitenleiste" name="appearance_sidebar_positioning" tool_tip="Automatische Kameraposition für Seitenleiste verwenden"/> + <check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/> + <text name=" Mouse Sensitivity"> + Mausempfindlichkeit für Mouselook: + </text> + <check_box label="Umkehren" name="invert_mouse"/> + <check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/> + <check_box label="Drücken-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/> + <check_box label="Doppelklicken:" name="double_click_chkbox"/> + <radio_group name="double_click_action"> + <radio_item label="Teleportieren" name="radio_teleport"/> + <radio_item label="Autopilot" name="radio_autopilot"/> + </radio_group> + <button label="Andere Geräte" name="joystick_setup_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml index 42a625fbf6..d78064833b 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml @@ -10,16 +10,19 @@ <check_box label="Nur Freunde und Gruppen wissen, dass ich online bin" name="online_visibility"/> <check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/> <check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/> - <check_box label="Cookies annehmen" name="cookies_enabled"/> <text name="Logs:"> - Protokolle: + Chatprotokolle: </text> <check_box label="Protokolle von Gesprächen in der Nähe auf meinem Computer speichern" name="log_nearby_chat"/> <check_box label="IM Protokolle auf meinem Computer speichern" name="log_instant_messages"/> - <check_box label="Zeitstempel hinzufügen" name="show_timestamps_check_im"/> + <check_box label="Zeitstempel zu jeder Zeile im Chatprotokoll hinzufügen" name="show_timestamps_check_im"/> + <check_box label="Datumsstempel zu Protokolldateinamen hinzufügen" name="logfile_name_datestamp"/> <text name="log_path_desc"> Protokolle speichern in: </text> <button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/> <button label="Ignorierte Einwohner/Objekte" name="block_list" width="180"/> + <text name="block_list_label"> + (Personen und/oder Objekte, die Sie blockiert haben) + </text> </panel> 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..c4d095dde5 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml @@ -1,13 +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> - <text name=" Mouse Sensitivity"> - Mausempfindlichkeit: - </text> - <check_box label="Umkehren" name="invert_mouse"/> <text name="Network:"> Netzwerk: </text> @@ -40,10 +32,12 @@ <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: </text> <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/> <spinner label="Portnummer:" name="web_proxy_port"/> + <check_box initial_value="true" label="Updates für [APP_NAME] automatisch herunterladen und installieren" name="updater_service_active"/> </panel> diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml index 5c71b20fb0..26674ea594 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sounds" name="Preference Media panel"> + <panel.string name="middle_mouse"> + Mittlere Maustaste + </panel.string> <slider label="Master-Lautstärke" name="System Volume"/> <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/> <slider label="Schaltflächen" name="UI Volume"/> @@ -23,6 +26,11 @@ <radio_item label="Kameraposition" name="0"/> <radio_item label="Avatarposition" name="1"/> </radio_group> + <check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/> + <check_box label="Sprachfunktion beim Drücken folgender Taste(n) ein-/ausschalten:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon ein- oder auszuschalten. Wenn der Umschaltmodus nicht aktiviert ist, ist das Mikrofon nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/> + <line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/> + <button label="Taste festlegen" name="set_voice_hotkey_button"/> + <button name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/> <button label="Eingabe-/Ausgabegeräte" name="device_settings_btn"/> <panel label="Geräte-Einstellungen" name="device_settings_panel"> <panel.string name="default_text"> diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml index 40fa2f922a..938631f65d 100644 --- a/indra/newview/skins/default/xui/de/panel_profile.xml +++ b/indra/newview/skins/default/xui/de/panel_profile.xml @@ -57,7 +57,7 @@ <button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="▼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/> + <menu_button label="▼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/> </layout_panel> </layout_stack> </layout_panel> 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_script_ed.xml b/indra/newview/skins/default/xui/de/panel_script_ed.xml index 17970cf261..73789f06d8 100644 --- a/indra/newview/skins/default/xui/de/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/de/panel_script_ed.xml @@ -15,11 +15,6 @@ <panel.string name="Title"> Skript: [NAME] </panel.string> - <text_editor name="Script Editor"> - Wird geladen... - </text_editor> - <button label="Speichern" label_selected="Speichern" name="Save_btn"/> - <combo_box label="Einfügen..." name="Insert..."/> <menu_bar name="script_menu"> <menu label="Datei" name="File"> <menu_item_call label="Speichern" name="Save"/> @@ -40,4 +35,10 @@ <menu_item_call label="Schlüsselwort-Hilfe" name="Keyword Help..."/> </menu> </menu_bar> + <text_editor name="Script Editor"> + Wird geladen... + </text_editor> + <combo_box label="Einfügen..." name="Insert..."/> + <button label="Speichern" label_selected="Speichern" name="Save_btn"/> + <button label="Bearbeiten..." name="Edit_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 afcb68f537..e4676194aa 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> @@ -1764,11 +1773,8 @@ <string name="InvOfferGaveYou"> hat Ihnen folgendes übergeben </string> - <string name="InvOfferYouDecline"> - Sie lehnen folgendes ab: - </string> - <string name="InvOfferFrom"> - von + <string name="InvOfferDecline"> + Sie lehnen [DESC] von <nolink>[NAME]</nolink> ab. </string> <string name="GroupMoneyTotal"> Gesamtbetrag @@ -3574,7 +3580,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 +3649,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 +3666,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 +3687,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/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml index cd5922a9a2..49deb9b025 100644 --- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml @@ -20,6 +20,7 @@ left="0" name="normal_background" top="17" + use_draw_context_alpha="false" width="350" /> <text type="string" @@ -292,6 +293,7 @@ Re-enter amount to see the latest exchange rate. left="0" name="error_background" top="15" + use_draw_context_alpha="false" width="350"/> <text type="string" diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml index 14f9e2db95..8df5e232d9 100644 --- a/indra/newview/skins/default/xui/en/floater_env_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml @@ -44,6 +44,7 @@ left="85" name="EnvDayCycle" top="30" + use_draw_context_alpha="false" width="200" /> <slider control_name="EnvTimeSlider" diff --git a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml index 388825d31a..c86ed595a7 100644 --- a/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml +++ b/indra/newview/skins/default/xui/en/floater_inventory_view_finder.xml @@ -95,12 +95,12 @@ width="126" /> <icon height="16" - image_name="Inv_Notecard" + image_name="Inv_Mesh" layout="topleft" left="8" mouse_opaque="true" - name="icon_notecard" - top="122" + name="icon_mesh" + top="142" width="16" /> <check_box height="16" @@ -112,12 +112,12 @@ width="126" /> <icon height="16" - image_name="Inv_Mesh" + image_name="Inv_Notecard" layout="topleft" left="8" mouse_opaque="true" - name="icon_mesh" - top="142" + name="icon_notecard" + top="122" width="16" /> <check_box height="16" diff --git a/indra/newview/skins/default/xui/en/floater_model_preview.xml b/indra/newview/skins/default/xui/en/floater_model_preview.xml index f1b6024ff7..ee47e53db9 100644 --- a/indra/newview/skins/default/xui/en/floater_model_preview.xml +++ b/indra/newview/skins/default/xui/en/floater_model_preview.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater can_close="true" can_drag_on_left="false" can_minimize="false" - can_resize="true" height="520" min_height="520" min_width="630" - name="Model Preview" title="Upload Model" width="630"> + can_resize="true" height="550" min_height="550" min_width="620" + name="Model Preview" title="Upload Model" width="620"> <string name="status_idle">Idle</string> <string name="status_reading_file">Loading...</string> @@ -10,103 +10,89 @@ <string name="medium">Medium</string> <string name="low">Low</string> <string name="lowest">Lowest</string> - <string name="mesh_status_good">Good</string> - <string name="mesh_status_bad">Bad</string>" + <string name="mesh_status_good">Ship it!</string> <string name="mesh_status_na">N/A</string> <string name="mesh_status_none">None</string> + <string name="mesh_status_submesh_mismatch">Levels of detail have a different number of textureable faces.</string> + <string name="mesh_status_mesh_mismatch">Levels of detail have a different number of mesh instances.</string> + <string name="mesh_status_too_many_vertices">Level of detail has too many vertices.</string> + <string name="mesh_status_missing_lod">Missing required level of detail.</string> <string name="layer_all">All</string> <!-- Text to display in physics layer combo box for "all layers" --> <text left="15" bottom="25" follows="top|left" height="15" name="name_label"> Name: </text> - <line_editor bottom_delta="20" follows="top|left|right" height="19" max_length="254" - name="description_form" width="310" /> - <text bottom_delta="24" follows="top|left" height="15" name="preview_label"> + <line_editor bottom_delta="20" follows="top|left|right" height="19" + name="description_form" width="290" /> + + <text bottom_delta="20" left="15" follows="left|top" height="15" name="lod_label"> Preview: </text> + <combo_box bottom_delta="20" follows="left|top" height="18" + name="preview_lod_combo" width="240" tool_tip="LOD to view in preview render"> + <combo_item name="high"> + Level of Detail: High + </combo_item> + <combo_item name="medium"> + Level of Detail: Medium + </combo_item> + <combo_item name="low"> + Level of Detail: Low + </combo_item> + <combo_item name="lowest"> + Level of Detail: Lowest + </combo_item> + </combo_box> + <menu_button follows="top|left" + image_hover_unselected="Toolbar_Left_Over" + image_overlay="OptionsMenu_Off" + image_selected="Toolbar_Left_Selected" + image_unselected="Toolbar_Left_Off" + layout="topleft" + left_pad="5" + name="options_gear_btn" + width="31" + height="25"/> <!-- Placeholder panel for 3D preview render --> <panel name="preview_panel" left="15" - width="310" - height="310" + width="290" + height="290" follows="all"/> - <text bottom_delta="25" left="15" width="100" follows="bottom|left" height="15" name="streaming cost"> - Prim Cost: [COST] - </text> + <text bottom_delta="25" left="25" width="100" follows="bottom|left">Upload Details</text> + <panel top_pad="5" border="true" left="15" width="290" height="70" follows="bottom|left" + bevel_style="in" bg_alpha_color="0 0 0 0" bg_opaque_color="0 0 0 0.3"> + <text left="25" follows="bottom|left" width="140" height="15" name="streaming cost"> + Resource Cost: [COST] + </text> + <text left="25" top_pad="5" width="140" follows="bottom|left" height="15" name="physics cost"> + Physics Cost: Unknown + </text> + <text left="25" top_pad="5" follows="bottom|left" height="15" name="upload fee"> + Upload Fee: N/A + </text> + </panel> + + <text left="10" bottom="540" width="290" height="15" follows="bottom|left|right" name="status">[STATUS]</text> - <text right="320" width="100" height="15" bottom_delta="0" follows="bottom|right" name="status">[STATUS]</text> - - <text bottom_delta="20" left="15" follows="left|bottom" height="15" name="lod_label"> - Level of Detail: - </text> - <combo_box bottom_delta="20" follows="left|bottom" height="18" - name="preview_lod_combo" width="90" tool_tip="LOD to view in preview render"> - <combo_item name="lowest"> - Lowest - </combo_item> - <combo_item name="low"> - Low - </combo_item> - <combo_item name="medium"> - Medium - </combo_item> - <combo_item name="high"> - High - </combo_item> - </combo_box> - - <check_box bottom="450" left="125" follows="left|bottom" label="Show Edges" name="show edges" width="120" height="16" tool_tip="Render wireframe in preview window"/> - <check_box bottom_delta="15" left="125" follows="left|bottom" label="Show Physics" name="show physics" width="120" height="16" tool_tip="Show physics shape."/> - - <button bottom="510" follows="bottom|left" height="20" label="Upload" - left="15" width="80" name="ok_btn" tool_tip="Upload to simulator"/> - <button left_pad="10" follows="left|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/> + + <button bottom="540" left="430" follows="bottom|right" height="20" label="Upload" + width="80" name="ok_btn" tool_tip="Upload to simulator"/> + <button left_pad="10" follows="right|bottom" height="20" width="80" label="Cancel" name="cancel_btn"/> <tab_container follows="right|top|bottom" top="15" - left="330" - height="475" - width="280" + left="310" + height="470" + width="300" name="import_tab" border="true" tab_position="top"> - <!-- MODIFIERS PANEL --> - <panel - border="true" - label="Modifiers" - name="modifiers_panel" - left="330" - width="280" - height="450"> - - <text left="10" width="90" bottom="30" follows="top|left" height="15"> - Scale: - </text> - <text left_pad="5" width="140" follows="top|left" height="15"> - Dimensions: - </text> - - <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> - - <text left_pad="20" height="15" name="import_dimensions" follows="top|left"> - [X] x [Y] x [Z] m - </text> - - <text left="10" top_pad="20" follows="top_left" height="15"> - Include: - </text> - - <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/> - <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/> - <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/> - </panel> - - <!-- LOD PANEL --> <panel border="true" @@ -124,60 +110,110 @@ <text valign="center" halign="center" bg_visible="true" name="high_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="High"/> <text valign="center" halign="center" bg_visible="true" name="high_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> <text valign="center" halign="center" bg_visible="true" name="high_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value="Good"/> + <text valign="center" halign="center" bg_visible="true" name="high_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> + <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_high" left_delta="20" top_delta="0" /> <text valign="center" halign="center" bg_visible="true" name="medium_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Medium"/> <text valign="center" halign="center" bg_visible="true" name="medium_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> <text valign="center" halign="center" bg_visible="true" name="medium_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value="Good"/> + <text valign="center" halign="center" bg_visible="true" name="medium_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> + <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_medium" left_delta="20" top_delta="0" /> <text valign="center" halign="center" bg_visible="true" name="low_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Low"/> <text valign="center" halign="center" bg_visible="true" name="low_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> <text valign="center" halign="center" bg_visible="true" name="low_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value="Good"/> + <text valign="center" halign="center" bg_visible="true" name="low_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> + <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_low" left_delta="20" top_delta="0" /> <text valign="center" halign="center" bg_visible="true" name="lowest_label" left="10" top_pad="0" width="65" height="18" follows="left|top" value="Lowest"/> <text valign="center" halign="center" bg_visible="true" name="lowest_triangles" left_pad="0" width="65" height="18" follows="left|top" value="0"/> <text valign="center" halign="center" bg_visible="true" name="lowest_vertices" left_pad="0" width="65" height="18" follows="left|top" value="0"/> - <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value="Good"/> - - <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_tabel_footer"> + <text valign="center" halign="center" bg_visible="true" name="lowest_status" left_pad="0" width="65" height="18" follows="left|top" value=""/> + <icon height="16" width="16" image_name="lag_status_critical.tga" mouse_opaque="true" name="status_icon_lowest" left_delta="20" top_delta="0" /> + + <text left="10" width="240" height="15" top_pad="15" follows="left|top" name="lod_table_footer"> Level of Detail: [DETAIL] </text> - <text top_pad="10" height="15" follows="left|top"> + <icon height="16" width="16" left="20" follows="left|top" name="lod_status_message_icon"/> + <text left_pad="5" width="200" height="15" follows="left|top" name="lod_status_message_text"/> + + <text top_pad="10" left="10" height="15" follows="left|top"> Mesh </text> - <radio_group follows="top|left" height="100" left="30" name="lod_file_or_limit" width="240" value="lod_from_file"> - <radio_item bottom="85" label="Load from file" name="lod_from_file"/> - <radio_item bottom="40" label="Auto generate" name="lod_auuto_generate"/> + <radio_group follows="top|left" height="210" left="30" name="lod_file_or_limit" width="240" value="lod_from_file"> + <radio_item bottom="195" label="Load from file" name="lod_from_file"/> + <radio_item bottom="150" label="Auto generate" name="lod_auto_generate"/> + <radio_item bottom="0" label="None" name="lod_none"/> </radio_group> - <line_editor follows="left|top" bottom_delta="-60" width="140" left="45" value="" name="lod_file" height="20"/> + <line_editor follows="left|top" bottom_delta="-170" width="140" left="45" value="" name="lod_file" height="20"/> <button bottom_delta="3" name="lod_browse" label="Browse..." left_pad="5" follows="left|top" width="70" height="25"/> - <text follows="top|left" top_pad="22" width="140" left="45" height="15"> - Triangle Limit: + <combo_box follows="top|left" name="lod_mode" top_pad="22" width="100" left="45" height="20"> + <combo_item name="triangle_limit"> + Triangle Limit + </combo_item> + <combo_item name="error_threshold"> + Error Threshold + </combo_item> + </combo_box> + <spinner follows="top|left" name="lod_triangle_limit" left_pad="5" height="20" width="100" decimal_digits="0" enabled="true"/> + <spinner left_delta="0" bottom_delta="0" follows="top|left" name="lod_error_threshold" min_val="0" max_val="100" height="20" width="100" decimal_digits="3" visible="false" enabled="true"/> + + <text follows="top|left" name="build_operator_text" left="45" top_pad="10" width="100" height="15"> + Build Operator: + </text> + <text follows="top|left" name="queue_mode_text" left_pad="5" width="100" height="15"> + Queue Mode: + </text> + <combo_box follows="top|left" name="build_operator" top_pad="5" left="45" width="100" height="20"> + <combo_item name="half_edge_collapse"> + Half Edge Collapse + </combo_item> + <combo_item name="edge_collapse"> + Edge Collapse + </combo_item> + </combo_box> + + <combo_box follows="top|left" name="queue_mode" left_pad="5" width="100" height="20"> + <combo_item name="greedy"> + Greedy + </combo_item> + <combo_item name="lazy"> + Lazy + </combo_item> + <combo_item name="independent"> + Independent + </combo_item> + </combo_box> + + <text top_pad="10" name="border_mode_text" left="45" follows="left|top" width="100" height="15"> + Border Mode: </text> - <spinner follows="top|left" name="lod_triangle_limit" top_pad="5" height="20" width="60" decimal_digits="0" enabled="true"/> - - <button bottom_delta="3" left_pad="5" name="lod_generate" label="Generate" height="25" width="70" follows="left|top"/> - <text name="submeshes_info" follows="left|top" left="10" top_pad="7" height="15 width=240"> - Layers: [SUBMESHES] + <text left_pad="5" name="share_tolderance_text" follows="left|top" width="100" height="15"> + Share Tolerance: </text> - <button left="30" follows="top|left" top_pad="5" name="clear_materials" label="Clear Materials" width="100" height="25"/> - <button left="30" follows="top|left" top_pad="5" name="consolidate" label="Consolidate" width="100" height="25"/> - <text left="10" top_pad="10" follows="top|left" width="240" height="15"> - Normals + <combo_box follows="left|top" left="45" height="20" name="border_mode" width="100"> + <combo_item name="border_unlock"> + Unlock + </combo_item> + <combo_item name="border_lock"> + Lock + </combo_item> + </combo_box> + <spinner follows="left|top" name="share_tolerance" left_pad="5" width="100" height="20"/> + + <text left="10" top_pad="35" follows="top|left" width="240" height="15"> + Generate Normals </text> <text left="35" top_pad="5" follows="top|left" width="100" height="15"> Crease Angle: </text> - <spinner follows="top|left" top_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/> - <button follows="top|left" bottom_delta="3" left_pad="5" width="140" height="25" label="Generate Normals" name="generate_normals"/> + <spinner follows="top|left" left_pad="5" min_val="0" max_val="180" value="75" width="60" height="20" name="crease_angle"/> </panel> <!-- PANEL --> @@ -341,8 +377,32 @@ </panel> </panel> - - + <!-- MODIFIERS PANEL --> + <panel + border="true" + label="Modifiers" + name="modifiers_panel"> + <text left="10" width="90" bottom="30" follows="top|left" height="15"> + Scale: + </text> + <text left_pad="5" width="140" follows="top|left" height="15"> + Dimensions: + </text> + + <spinner left="10" height="20" follows="top|left" width="80" top_pad="5" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> + + <text left_pad="20" height="15" name="import_dimensions" follows="top|left"> + [X] x [Y] x [Z] m + </text> + + <text left="10" top_pad="20" follows="top|left" height="15"> + Include: + </text> + + <check_box top_pad="5" name="upload_textures" height="15" follows="top|left" label="Textures"/> + <check_box top_pad="5" name="upload_skin" height="15" follows="top|left" label="Skin weight"/> + <check_box top_pad="5" left="20" name="upload_joints" height="15" follows="top|left" label="Joint positions"/> + </panel> </tab_container> <!-- diff --git a/indra/newview/skins/default/xui/en/floater_model_wizard.xml b/indra/newview/skins/default/xui/en/floater_model_wizard.xml new file mode 100644 index 0000000000..4a4b8075c8 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_model_wizard.xml @@ -0,0 +1,230 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + layout="topleft" + name="Model Wizard" + help_topic="model_wizard" + bg_opaque_image_overlay="0.5 0.5 0.5 1" + height="450" + save_rect="true" + title="UPLOAD MODEL WIZARD" + width="530"> + <panel + height="600"> + <button + top="30" + left="410" + height="32" + name="upload" + enabled="false" + label="5. Upload" + border="false" + image_unselected="model_wizard/middle_button_off.png" + image_selected="model_wizard/middle_button_press.png" + image_hover_unselected="model_wizard/middle_button_over.png" + image_disabled="model_wizard/middle_button_disabled.png" + image_disabled_selected="model_wizard/middle_button_disabled.png" + width="110"/> + <button + top="30" + left="310" + height="32" + tab_stop="false" + name="review" + label="4. Review" + enabled="false" + border="false" + image_unselected="model_wizard/middle_button_off.png" + image_selected="model_wizard/middle_button_press.png" + image_hover_unselected="model_wizard/middle_button_over.png" + image_disabled="model_wizard/middle_button_disabled.png" + image_disabled_selected="model_wizard/middle_button_disabled.png" + width="110"/> + <button + top="30" + left="210" + height="32" + name="physics" + label="3. Physics" + tab_stop="false" + enabled="false" + border="false" + image_unselected="model_wizard/middle_button_off.png" + image_selected="model_wizard/middle_button_press.png" + image_hover_unselected="model_wizard/middle_button_over.png" + image_disabled="model_wizard/middle_button_disabled.png" + image_disabled_selected="model_wizard/middle_button_disabled.png" + width="110"/> + <button + top="30" + left="115" + name="optimize" + label="2. Optimize" + tab_stop="false" + height="32" + border="false" + image_unselected="model_wizard/middle_button_off.png" + image_selected="model_wizard/middle_button_press.png" + image_hover_unselected="model_wizard/middle_button_over.png" + image_disabled="model_wizard/middle_button_disabled.png" + image_disabled_selected="model_wizard/middle_button_disabled.png" + width="110"/> + <button + top="30" + left="15" + name="choose_file" + enabled="false" + label="1. Choose File" + height="32" + image_unselected="model_wizard/left_button_off.png" + image_selected="model_wizard/left_button_press.png" + image_hover_unselected="model_wizard/left_button_over.png" + image_disabled="model_wizard/left_button_disabled.png" + image_disabled_selected="model_wizard/left_button_disabled.png" + width="110"/> + <panel + top_pad="20" + height="20" + width="500" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true" + left="20"> + <text + width="200" + left="10" + top="2" + height="10" + font="SansSerifBig" + layout="topleft" + > + Upload Model + </text></panel> + <text + top_pad="14" + width="460" + height="20" + font="SansSerifSmall" + layout="topleft" + word_wrap="true" + left_delta="0"> + This wizard will help you import mesh models to Second Life. First specify a file containing the model you wish to import. Second Life supports COLLADA (.dae) files. + </text> + + <panel + top_delta="40" + left="15" + height="240" + width="500" + bg_opaque_color="DkGray2" + background_visible="true" + background_opaque="true"> + + <text + type="string" + length="1" + follows="left|top" + top="10" + height="10" + layout="topleft" + left_delta="10" + name="Cache location" + width="300"> + Filename: + </text> + <line_editor + border_style="line" + border_thickness="1" + follows="left|top" + font="SansSerifSmall" + height="20" + layout="topleft" + left_delta="0" + max_length="4096" + name="lod_file" + top_pad="5" + width="220" /> + <button + follows="left|top" + height="23" + label="Browse..." + label_selected="Browse..." + layout="topleft" + left_pad="10" + name="browse" + top_delta="-1" + width="75"> + </button> + <text + top_delta="-15" + width="200" + height="15" + font="SansSerifSmall" + layout="topleft" + left_pad="24"> + Model Preview: + </text> + + <!-- Placeholder panel for 3D preview render --> + + <panel + left_delta="-2" + top_pad="0" + name="preview_panel" + bevel_style="none" + border_style="line" + border="true" + height="150" + follows="all" + width="150"> + </panel> + <text + top_pad="10" + width="130" + height="15" + left="340" + word_wrap="true" + > + Dimensions (meters): + </text> + <text + top_pad="5" + width="150" + height="15" + name="import_dimensions" + left_delta="0"> + X: [X] | Y: [Y] | Z: [Z] + </text> + + <text + top="100" + width="320" + height="40" + left="10" + word_wrap="true" + > + Note: +Advanced users familiar with 3d content creation tools may prefer to use the Advanced Mesh Import window. + </text> + </panel> + <button + top="410" + right="-175" + width="80" + height="20" + label="<< Back" /> + <button + top="410" + right="-92" + width="80" + height="20" + label="Next >> " /> + <button + top="410" + right="-15" + width="70" + height="20" + label="Cancel" /> + </panel> + <spinner visible="false" left="10" height="20" follows="top|left" width="80" top_pad="-50" value="1.0" min_val="0.01" max_val="64.0" name="import_scale"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml index 4c5113aa55..ab966dbb0e 100644 --- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml @@ -2,9 +2,6 @@ <floater border_visible="false" border="false" - bg_opaque_image="Window_Foreground" - bg_alpha_image="Window_Background" - bg_alpha_image_overlay="DkGray_66" legacy_header_height="18" can_minimize="true" can_tear_off="false" diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml index 50d0011338..8eee8f44b5 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="move" /> + <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_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml index f6f74f2ebd..1554ae390f 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 @@ -987,7 +987,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" @@ -1000,7 +1000,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" @@ -1009,7 +1009,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 @@ -1030,7 +1030,7 @@ layout="topleft" name="clickaction" width="148" - left_pad="0"> + left_pad="10"> <combo_box.item label="Touch (default)" name="Touch/grab(default)" @@ -1065,7 +1065,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" @@ -1097,7 +1097,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$" @@ -1291,6 +1291,9 @@ even though the user gets a free copy. name="Object" top="16" width="295"> + <panel.string name="None">None</panel.string> + <panel.string name="Prim">Prim</panel.string> + <panel.string name="Convex Hull">Convex Hull</panel.string> <check_box height="19" label="Locked" @@ -1516,20 +1519,7 @@ even though the user gets a free copy. name="Physics Shape Type Combo Ctrl" tool_tip="Choose the physics shape type" left_pad="0" - width="108"> - <combo_box.item - label="Prim" - name="Prim" - value="Prim" /> - <combo_box.item - label="None" - name="None" - value="None" /> - <combo_box.item - label="Convex Hull" - name="Convex Hull" - value="Convex Hull" /> - </combo_box> + width="108"/> <spinner follows="left|top" diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml index 520a604bde..d9991fcae9 100644 --- a/indra/newview/skins/default/xui/en/main_view.xml +++ b/indra/newview/skins/default/xui/en/main_view.xml @@ -8,6 +8,12 @@ tab_stop="false" name="main_view" width="1024"> + <panel top="0" + follows="all" + height="768" + mouse_opaque="false" + name="login_panel_holder" + width="1024"/> <layout_stack border_size="0" follows="all" mouse_opaque="false" @@ -120,7 +126,7 @@ user_resize="false" visible="false" width="333"/> - </layout_stack> + </layout_stack> <panel follows="all" height="500" left="0" 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 679d5bc82e..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 @@ -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 diff --git a/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml new file mode 100644 index 0000000000..2650903f88 --- /dev/null +++ b/indra/newview/skins/default/xui/en/menu_model_import_gear_default.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<toggleable_menu + bottom="806" + layout="topleft" + left="0" + mouse_opaque="false" + name="model_menu_gear_default" + visible="false"> + <menu_item_check + label="Show edges" + layout="topleft" + name="show_edges"> + <on_click + function="ModelImport.ViewOption.Action" + parameter="show_edges" /> + <on_check + function="ModelImport.ViewOption.Check" + parameter="show_edges" /> + <on_enable + function="ModelImport.ViewOption.Enabled" + parameter="show_edges" /> + </menu_item_check> + <menu_item_check + label="Show physics" + layout="topleft" + name="show_physics"> + <on_click + function="ModelImport.ViewOption.Action" + parameter="show_physics" /> + <on_check + function="ModelImport.ViewOption.Check" + parameter="show_physics" /> + <on_enable + function="ModelImport.ViewOption.Enabled" + parameter="show_physics" /> + </menu_item_check> + <menu_item_check + label="Show textures" + layout="topleft" + name="show_textures"> + <on_click + function="ModelImport.ViewOption.Action" + parameter="show_textures" /> + <on_check + function="ModelImport.ViewOption.Check" + parameter="show_textures" /> + <on_enable + function="ModelImport.ViewOption.Enabled" + parameter="show_textures" /> + </menu_item_check> + <menu_item_check + label="Show skin weight" + layout="topleft" + name="show_skin_weight"> + <on_click + function="ModelImport.ViewOption.Action" + parameter="show_skin_weight" /> + <on_check + function="ModelImport.ViewOption.Check" + parameter="show_skin_weight" /> + <on_enable + function="ModelImport.ViewOption.Enabled" + parameter="show_skin_weight" /> + </menu_item_check> + <menu_item_check + label="Show joint positions" + layout="topleft" + name="show_joint_positions"> + <on_click + function="ModelImport.ViewOption.Action" + parameter="show_joint_positions" /> + <on_check + function="ModelImport.ViewOption.Check" + parameter="show_joint_positions" /> + <on_enable + function="ModelImport.ViewOption.Enabled" + parameter="show_joint_positions" /> + </menu_item_check> +</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 7bb4c93766..6c1e9a3082 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/> @@ -917,6 +972,18 @@ <menu_item_call.on_visible function="File.MeshEnabled"/> </menu_item_call> + <menu_item_call + label="Model Wizard..." + layout="topleft" + name="Upload Model Wizard"> + <menu_item_call.on_click + function="Floater.Show" + parameter="upload_model_wizard" /> + <menu_item_call.on_enable + function="File.EnableUploadModel" /> + <menu_item_call.on_visible + function="File.MeshEnabled"/> + </menu_item_call> <menu_item_call label="Bulk (L$[COST] per file)..." layout="topleft" @@ -947,6 +1014,14 @@ function="ShowHelp" parameter="f1_help" /> </menu_item_call> + <menu_item_check + label="Enable Hints" + name="Enable Hints"> + <on_check + control="EnableUIHints"/> + <on_click + function="ToggleUIHints"/> + </menu_item_check> <!-- <menu_item_call label="Tutorial" name="Tutorial"> @@ -980,14 +1055,6 @@ 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" @@ -996,12 +1063,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"> @@ -1538,28 +1599,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/> @@ -1705,23 +1755,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/> @@ -1744,7 +1777,6 @@ function="ToggleControl" parameter="QAMode" /> </menu_item_check> - </menu> <menu create_jump_keys="true" @@ -2278,19 +2310,6 @@ <menu_item_check.on_enable function="Advanced.EnableObjectObjectOcclusion" /> </menu_item_check> - <menu_item_check - label="Framebuffer Objects" - name="Framebuffer Objects"> - <menu_item_check.on_check - function="CheckControl" - parameter="RenderUseFBO" /> - <menu_item_check.on_click - function="ToggleControl" - parameter="RenderUseFBO" /> - <menu_item_check.on_enable - function="Advanced.EnableRenderFBO" /> - </menu_item_check> - <menu_item_separator /> <menu_item_check @@ -2710,24 +2729,16 @@ function="Advanced.PrintTextureMemoryStats" /> </menu_item_call> <menu_item_check - label="Double-ClickAuto-Pilot" - name="Double-ClickAuto-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 /> @@ -3142,17 +3153,7 @@ <menu_item_call.on_click function="Advanced.LeaveAdminStatus" /> </menu_item_call> - <menu_item_call - label="HACK Upload Model..." - layout="topleft" - name="Upload Model"> - <menu_item_call.on_click - function="File.UploadModel" - parameter="" /> - <menu_item_call.on_enable - function="File.EnableUploadModel" /> - </menu_item_call> - <menu_item_check + <menu_item_check label="Show Admin Menu" name="View Admin Options"> <menu_item_check.on_enable diff --git a/indra/newview/skins/default/xui/en/notification_visibility.xml b/indra/newview/skins/default/xui/en/notification_visibility.xml new file mode 100644 index 0000000000..db292100d7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/notification_visibility.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" ?> +<notification_visibility> + <hide tag="custom_skin"/> + <show/> +</notification_visibility> + diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 5248128819..d53b299fe2 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -441,6 +441,7 @@ Please invite members within 48 hours. icon="alertmodal.tga" name="LandBuyPass" type="alertmodal"> + <tag>fail</tag> For L$[COST] you can enter this land ('[PARCEL_NAME]') for [TIME] hours. Buy a pass? <usetemplate name="okcancelbuttons" @@ -909,6 +910,13 @@ The new skin will appear after you restart [APP_NAME]. <notification icon="alertmodal.tga" + name="ChangeLanguage" + type="alertmodal"> +Changing language will take effect after you restart [APP_NAME]. + </notification> + + <notification + icon="alertmodal.tga" name="GoToAuctionPage" type="alertmodal"> Go to the [SECOND_LIFE] web page to see auction details or make a bid? @@ -1597,6 +1605,7 @@ If you continue to get this message, please check the [SUPPORT_SITE]. icon="alertmodal.tga" name="blocked_tport" type="alertmodal"> + <tag>fail</tag> Sorry, teleport is currently blocked. Try again in a moment. If you still cannot teleport, please log out and log back in to resolve the problem. </notification> <notification @@ -1609,42 +1618,49 @@ Sorry, but system was unable to locate landmark destination. icon="alertmodal.tga" name="timeout_tport" type="alertmodal"> + <tag>fail</tag> Sorry, but system was unable to complete the teleport connection. Try again in a moment. </notification> <notification icon="alertmodal.tga" name="noaccess_tport" type="alertmodal"> + <tag>fail</tag> Sorry, you do not have access to that teleport destination. </notification> <notification icon="alertmodal.tga" name="missing_attach_tport" type="alertmodal"> + <tag>fail</tag> Your attachments have not arrived yet. Try waiting for a few more seconds or log out and back in again before attempting to teleport. </notification> <notification icon="alertmodal.tga" name="too_many_uploads_tport" type="alertmodal"> + <tag>fail</tag> The asset queue in this region is currently clogged so your teleport request will not be able to succeed in a timely manner. Please try again in a few minutes or go to a less busy area. </notification> <notification icon="alertmodal.tga" name="expired_tport" type="alertmodal"> + <tag>fail</tag> Sorry, but the system was unable to complete your teleport request in a timely fashion. Please try again in a few minutes. </notification> <notification icon="alertmodal.tga" name="expired_region_handoff" type="alertmodal"> + <tag>fail</tag> Sorry, but the system was unable to complete your region crossing in a timely fashion. Please try again in a few minutes. </notification> <notification icon="alertmodal.tga" name="no_host" type="alertmodal"> + <tag>fail</tag> Unable to find teleport destination. The destination may be temporarily unavailable or no longer exists. Please try again in a few minutes. </notification> <notification @@ -2063,7 +2079,7 @@ Would you be my friend? <button default="true" index="0" - name="Offer" + name="OK" text="OK"/> <button index="1" @@ -2085,7 +2101,7 @@ Would you be my friend? <button default="true" index="0" - name="Offer" + name="OK" text="OK"/> <button index="1" @@ -2108,7 +2124,7 @@ Would you be my friend? <button default="true" index="0" - name="Offer" + name="OK" text="OK"/> <button index="1" @@ -2412,6 +2428,7 @@ Display settings have been set to recommended levels based on your system config icon="alertmodal.tga" name="AvatarMovedDesired" type="alertmodal"> + <tag>fail</tag> Your desired location is not currently available. You have been moved into a nearby region. </notification> @@ -2420,6 +2437,7 @@ You have been moved into a nearby region. icon="alertmodal.tga" name="AvatarMovedLast" type="alertmodal"> + <tag>fail</tag> Your last location is not currently available. You have been moved into a nearby region. </notification> @@ -2428,6 +2446,7 @@ You have been moved into a nearby region. icon="alertmodal.tga" name="AvatarMovedHome" type="alertmodal"> + <tag>fail</tag> Your home location is not currently available. You have been moved into a nearby region. You may want to set a new home location. @@ -2437,6 +2456,7 @@ You may want to set a new home location. icon="alertmodal.tga" name="ClothingLoading" type="alertmodal"> + <tag>fail</tag> Your clothing is still downloading. You can use [SECOND_LIFE] normally and other people will see you correctly. <form name="form"> @@ -2464,6 +2484,7 @@ Return to [http://join.secondlife.com secondlife.com] to create a new account? icon="alertmodal.tga" name="LoginPacketNeverReceived" type="alertmodal"> + <tag>fail</tag> We're having trouble connecting. There may be a problem with your Internet connection or the [SECOND_LIFE_GRID]. You can either check your Internet connection and try again in a few minutes, click Help to view the [SUPPORT_SITE], or click Teleport to attempt to teleport home. @@ -2871,6 +2892,25 @@ Download to your Applications folder? <notification icon="alertmodal.tga" + name="FailedUpdateInstall" + type="alertmodal"> +An error occurred installing the viewer update. +Please download and install the latest viewer from +http://secondlife.com/download. + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + <notification + icon="notifytip.tga" + name="DownloadBackground" + type="notifytip"> +An updated version of [APP_NAME] has been downloaded. +It will be applied the next time you restart [APP_NAME] + </notification> + + <notification + icon="alertmodal.tga" name="DeedObjectToGroup" type="alertmodal"> Deeding this object will cause the group to: @@ -3112,6 +3152,7 @@ You have reached your maximum number of groups. Please leave some group before j icon="alert.tga" name="KickUser" type="alert"> + <tag>win</tag> Kick this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3133,6 +3174,7 @@ An administrator has logged you off. icon="alert.tga" name="KickAllUsers" type="alert"> + <tag>win</tag> Kick everyone currently on the grid with what message? <form name="form"> <input name="message" type="text"> @@ -3154,6 +3196,7 @@ An administrator has logged you off. icon="alert.tga" name="FreezeUser" type="alert"> + <tag>win</tag> Freeze this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3175,6 +3218,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you icon="alert.tga" name="UnFreezeUser" type="alert"> + <tag>win</tag> Unfreeze this Resident with what message? <form name="form"> <input name="message" type="text"> @@ -3546,6 +3590,7 @@ Are you sure you want to change the Estate Covenant? icon="alertmodal.tga" name="RegionEntryAccessBlocked" type="alertmodal"> + <tag>fail</tag> You are not allowed in that Region due to your maturity Rating. This may be a result of a lack of information validating your age. Please verify you have the latest Viewer installed, and go to the Knowledge Base for details on accessing areas with this maturity rating. @@ -3558,6 +3603,7 @@ Please verify you have the latest Viewer installed, and go to the Knowledge Base icon="alertmodal.tga" name="RegionEntryAccessBlocked_KB" type="alertmodal"> + <tag>fail</tag> You are not allowed in that region due to your maturity Rating. Go to the Knowledge Base for more information about maturity Ratings? @@ -3575,6 +3621,7 @@ Go to the Knowledge Base for more information about maturity Ratings? icon="notifytip.tga" name="RegionEntryAccessBlocked_Notify" type="notifytip"> + <tag>fail</tag> You are not allowed in that region due to your maturity Rating. </notification> @@ -3582,6 +3629,7 @@ You are not allowed in that region due to your maturity Rating. icon="alertmodal.tga" name="RegionEntryAccessBlocked_Change" type="alertmodal"> + <tag>fail</tag> You are not allowed in that Region due to your maturity Rating preference. To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me > Preferences > General. @@ -4498,6 +4546,7 @@ Would you like to automatically wear the clothing you are about to create? icon="alertmodal.tga" name="NotAgeVerified" type="alertmodal"> + <tag>fail</tag> You must be age-verified to visit this area. Do you want to go to the [SECOND_LIFE] website and verify your age? [_URL] @@ -4881,24 +4930,6 @@ Please select at least one type of content to search (General, Moderate, or Adul <notification icon="notify.tga" - name="GroupVote" - type="notify"> -[NAME] has proposed to vote on: -[MESSAGE] - <form name="form"> - <button - index="0" - name="VoteNow" - text="Vote Now"/> - <button - index="1" - name="Later" - text="Later"/> - </form> - </notification> - - <notification - icon="notify.tga" name="SystemMessage" persist="true" type="notify"> @@ -5067,6 +5098,7 @@ You can be hurt here. If you die, you will be teleported to your home location. persist="true" type="notify" unique="true"> + <tag>fail</tag> This area has flying disabled. You can't fly here. </notification> @@ -5119,6 +5151,7 @@ This region is not running any scripts. name="NoOutsideScripts" persist="true" type="notify"> + <tag>fail</tag> This land has outside scripts disabled. No scripts will work here except those belonging to the land owner. @@ -5137,6 +5170,7 @@ You can only claim public land in the Region you're in. name="RegionTPAccessBlocked" persist="true" type="notify"> + <tag>fail</tag> You aren't allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer. Please go to the Knowledge Base for details on accessing areas with this maturity Rating. @@ -5147,6 +5181,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit name="URBannedFromRegion" persist="true" type="notify"> + <tag>fail</tag> You are banned from the region. </notification> @@ -5155,6 +5190,7 @@ You are banned from the region. name="NoTeenGridAccess" persist="true" type="notify"> + <tag>fail</tag> Your account cannot connect to this teen grid region. </notification> @@ -5163,6 +5199,7 @@ Your account cannot connect to this teen grid region. name="ImproperPaymentStatus" persist="true" type="notify"> + <tag>fail</tag> You do not have proper payment status to enter this region. </notification> @@ -5171,6 +5208,7 @@ You do not have proper payment status to enter this region. name="MustGetAgeRgion" persist="true" type="notify"> + <tag>fail</tag> You must be age-verified to enter this region. </notification> @@ -5179,6 +5217,7 @@ You must be age-verified to enter this region. name="MustGetAgeParcel" persist="true" type="notify"> + <tag>fail</tag> You must be age-verified to enter this parcel. </notification> @@ -5187,6 +5226,7 @@ You must be age-verified to enter this parcel. name="NoDestRegion" persist="true" type="notify"> + <tag>fail</tag> No destination region found. </notification> @@ -5195,6 +5235,7 @@ No destination region found. name="NotAllowedInDest" persist="true" type="notify"> + <tag>fail</tag> You are not allowed into the destination. </notification> @@ -5203,6 +5244,7 @@ You are not allowed into the destination. name="RegionParcelBan" persist="true" type="notify"> + <tag>fail</tag> Cannot region cross into banned parcel. Try another way. </notification> @@ -5211,6 +5253,7 @@ Cannot region cross into banned parcel. Try another way. name="TelehubRedirect" persist="true" type="notify"> + <tag>fail</tag> You have been redirected to a telehub. </notification> @@ -5219,6 +5262,7 @@ You have been redirected to a telehub. name="CouldntTPCloser" persist="true" type="notify"> + <tag>fail</tag> Could not teleport closer to destination. </notification> @@ -5235,6 +5279,7 @@ Teleport cancelled. name="FullRegionTryAgain" persist="true" type="notify"> + <tag>fail</tag> The region you are attempting to enter is currently full. Please try again in a few moments. </notification> @@ -5244,6 +5289,7 @@ Please try again in a few moments. name="GeneralFailure" persist="true" type="notify"> + <tag>fail</tag> General failure. </notification> @@ -5252,6 +5298,7 @@ General failure. name="RoutedWrongRegion" persist="true" type="notify"> + <tag>fail</tag> Routed to wrong region. Please try again. </notification> @@ -5260,6 +5307,7 @@ Routed to wrong region. Please try again. name="NoValidAgentID" persist="true" type="notify"> + <tag>fail</tag> No valid agent id. </notification> @@ -5268,6 +5316,7 @@ No valid agent id. name="NoValidSession" persist="true" type="notify"> + <tag>fail</tag> No valid session id. </notification> @@ -5276,6 +5325,7 @@ No valid session id. name="NoValidCircuit" persist="true" type="notify"> + <tag>fail</tag> No valid circuit code. </notification> @@ -5284,6 +5334,7 @@ No valid circuit code. name="NoValidTimestamp" persist="true" type="notify"> + <tag>fail</tag> No valid timestamp. </notification> @@ -5292,6 +5343,7 @@ No valid timestamp. name="NoPendingConnection" persist="true" type="notify"> + <tag>fail</tag> Unable to create pending connection. </notification> @@ -5300,6 +5352,7 @@ Unable to create pending connection. name="InternalUsherError" persist="true" type="notify"> + <tag>fail</tag> Internal error attempting to connect agent usher. </notification> @@ -5308,6 +5361,7 @@ Internal error attempting to connect agent usher. name="NoGoodTPDestination" persist="true" type="notify"> + <tag>fail</tag> Unable to find a good teleport destination in this region. </notification> @@ -5316,6 +5370,7 @@ Unable to find a good teleport destination in this region. name="InternalErrorRegionResolver" persist="true" type="notify"> + <tag>fail</tag> Internal error attempting to activate region resolver. </notification> @@ -5324,6 +5379,7 @@ Internal error attempting to activate region resolver. name="NoValidLanding" persist="true" type="notify"> + <tag>fail</tag> A valid landing point could not be found. </notification> @@ -5332,6 +5388,7 @@ A valid landing point could not be found. name="NoValidParcel" persist="true" type="notify"> + <tag>fail</tag> No valid parcel could be found. </notification> @@ -5539,7 +5596,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 @@ -5708,6 +5765,7 @@ Grant this request? name="FirstBalanceIncrease" persist="true" type="notify"> + <tag>win</tag> You just received L$[AMOUNT]. Your L$ balance is shown in the upper-right. </notification> @@ -6127,6 +6185,7 @@ New Voice Morphs are available! icon="notifytip.tga" name="Cannot enter parcel: not a group member" type="notifytip"> + <tag>fail</tag> Only members of a certain group can visit this area. </notification> @@ -6134,6 +6193,7 @@ Only members of a certain group can visit this area. icon="notifytip.tga" name="Cannot enter parcel: banned" type="notifytip"> + <tag>fail</tag> Cannot enter parcel, you have been banned. </notification> @@ -6141,6 +6201,7 @@ Cannot enter parcel, you have been banned. icon="notifytip.tga" name="Cannot enter parcel: not on access list" type="notifytip"> + <tag>fail</tag> Cannot enter parcel, you are not on the access list. </notification> @@ -6186,6 +6247,7 @@ The SLurl you clicked on is not supported. name="BlockedSLURL" priority="high" type="notifytip"> + <tag>win</tag> A SLurl was received from an untrusted browser and has been blocked for your security. </notification> @@ -6404,13 +6466,9 @@ Avatar '[NAME]' left appearance mode. type="alertmodal"> We're having trouble connecting using [PROTOCOL] [HOSTID]. Please check your network and firewall setup. - <form name="form"> - <button - default="true" - index="0" - name="OK" - text="OK"/> - </form> + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification @@ -6423,13 +6481,9 @@ We're having trouble connecting to your voice server: Voice communications will not be available. Please check your network and firewall setup. - <form name="form"> - <button - default="true" - index="0" - name="OK" - text="OK"/> - </form> + <usetemplate + name="okbutton" + yestext="OK"/> </notification> <notification @@ -6510,6 +6564,14 @@ Mute everyone? </notification> <notification + name="HintAvatarPicker" + label="Change your Look" + type="hint" + unique="true"> + Would you like to try a new look? Click the button below to see more Avatars. + </notification> + + <notification name="HintSidePanel" label="Side Panel" type="hint" @@ -6534,6 +6596,24 @@ Mute everyone? </notification> <notification + name="HintMoveArrows" + label="Move" + type="hint" + unique="true"> + To walk, use the directional keys on your keyboard. You can run by pressing the Up arrow twice. + <tag>custom_skin</tag> + </notification> + + <notification + name="HintView" + label="View" + type="hint" + unique="true"> + To change your camera view, use the Orbit and Pan controls. Reset your view by pressing Escape or walking. + <tag>custom_skin</tag> + </notification> + + <notification name="HintInventory" label="Inventory" type="hint" @@ -6557,7 +6637,7 @@ Mute everyone? <form name="form"> <ignore name="ignore" control="MediaEnablePopups" - invert_control="false" + invert_control="true" text="Enable all pop-ups"/> <button default="true" index="0" diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml index 6f3629cc8f..4b21ffa1f9 100644 --- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml @@ -62,7 +62,7 @@ name="avatar_name" top="6" use_ellipses="true" - value="Unknown" + value="(loading)" width="180" /> <text follows="right" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index 63068a069f..013a8090f7 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -5,6 +5,7 @@ bg_opaque_color="DkGray" chrome="true" follows="left|bottom|right" + focus_root="true" height="33" layout="topleft" left="0" 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 efb1da4c05..b5e1a5f16d 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray_lite.xml @@ -10,6 +10,7 @@ layout="topleft" left="0" name="bottom_tray_lite" + focus_root="true" tab_stop="true" top="28" chrome="true" diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml index 0fb7691ee7..6c8d994bc6 100644 --- a/indra/newview/skins/default/xui/en/panel_classified_info.xml +++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml @@ -49,7 +49,8 @@ left="10" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" diff --git a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml index 7bcd4962d2..813aa5d7a9 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml @@ -8,6 +8,17 @@ name="edit_alpha_panel" top_pad="10" width="333" > + <scroll_container + color="DkGray2" + follows="all" + height="400" + layout="topleft" + left="10" + top_pad="0" + name="avatar_alpha_color_panel_scroll" + reserve_scroll_corner="false" + opaque="true" + width="313"> <panel border="false" bg_alpha_color="DkGray2" @@ -16,14 +27,14 @@ background_opaque="true" follows="top|left|right" height="400" - left="10" + left="0" layout="topleft" name="avatar_alpha_color_panel" top="0" width="313" > <check_box control_name="LowerAlphaTextureInvisible" - follows="left" + follows="left|top" height="16" layout="topleft" left="5" @@ -48,7 +59,7 @@ <check_box control_name="UpperAlphaTextureInvisible" - follows="left" + follows="left|top" height="16" layout="topleft" left_pad="20" @@ -73,7 +84,7 @@ <check_box control_name="HeadAlphaTextureInvisible" - follows="left" + follows="left|top" height="16" layout="topleft" left="5" @@ -98,7 +109,7 @@ <check_box control_name="Eye AlphaTextureInvisible" - follows="left" + follows="left|top" height="16" layout="topleft" left_pad="20" @@ -123,7 +134,7 @@ <check_box control_name="HairAlphaTextureInvisible" - follows="left" + follows="left|top" height="16" layout="topleft" left="5" @@ -147,5 +158,6 @@ </texture_picker> </panel> + </scroll_container> </panel> diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml index ce0438fbc9..e512d63f9e 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml @@ -33,7 +33,8 @@ left="10" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text type="string" length="1" @@ -147,7 +148,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_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml index a284d3ccc0..a028e3ab9f 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml @@ -27,7 +27,8 @@ left="10" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text type="string" length="1" diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml index 23a08344ea..97f1a1a658 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml @@ -14,7 +14,7 @@ bg_opaque_color="DkGray2" background_visible="true" background_opaque="true" - follows="top|left|right" + follows="all" height="400" left="10" layout="topleft" 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 b3e9586ee9..ac8917d272 100644 --- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml +++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml @@ -147,7 +147,8 @@ pad_left="24" tool_tip="Return to Edit Outfit" top="3" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" 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 0347d2feec..ec3f3b48bc 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 @@ -45,7 +45,8 @@ background_visible="true" left="7" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text_editor allow_scroll="false" bg_visible="false" diff --git a/indra/newview/skins/default/xui/en/panel_group_list_item.xml b/indra/newview/skins/default/xui/en/panel_group_list_item.xml index 0b84ac03c5..7d0b0890f0 100644 --- a/indra/newview/skins/default/xui/en/panel_group_list_item.xml +++ b/indra/newview/skins/default/xui/en/panel_group_list_item.xml @@ -34,6 +34,7 @@ mouse_opaque="true" left="5" top="2" + use_draw_context_alpha="false" width="20" /> <text parse_urls="false" diff --git a/indra/newview/skins/default/xui/en/panel_hint_image.xml b/indra/newview/skins/default/xui/en/panel_hint_image.xml new file mode 100644 index 0000000000..00b6e42497 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_hint_image.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<panel + width="205" + height="140" + layout="topleft"> + <text name="hint_title" + font="SansSerifMedium" + left="8" + right="180" + top="8" + bottom="20" + follows="left|right|top" + text_color="Black" + wrap="false"/> + <icon name="hint_image" + left="42" + top="25" + width="115" + height="86" + image_name="arrow_keys.png" + /> + <text name="hint_text" + left="8" + right="197" + top_pad="5" + bottom="120" + 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_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml index 6ee2abc70f..d2088594dd 100644 --- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml +++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml @@ -68,7 +68,8 @@ tool_tip="Back" tab_stop="false" top="4" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 2a5933e3e9..23d8cb11ca 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -114,6 +114,7 @@ height="25" layout="topleft" name="options_gear_btn_panel" + user_resize="false" width="32"> <menu_button follows="bottom|left" @@ -134,6 +135,7 @@ height="25" layout="topleft" name="add_btn_panel" + user_resize="false" width="32"> <button follows="bottom|left" @@ -154,6 +156,7 @@ height="25" layout="topleft" name="dummy_panel" + user_resize="false" width="212"> <icon follows="bottom|left|right" @@ -170,6 +173,7 @@ height="25" layout="topleft" name="trash_btn_panel" + user_resize="false" width="31"> <dnd_button follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml index b181ca3bba..e3cd61c5aa 100644 --- a/indra/newview/skins/default/xui/en/panel_login.xml +++ b/indra/newview/skins/default/xui/en/panel_login.xml @@ -5,6 +5,7 @@ height="600" layout="topleft" left="0" name="panel_login" +focus_root="true" top="600" width="996"> <panel.string @@ -127,7 +128,7 @@ top="20" </text> <combo_box allow_text_entry="true" -control_name="LoginLocation" +control_name="NextLoginLocation" follows="left|bottom" height="23" max_chars="128" 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 2b6e082542..96633cb5b4 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -118,6 +118,7 @@ height="25" layout="topleft" name="options_gear_btn_panel" + user_resize="false" width="32"> <menu_button follows="bottom|left" @@ -138,6 +139,7 @@ height="25" layout="topleft" name="add_btn_panel" + user_resize="false" width="32"> <button follows="bottom|left" @@ -158,6 +160,7 @@ height="25" layout="topleft" name="dummy_panel" + user_resize="false" width="212"> <icon follows="bottom|left|right" @@ -174,6 +177,7 @@ height="25" layout="topleft" name="trash_btn_panel" + user_resize="false" width="31"> <dnd_button follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml index 082d51ed3c..8a7bd53054 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -4,6 +4,7 @@ background_visible="true" bg_opaque_color="MouseGray" follows="left|top|right" + focus_root="true" height="60" layout="topleft" name="navigation_bar" 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_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml index f4dee9cd55..e1cd78bad8 100644 --- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml +++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml @@ -70,7 +70,8 @@ left="5" tab_stop="false" top="1" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml index 68c423d7dd..6a8bf87bc5 100644 --- a/indra/newview/skins/default/xui/en/panel_people.xml +++ b/indra/newview/skins/default/xui/en/panel_people.xml @@ -241,6 +241,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="25" layout="topleft" name="options_gear_btn_panel" + user_resize="false" width="32"> <menu_button follows="bottom|left" @@ -261,6 +262,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="25" layout="topleft" name="add_btn_panel" + user_resize="false" width="32"> <button follows="bottom|left" @@ -281,6 +283,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="25" layout="topleft" name="dummy_panel" + user_resize="false" width="212"> <icon follows="bottom|left|right" @@ -297,6 +300,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M height="25" layout="topleft" name="trash_btn_panel" + user_resize="false" width="31"> <dnd_button follows="bottom|left" diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml index 0496c86215..7daa52b2d9 100644 --- a/indra/newview/skins/default/xui/en/panel_pick_info.xml +++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml @@ -21,7 +21,8 @@ left="10" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" 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 8036411d2b..7e89860c60 100644 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -165,7 +165,8 @@ tool_tip="Back" tab_stop="false" top="4" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 21314703b0..d9c357f277 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -211,7 +211,7 @@ background_visible="true" user_resize="false" auto_resize="true" width="24"> - <button + <menu_button follows="bottom|left|right" height="23" label="▼" 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 9d496575c9..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,202 +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="300"> - UI size + width="100"> + UI size: </text> <slider control_name="UIScaleFactor" @@ -223,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" @@ -262,65 +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_bytes="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" - 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 - height="23" - label="Other Devices" - left="30" - name="joystick_setup_button" - top_pad="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_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 85824c2576..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,291 +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> - <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="290" - max_val="60" - min_val="1" - name="nearby_toasts_lifetime" - top_pad="33" - width="210" /> - <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="00" - max_val="60" - min_val="0" - name="nearby_toasts_fadingtime" - top_pad="15" - width="210" /> + <check_box control_name="PlayTypingAnim" height="16" @@ -348,7 +64,7 @@ layout="topleft" left="30" name="play_typing_animation" - top="205" + top_pad="10" width="400" /> <check_box enabled="false" @@ -368,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" @@ -375,7 +101,7 @@ left="30" height="20" width="170" - top_pad="7"> + top_pad="15"> Show IMs in: </text> <text @@ -385,9 +111,8 @@ top_delta="0" left="170" height="20" - width="130" - text_color="White_25" - > + width="130" + text_color="White_25"> (requires restart) </text> <radio_group @@ -401,7 +126,7 @@ width="150"> <radio_item height="16" - label="Separate windows" + label="Separate Windows" layout="topleft" left="0" name="radio" @@ -422,19 +147,19 @@ name="disable_toast_label" follows="left|top" layout="topleft" - top_delta="-22" - left="280" + top_pad="20" + left="30" height="10" width="180"> - Enable Incoming Chat popups: + Enable incoming chat popups: </text> <check_box control_name="EnableGroupChatPopups" name="EnableGroupChatPopups" label="Group Chats" layout="topleft" - top_delta="18" - left="295" + top_pad="5" + left_delta="10" height="20" tool_tip="Check to see popups when a Group Chat message arrives" width="400" /> @@ -443,11 +168,43 @@ name="EnableIMChatPopups" label="IM Chats" layout="topleft" - top_delta="22" - left="295" - height="20" + 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" @@ -456,7 +213,7 @@ layout="topleft" left="30" name="translate_chat_checkbox" - bottom_delta="40" + bottom_delta="30" width="400" /> <text bottom_delta="30" 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..8a37822413 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_preferences_colors.xml @@ -0,0 +1,363 @@ +<?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="450" + > + Name tag background color (also affects Bubble Chat): + </text> + <color_swatch + can_apply_immediately="true" + color="0 0 0 1" + control_name="NameTagBackground" + follows="left|top" + height="24" + label_height="0" + layout="topleft" + left_delta="10" + top_pad="5" + name="background" + tool_tip="Choose name tag color" + width="44"> + <color_swatch.init_callback + function="Pref.getUIColor" + parameter="NameTagBackground" /> + <color_swatch.commit_callback + function="Pref.applyUIColor" + parameter="NameTagBackground" /> + </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" + tool_tip="Choose name tag opacity" + top_delta = "6" + width="378" /> + <text + follows="left|top" + layout="topleft" + left="30" + height="12" + name="floater_opacity" + 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="Inactive:" + left="50" + max_val="1.00" + min_val="0.00" + name="inactive" + 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 392d50fc42..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="14" + 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="14" + top_pad="10" width="400"> Name tags: </text> @@ -224,8 +224,8 @@ control_name="AvatarNameTagMode" height="20" layout="topleft" - left="50" - top_pad="5" + left="35" + top_pad="0" name="Name_Tag_Preference"> <radio_item label="Off" @@ -261,9 +261,9 @@ height="16" label="My name" layout="topleft" - left="70" + left="35" name="show_my_name_checkbox1" - top_pad="0" + top_pad="2" width="100" /> <check_box control_name="NameTagShowUsernames" @@ -271,7 +271,7 @@ height="16" label="Usernames" layout="topleft" - left_pad="70" + left_pad="50" name="show_slids" tool_tip="Show username, like bobsmith123" top_delta="0" /> @@ -281,72 +281,103 @@ height="16" label="Group titles" layout="topleft" - left="70" + left="35" width="100" name="show_all_title_checkbox1" tool_tip="Show group titles, like Officer or Member" - top_pad="5" /> - - <check_box - control_name="NameTagShowFriends" + top_pad="3" /> + <check_box + control_name="NameTagShowFriends" enabled_control="AvatarNameTagMode" height="16" - label="Highlight friends" + label="Highlight friends" layout="topleft" - left_pad="70" - name="show_friends" - tool_tip="Highlight the name tags of your friends" - top_delta="0" /> - + 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="9" - width="200"> - My effects: - </text> - <text - type="string" - length="1" - follows="left|top" - height="13" - layout="topleft" - left_pad="5" - name="title_afk_text" - top_delta="0" - 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" @@ -368,17 +399,6 @@ name="item4" value="0" /> </combo_box> - <check_box -control_name="UseDisplayNames" -follows="top|left" -height="14" -label="View Display Names" -layout="topleft" -left="30" -name="display_names_check" -width="237" -tool_tip="Check to use display names in chat, IM, name tags, etc." -top_pad="20"/> <text type="string" length="1" @@ -388,7 +408,7 @@ top_pad="20"/> left="30" mouse_opaque="false" name="text_box3" - top_pad="10" + top_pad="5" width="240"> Busy mode response: </text> @@ -399,11 +419,11 @@ top_pad="20"/> use_ellipses="false" commit_on_focus_lost = "true" follows="left|top" - height="42" + 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 c60ac0e1d1..70db3c6592 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml @@ -163,26 +163,36 @@ 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" + control_name="RenderTransparentWater" + height="16" + initial_value="true" + label="Transparent Water" + layout="topleft" + left_delta="0" + name="TransparentWater" + top_pad="7" + width="256" /> + <check_box + 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="RenderLocalLights" @@ -192,516 +202,517 @@ layout="topleft" left_delta="0" name="LocalLights" - top_pad="1" + top_pad="1" + width="256" /> 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="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> - <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_delta="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="200" - name="AvatarRenderingText" - top_pad="8" - 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" @@ -710,8 +721,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..626122c0b0 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="block_list_label" + 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 140d16e37f..584bd1ea9d 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> @@ -386,4 +341,20 @@ name="web_proxy_port" top_delta="0" width="145" /> + + <check_box + top_delta="2" + enabled="true" + follows="left|top" + height="18" + initial_value="true" + control_name="UpdaterServiceActive" + label="Automatically download and install [APP_NAME] updates" + left="30" + mouse_opaque="true" + name="updater_service_active" + radio_style="false" + width="400" + top_pad="10"/> + </panel> 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_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml index efc37c2127..7caf425058 100644 --- a/indra/newview/skins/default/xui/en/panel_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_profile.xml @@ -432,7 +432,7 @@ user_resize="false" auto_resize="false" width="24"> - <button + <menu_button follows="bottom|left|right" height="23" label="â–¼" 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 97229c413c..c553a3aba0 100644 --- a/indra/newview/skins/default/xui/en/panel_profile_view.xml +++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml @@ -27,7 +27,8 @@ left="10" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text top="10" follows="top|left" 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 1e332a40c2..a041c9b229 100644 --- a/indra/newview/skins/default/xui/en/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml @@ -179,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/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml index 6940d1549b..54a312bd59 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml @@ -56,7 +56,8 @@ name="back_btn" tab_stop="false" top="2" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHugeBold" 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 ca63d2df39..afaf41d073 100644 --- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml +++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml @@ -65,7 +65,8 @@ name="back_btn" tab_stop="false" top="0" - width="30" /> + width="30" + use_draw_context_alpha="false" /> <text follows="top|left|right" font="SansSerifHuge" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 10a7124182..01e91f20e6 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -1794,6 +1794,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, and the name has been cached, otherwise the same as llGetUsername. Use llRequestDisplayName if you absolutely must have the display name. +</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> diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml index a35e2c3663..a1e32e44de 100644 --- a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml +++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml @@ -1,4 +1,6 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<avatar_icon default_icon_name="Generic_Person_Large"> +<avatar_icon + default_icon_name="Generic_Person_Large" + use_draw_context_alpha="false"> </avatar_icon> diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml index 2d0a1728d5..16241ed84e 100644 --- a/indra/newview/skins/default/xui/en/widgets/button.xml +++ b/indra/newview/skins/default/xui/en/widgets/button.xml @@ -19,10 +19,11 @@ image_color="ButtonImageColor" image_color_disabled="ButtonImageColor" flash_color="ButtonFlashBgColor" - font="SansSerifSmall" + font="SansSerifSmall" hover_glow_amount="0.15" halign="center" pad_bottom="3" height="23" - scale_image="true"> + scale_image="true" + use_draw_context_alpha="true"> </button> 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 7a60bee338..cca64fad2a 100644 --- a/indra/newview/skins/default/xui/en/widgets/check_box.xml +++ b/indra/newview/skins/default/xui/en/widgets/check_box.xml @@ -2,9 +2,17 @@ <check_box font="SansSerifSmall" follows="left|top"> <check_box.label_text name="checkbox label" + left="20" + bottom="3" + width="0" + height="0" text_color="LabelTextColor" text_readonly_color="LabelDisabledColor"/> <check_box.check_button name="CheckboxCtrl Button" + left="2" + bottom="2" + width="13" + height="13" commit_on_return="false" label="" is_toggle="true" diff --git a/indra/newview/skins/default/xui/en/widgets/group_icon.xml b/indra/newview/skins/default/xui/en/widgets/group_icon.xml index 58d5e19fcc..36ee6dd7eb 100644 --- a/indra/newview/skins/default/xui/en/widgets/group_icon.xml +++ b/indra/newview/skins/default/xui/en/widgets/group_icon.xml @@ -2,4 +2,5 @@ <group_icon default_icon_name="Generic_Group" image_name="Generic_Group" - name="group_icon" /> + name="group_icon" + use_draw_context_alpha="false" /> diff --git a/indra/newview/skins/default/xui/en/widgets/icon.xml b/indra/newview/skins/default/xui/en/widgets/icon.xml index adb743a628..cf8edfcedb 100644 --- a/indra/newview/skins/default/xui/en/widgets/icon.xml +++ b/indra/newview/skins/default/xui/en/widgets/icon.xml @@ -3,5 +3,6 @@ tab_stop="false" mouse_opaque="false" name="icon" + use_draw_context_alpha="true" follows="left|top"> </icon> diff --git a/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml new file mode 100644 index 0000000000..aa8461d367 --- /dev/null +++ b/indra/newview/skins/default/xui/en/widgets/sidetray_tab.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<sidetray_tab + focus_root="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_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml index f967d697c5..0150241d9a 100644 --- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml @@ -14,6 +14,9 @@ <combo_box.item label="8x" name="8x"/> <combo_box.item label="16x" name="16x"/> </combo_box> + <text name="antialiasing restart"> + (requiere reiniciar el visor) + </text> <spinner label="Gamma:" name="gamma"/> <text name="(brightness, lower is brighter)"> (0 = brillo por defecto, más bajo = más brillo) 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_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml index 61f12fc0d7..372680f55d 100644 --- a/indra/newview/skins/default/xui/es/floater_preferences.xml +++ b/indra/newview/skins/default/xui/es/floater_preferences.xml @@ -5,10 +5,12 @@ <tab_container name="pref core"> <panel label="General" name="general"/> <panel label="Gráficos" name="display"/> - <panel label="Privacidad" name="im"/> <panel label="Sonido y Media" name="audio"/> <panel label="Chat" name="chat"/> + <panel label="Mover y ver" name="move"/> <panel label="Notificaciones" name="msgs"/> + <panel label="Colores" name="colors"/> + <panel label="Privacidad" name="im"/> <panel label="Configurar" name="input"/> <panel label="Avanzado" name="advanced1"/> </tab_container> diff --git a/indra/newview/skins/default/xui/es/floater_region_debug_console.xml b/indra/newview/skins/default/xui/es/floater_region_debug_console.xml new file mode 100644 index 0000000000..40851f897e --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_region_debug_console.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="region_debug_console" title="Depuración de región"/> diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml index 8c4488a285..8e498fefba 100644 --- a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_gear_default"> +<toggleable_menu name="menu_gear_default"> <menu_item_call label="Nueva ventana del inventario" name="new_window"/> - <menu_item_call label="Ordenar alfabéticamente" name="sort_by_name"/> - <menu_item_call label="Ordenar por los más recientes" name="sort_by_recent"/> + <menu_item_check label="Ordenar alfabéticamente" name="sort_by_name"/> + <menu_item_check label="Ordenar por los más recientes" name="sort_by_recent"/> + <menu_item_check label="Las carpetas del sistema, arriba" name="sort_system_folders_to_top"/> <menu_item_call label="Ver los filtros" name="show_filters"/> <menu_item_call label="Restablecer los filtros" name="reset_filters"/> <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/> @@ -12,4 +13,4 @@ <menu_item_call label="Encontrar el original" name="Find Original"/> <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/> <menu_item_call label="Vaciar la Papelera" name="empty_trash"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml index 649c0c2043..3dd940c331 100644 --- a/indra/newview/skins/default/xui/es/menu_viewer.xml +++ b/indra/newview/skins/default/xui/es/menu_viewer.xml @@ -12,6 +12,12 @@ <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/> <menu_item_check label="Mis gestos" name="Gestures"/> <menu_item_check label="Mi voz" name="ShowVoice"/> + <menu label="Movimiento" name="Movement"> + <menu_item_call label="Sentarte" name="Sit Down Here"/> + <menu_item_check label="Volar" name="Fly"/> + <menu_item_check label="Correr siempre" name="Always Run"/> + <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/> + </menu> <menu label="Mi estado" name="Status"> <menu_item_call label="Ausente" name="Set Away"/> <menu_item_call label="Ocupado" name="Set Busy"/> @@ -47,6 +53,7 @@ <menu_item_check label="Propietarios del terreno" name="Land Owners"/> <menu_item_check label="Coordenadas" name="Coordinates"/> <menu_item_check label="Propiedades de la parcela" name="Parcel Properties"/> + <menu_item_check label="Menú Avanzado" name="Show Advanced Menu"/> </menu> <menu_item_call label="Teleportar a la Base" name="Teleport Home"/> <menu_item_call label="Fijar mi Base aquÃ" name="Set Home to Here"/> @@ -123,7 +130,6 @@ <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"/> <menu_item_call label="Recargar las texturas" name="Rebake Texture"/> <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/> <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/> @@ -177,8 +183,7 @@ <menu_item_check label="Buscar" name="Search"/> <menu_item_call label="Recuperar las teclas" name="Release Keys"/> <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/> - <menu_item_check label="Correr siempre" name="Always Run"/> - <menu_item_check label="Volar" name="Fly"/> + <menu_item_check label="Mostrar el menú Avanzado - acceso directo antiguo" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="Cerrar la ventana" name="Close Window"/> <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/> <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/> @@ -196,7 +201,6 @@ <menu_item_call label="Acercar el zoom" name="Zoom In"/> <menu_item_call label="Zoom por defecto" name="Zoom Default"/> <menu_item_call label="Alejar el zoom" name="Zoom Out"/> - <menu_item_check label="Mostrar el menú Avanzado" name="Show Advanced Menu"/> </menu> <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/> <menu_item_check label="Mostrar el menú 'Develop'" name="Debug Mode"/> @@ -267,16 +271,13 @@ <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="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="Consola de depuración de región" name="Region Debug Console"/> <menu_item_check label="Debug Clicks" name="Debug Clicks"/> <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> </menu> <menu label="XUI" name="XUI"> <menu_item_call label="Reload Color Settings" name="Reload Color Settings"/> <menu_item_call label="Show Font Test" name="Show Font Test"/> - <menu_item_call label="Load from XML" name="Load from XML"/> - <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"/> @@ -303,9 +304,9 @@ </menu> <menu_item_check label="HTTP Textures" name="HTTP Textures"/> <menu_item_check label="Console Window on next Run" name="Console Window"/> - <menu_item_check label="Show Admin Menu" name="View Admin Options"/> <menu_item_call label="Request Admin Status" name="Request Admin Options"/> <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/> + <menu_item_check label="Show Admin Menu" name="View Admin Options"/> </menu> <menu label="Admin" name="Admin"> <menu label="Object"> diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml index 286af718e3..2dd7a6b0f5 100644 --- a/indra/newview/skins/default/xui/es/notifications.xml +++ b/indra/newview/skins/default/xui/es/notifications.xml @@ -385,6 +385,9 @@ Nota: esto vaciará la caché. <notification name="ChangeSkin"> Verás la nueva apariencia cuando reinicies [APP_NAME]. </notification> + <notification name="ChangeLanguage"> + El cambio de idioma tendrá efecto cuando reinicies [APP_NAME]. + </notification> <notification name="GoToAuctionPage"> ¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta o hacer una puja? @@ -599,6 +602,10 @@ PodrÃa ser [VALIDS] No se encontró el fragmento 'data' en la cabecera del WAV: [FILE] </notification> + <notification name="SoundFileInvalidChunkSize"> + Tamaño de lote erróneo en el archivo WAV: +[FILE] + </notification> <notification name="SoundFileInvalidTooLong"> El archivo de audio es demasiado largo (10 segundos como máximo): [FILE] @@ -1334,6 +1341,16 @@ Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar ¿Descargarla a tu carpeta de Programas? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/> </notification> + <notification name="FailedUpdateInstall"> + Se ha producido un error al instalar la actualización del visor. +Descarga e instala el último visor a través de +http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DownloadBackground"> + Se ha descargado una versión actualizada de [APP_NAME]. +Se aplicará la próxima vez que reinicies [APP_NAME] + </notification> <notification name="DeedObjectToGroup"> Transferir este objeto al grupo hará que: * Reciba los L$ pagados en el objeto @@ -2469,7 +2486,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"/> diff --git a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml index 684a35a830..d536a862f5 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_gloves_panel"> <panel name="avatar_gloves_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml index 347107d746..22a46a2f75 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_jacket_panel"> <panel name="avatar_jacket_color_panel"> - <texture_picker label="Tejido superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/> - <texture_picker label="Tejido inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_pants.xml b/indra/newview/skins/default/xui/es/panel_edit_pants.xml index e765702343..fb35e0953b 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_pants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml index f763e1b18d..73b712374e 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml index 70f2027398..5e457612d5 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shoes_panel"> <panel name="avatar_shoes_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml index 2c7196642c..416d174298 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_socks.xml b/indra/newview/skins/default/xui/es/panel_edit_socks.xml index 28423eaf61..ac9b2a773e 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_socks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml index 6c82bcfedf..aac8af44b9 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_underpants_panel"> <panel name="avatar_underpants_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml index 412bdceddf..c26c554c1a 100644 --- a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_undershirt_panel"> <panel name="avatar_undershirt_color_panel"> - <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Pulsa para elegir una imagen"/> <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/es/panel_notify_textbox.xml b/indra/newview/skins/default/xui/es/panel_notify_textbox.xml new file mode 100644 index 0000000000..10aaa288d7 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_notify_textbox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_notify_textbox"> + <string name="message_max_lines_count" value="7"/> + <panel label="info_panel" name="info_panel"> + <text_editor name="message" value="message"/> + parse_urls="false" + <button label="Enviar" name="btn_submit"/> + </panel> + <panel label="control_panel" name="control_panel"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml index 1773735598..d0c80ebae5 100644 --- a/indra/newview/skins/default/xui/es/panel_people.xml +++ b/indra/newview/skins/default/xui/es/panel_people.xml @@ -22,7 +22,7 @@ <tab_container name="tabs"> <panel label="CERCANA" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="nearby_view_sort_btn" tool_tip="Opciones"/> + <menu_button name="nearby_view_sort_btn" tool_tip="Opciones"/> <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> </panel> </panel> @@ -34,27 +34,27 @@ <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="bottom_panel"> <layout_panel name="options_gear_btn_panel"> - <button name="friends_viewsort_btn" tool_tip="Ver más opciones"/> + <menu_button name="friends_viewsort_btn" tool_tip="Ver más opciones"/> </layout_panel> <layout_panel name="add_btn_panel"> <button name="add_btn" tool_tip="Ofrecer amistad a un Residente"/> </layout_panel> <layout_panel name="trash_btn_panel"> - <dnd_button name="trash_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/> + <dnd_button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/> </layout_panel> </layout_stack> </panel> </panel> <panel label="MIS GRUPOS" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="groups_viewsort_btn" tool_tip="Opciones"/> + <menu_button name="groups_viewsort_btn" tool_tip="Opciones"/> <button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/> <button name="activate_btn" tool_tip="Activar el grupo seleccionado"/> </panel> </panel> <panel label="RECIENTE" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="recent_viewsort_btn" tool_tip="Opciones"/> + <menu_button name="recent_viewsort_btn" tool_tip="Opciones"/> <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/> </panel> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_places.xml b/indra/newview/skins/default/xui/es/panel_places.xml index 2e349c7fe2..4c90a7e6b4 100644 --- a/indra/newview/skins/default/xui/es/panel_places.xml +++ b/indra/newview/skins/default/xui/es/panel_places.xml @@ -21,7 +21,7 @@ <button label="Editar" name="edit_btn" tool_tip="Editar la información del hito"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Ver más opciones"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Ver más opciones"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml index d65868c0a8..7c2c9f505e 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml @@ -3,35 +3,16 @@ <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <panel.string name="middle_mouse"> - Botón medio del ratón - </panel.string> - <slider label="Ãngulo de visión" name="camera_fov"/> - <slider label="Distancia" name="camera_offset_scale"/> - <text name="heading2"> - Posición automática para: - </text> - <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/> - <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/> - <check_box initial_value="true" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/> - <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/> - <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/> - <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/> - <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/> - <check_box label="Chat en bocadillos" name="bubble_text_chat"/> - <slider label="Opacidad" name="bubble_chat_opacity"/> - <color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/> <text name="UI Size:"> - Tamaño de la UI + Tamaño de la UI: </text> <check_box label="Mostrar los errores de los scripts en:" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="Chat" name="0"/> <radio_item label="Ventanas distintas" name="1"/> </radio_group> - <check_box label="Cambiar entre hablar on/off cuando pulse:" name="push_to_talk_toggle_check" tool_tip="En el modo 'un toque', pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo 'un toque', el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/> - <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/> - <button label="Elegir la tecla" name="set_voice_hotkey_button"/> - <button label="Botón de en medio del ratón" name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/> - <button label="Otros dispositivos" name="joystick_setup_button"/> + <check_box label="Permitir el acceso de varios usuarios" name="allow_multiple_viewer_check"/> + <check_box label="Mostrar la selección de cuadrÃcula al iniciar sesión" name="show_grid_selection_check"/> + <check_box label="Mostrar el menú Avanzado" name="show_advanced_menu_check"/> + <check_box label="Mostrar el menú Desarrollador" name="show_develop_menu_check"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 05aea82d82..67f9a929f6 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -8,44 +8,10 @@ <radio_item label="Medio" name="radio2" value="1"/> <radio_item label="Aumentar" name="radio3" value="2"/> </radio_group> - <text name="font_colors"> - Colores de la fuente: - </text> - <color_swatch label="Usted" name="user"/> - <text name="text_box1"> - Yo - </text> - <color_swatch label="Otros" name="agent"/> - <text name="text_box2"> - Otros - </text> - <color_swatch label="MI" name="im"/> - <text name="text_box3"> - MI - </text> - <color_swatch label="Sistema" name="system"/> - <text name="text_box4"> - Sistema - </text> - <color_swatch label="Errores de script" name="script_error"/> - <text name="text_box5"> - Errores de script - </text> - <color_swatch label="Objetos" name="objects"/> - <text name="text_box6"> - Objetos - </text> - <color_swatch label="Propietario" name="owner"/> - <text name="text_box7"> - Propietario - </text> - <color_swatch label="URL" name="links"/> - <text name="text_box9"> - URL - </text> <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/> <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/> <check_box label="Permitir el historial de MI y chat en texto sin formato" name="plain_text_chat_history"/> + <check_box label="Bocadillos del chat" name="bubble_text_chat"/> <text name="show_ims_in_label"> Mostrar los MI en: </text> @@ -53,9 +19,16 @@ (requiere reiniciar) </text> <radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)"> - <radio_item label="Varias ventanas" name="radio" value="0"/> + <radio_item label="Ventanas distintas" name="radio" value="0"/> <radio_item label="Pestañas" name="radio2" value="1"/> </radio_group> + <text name="disable_toast_label"> + Permitir ventanas de chat emergentes: + </text> + <check_box label="Chats de grupo" name="EnableGroupChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje de un grupo de chat"/> + <check_box label="Chats de MI" name="EnableIMChatPopups" tool_tip="Activa esta casilla para ver una ventana emergente cada vez que recibas un mensaje instantáneo"/> + <spinner label="Duración de los interlocutores favoritos en los chats:" name="nearby_toasts_lifetime"/> + <spinner label="Tiempo restante de los interlocutores favoritos en los chats:" name="nearby_toasts_fadingtime"/> <check_box label="Utiliza la herramienta de traducción automática mientras utilizas el chat (mediante Google)" name="translate_chat_checkbox"/> <text name="translate_language_text"> Traducir el chat al: diff --git a/indra/newview/skins/default/xui/es/panel_preferences_colors.xml b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml new file mode 100644 index 0000000000..4fa5c4ce63 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_preferences_colors.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Colores" name="colors_panel"> + <text name="effects_color_textbox"> + Mis efectos (rayo indicador): + </text> + <color_swatch name="effect_color_swatch" tool_tip="Pulsa para abrir el selector de color"/> + <text name="font_colors"> + Colores de fuente del chat: + </text> + <text name="text_box1"> + Yo + </text> + <text name="text_box2"> + Otros avatares + </text> + <text name="text_box3"> + Objetos + </text> + <text name="text_box4"> + Sistema + </text> + <text name="text_box5"> + Errores + </text> + <text name="text_box7"> + Propietario + </text> + <text name="text_box9"> + URL + </text> + <text name="bubble_chat"> + Fondo de los bocadillos del chat: + </text> + <color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/> + <slider label="Opacidad:" name="bubble_chat_opacity"/> + <text name="floater_opacity"> + Opacidad de la ventana: + </text> + <slider label="Activo:" name="active"/> + <slider label="Inactivo:" name="inactive"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml index 5b8cb77173..91cf9524a3 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml @@ -48,13 +48,18 @@ <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: + <check_box label="Ver nombres mostrados" name="display_names_check" tool_tip="Comprobar para utilizar nombres mostrados en chat, MI, etiquetas de nombres, etc."/> + <check_box label="Permitir los consejos de la IU del visor" name="viewer_hints_check"/> + <text name="inworld_typing_rg_label"> + Si pulsas las teclas de letras: </text> + <radio_group name="inworld_typing_preference"> + <radio_item label="Inicia el chat local" name="radio_start_chat" value="1"/> + <radio_item label="Se verá afectado el movimiento (por ejemplo, mediante las teclas WASD)" name="radio_move" value="0"/> + </radio_group> <text name="title_afk_text"> Ausente tras: </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/> <combo_box label="Ausente tras:" name="afk"> <combo_box.item label="2 minutos" name="item0"/> <combo_box.item label="5 minutos" name="item1"/> @@ -62,7 +67,6 @@ <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_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml index 36b6493004..c569db3376 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml @@ -25,6 +25,7 @@ <text name="ShadersText"> Shaders: </text> + <check_box initial_value="verdadero" label="Agua transparente" name="TransparentWater"/> <check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/> <check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/> <check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_move.xml b/indra/newview/skins/default/xui/es/panel_preferences_move.xml new file mode 100644 index 0000000000..d95e167361 --- /dev/null +++ b/indra/newview/skins/default/xui/es/panel_preferences_move.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Mover" name="move_panel"> + <slider label="Ãngulo de visión" name="camera_fov"/> + <slider label="Distancia" name="camera_offset_scale"/> + <text name="heading2"> + Posición automática para: + </text> + <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/> + <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/> + <check_box initial_value="verdadero" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/> + <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/> + <text name=" Mouse Sensitivity"> + Sensibilidad del ratón en la Vista subjetiva: + </text> + <check_box label="Invertir" name="invert_mouse"/> + <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/> + <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/> + <check_box label="Haz doble clic para:" name="double_click_chkbox"/> + <radio_group name="double_click_action"> + <radio_item label="Teleportarte" name="radio_teleport"/> + <radio_item label="Piloto automático" name="radio_autopilot"/> + </radio_group> + <button label="Otros dispositivos" name="joystick_setup_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml index bf2c6b7aa6..abff72c346 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml @@ -10,17 +10,20 @@ <check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/> <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/> <check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/> - <check_box label="Aceptar las 'cookies'" name="cookies_enabled"/> <text name="Logs:"> - Registros: + Registros de chat: </text> <check_box label="Guardar en mi ordenador registros del chat" name="log_nearby_chat"/> <check_box label="Guardar en mi ordenador registros de los MI" name="log_instant_messages"/> - <check_box label="Añadir fecha y hora" name="show_timestamps_check_im"/> + <check_box label="Añadir fecha y hora a todas las lÃneas del registro de chat" name="show_timestamps_check_im"/> + <check_box label="Añadir la fecha al nombre del archivo del registro." name="logfile_name_datestamp"/> <text name="log_path_desc"> Ruta de los registros: </text> <line_editor left="278" name="log_path_string" right="-20"/> <button label="Elegir" label_selected="Elegir" name="log_path_button" width="120"/> <button label="Lista de ignorados" name="block_list"/> + <text name="block_list_label"> + (Gente u objetos que has bloqueado) + </text> </panel> 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 100951a51e..f968f48910 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml @@ -1,12 +1,5 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Configurar" name="Input panel"> - <text name="Mouselook:"> - Vista subjetiva: - </text> - <text name=" Mouse Sensitivity"> - Sensibilidad del ratón - </text> - <check_box label="Invertir" name="invert_mouse"/> <text name="Network:"> Red: </text> @@ -46,4 +39,5 @@ </text> <line_editor name="web_proxy_editor" tool_tip="Nombre o dirección IP del proxy que quieres usar"/> <spinner label="Nº del puerto:" name="web_proxy_port"/> + <check_box initial_value="verdadero" label="Descargar e instalar automáticamente actualizaciones de [APP_NAME]" name="updater_service_active"/> </panel> diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml index b0088ee1a2..7989100c09 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sonidos" name="Preference Media panel"> + <panel.string name="middle_mouse"> + Botón medio del ratón + </panel.string> <slider label="Volumen general" name="System Volume"/> <check_box initial_value="true" label="Silenciar cuando minimice" name="mute_when_minimized"/> <slider label="Botones" name="UI Volume"/> @@ -23,6 +26,11 @@ <radio_item label="La posición de la cámara" name="0"/> <radio_item label="La posición del avatar" name="1"/> </radio_group> + <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/> + <check_box label="Cambiar entre hablar on/off cuando pulse:" name="push_to_talk_toggle_check" tool_tip="En el modo 'un toque', pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo 'un toque', el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/> + <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/> + <button label="Elegir la tecla" name="set_voice_hotkey_button"/> + <button name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/> <button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/> <panel label="Configuración de dispositivos" name="device_settings_panel"> <panel.string name="default_text"> diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml index 5cfe83cd61..339a1f236b 100644 --- a/indra/newview/skins/default/xui/es/panel_profile.xml +++ b/indra/newview/skins/default/xui/es/panel_profile.xml @@ -53,7 +53,7 @@ <button label="Teleporte" name="teleport" tool_tip="Ofrecer teleporte"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Pagar dinero al Residente o compartir algo del inventario con él"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Pagar dinero al Residente o compartir algo del inventario con él"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml index c73db729fe..5be25a286d 100644 --- a/indra/newview/skins/default/xui/es/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml @@ -15,11 +15,6 @@ <panel.string name="Title"> Script: [NAME] </panel.string> - <text_editor name="Script Editor"> - Cargando... - </text_editor> - <button label="Guardar" label_selected="Guardar" name="Save_btn"/> - <combo_box label="Insertar..." name="Insert..."/> <menu_bar name="script_menu"> <menu label="Archivo" name="File"> <menu_item_call label="Guardar" name="Save"/> @@ -40,4 +35,10 @@ <menu_item_call label="Ayuda de palabras clave..." name="Keyword Help..."/> </menu> </menu_bar> + <text_editor name="Script Editor"> + Cargando... + </text_editor> + <combo_box label="Insertar..." name="Insert..."/> + <button label="Guardar" label_selected="Guardar" name="Save_btn"/> + <button label="Editar..." name="Edit_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml index 0be827f5f7..810b1630dd 100644 --- a/indra/newview/skins/default/xui/es/strings.xml +++ b/indra/newview/skins/default/xui/es/strings.xml @@ -1740,11 +1740,8 @@ <string name="InvOfferGaveYou"> te ha dado </string> - <string name="InvOfferYouDecline"> - Has rehusado - </string> - <string name="InvOfferFrom"> - de + <string name="InvOfferDecline"> + Rechazas [DESC] de <nolink>[NAME]</nolink>. </string> <string name="GroupMoneyTotal"> Total 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_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 3527d89973..67d70ac003 100644 --- a/indra/newview/skins/default/xui/fr/floater_event.xml +++ b/indra/newview/skins/default/xui/fr/floater_event.xml @@ -1,40 +1,11 @@ -<?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"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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="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.string name="done_text"> + Terminé + </floater.string> + <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_hardware_settings.xml b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml index e3d604477c..8ad301823b 100644 --- a/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/fr/floater_hardware_settings.xml @@ -14,6 +14,9 @@ <combo_box.item label="8x" name="8x"/> <combo_box.item label="16x" name="16x"/> </combo_box> + <text name="antialiasing restart"> + (redémarrage du client requis) + </text> <spinner label="Gamma :" name="gamma"/> <text left="217" name="(brightness, lower is brighter)"> (0 = défaut, valeur faible = plus lumineux) 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_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_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml index 052e43388b..0f9fb1334b 100644 --- a/indra/newview/skins/default/xui/fr/floater_preferences.xml +++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml @@ -5,10 +5,12 @@ <tab_container name="pref core"> <panel label="Général" name="general"/> <panel label="Graphiques" name="display"/> - <panel label="Confidentialité" name="im"/> <panel label="Son et Média" name="audio"/> <panel label="Chat" name="chat"/> + <panel label="Affichage/Déplacement" name="move"/> <panel label="Notifications" name="msgs"/> + <panel label="Couleurs" name="colors"/> + <panel label="Confidentialité" name="im"/> <panel label="Configuration" name="input"/> <panel label="Avancées" name="advanced1"/> </tab_container> diff --git a/indra/newview/skins/default/xui/fr/floater_region_debug_console.xml b/indra/newview/skins/default/xui/fr/floater_region_debug_console.xml new file mode 100644 index 0000000000..1747155b60 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_region_debug_console.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="region_debug_console" title="Débogage de région"/> diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml index 8a128c0308..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 : 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 8397dc4263..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,7 +19,7 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mon avatar :"/> </layout_panel> - <layout_panel name="leave_call_panel"> + <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"/> 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_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml index 73770dce5f..f28918ae14 100644 --- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_gear_default"> +<toggleable_menu name="menu_gear_default"> <menu_item_call label="Nouvelle fenêtre d'inventaire" name="new_window"/> - <menu_item_call label="Trier par nom" name="sort_by_name"/> - <menu_item_call label="Trier en commençant par le plus récent" name="sort_by_recent"/> + <menu_item_check label="Trier par nom" name="sort_by_name"/> + <menu_item_check label="Trier en commençant par le plus récent" name="sort_by_recent"/> + <menu_item_check label="Dossiers système en premier" name="sort_system_folders_to_top"/> <menu_item_call label="Afficher les filtres" name="show_filters"/> <menu_item_call label="Réinitialiser les filtres" name="reset_filters"/> <menu_item_call label="Fermer tous les dossiers" name="close_folders"/> @@ -12,4 +13,4 @@ <menu_item_call label="Trouver l'original" name="Find Original"/> <menu_item_call label="Trouver tous les liens" name="Find All Links"/> <menu_item_call label="Vider la corbeille" name="empty_trash"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml index 5f51c61655..fb4ab314af 100644 --- a/indra/newview/skins/default/xui/fr/menu_viewer.xml +++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml @@ -12,6 +12,12 @@ <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/> <menu_item_check label="Mes gestes" name="Gestures"/> <menu_item_check label="Ma voix" name="ShowVoice"/> + <menu label="Déplacement" name="Movement"> + <menu_item_call label="M'asseoir" name="Sit Down Here"/> + <menu_item_check label="Voler" name="Fly"/> + <menu_item_check label="Toujours courir" name="Always Run"/> + <menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/> + </menu> <menu label="Mon statut" name="Status"> <menu_item_call label="Absent" name="Set Away"/> <menu_item_call label="Occupé" name="Set Busy"/> @@ -47,6 +53,7 @@ <menu_item_check label="Propriétaires de terrains" name="Land Owners"/> <menu_item_check label="Coordonnées" name="Coordinates"/> <menu_item_check label="Propriétés de la parcelle" name="Parcel Properties"/> + <menu_item_check label="Menu Avancé" name="Show Advanced Menu"/> </menu> <menu_item_call label="Me téléporter chez moi" name="Teleport Home"/> <menu_item_call label="Définir le domicile ici" name="Set Home to Here"/> @@ -85,6 +92,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 +106,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,9 +127,9 @@ <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"/> <menu_item_call label="Refixer les textures" name="Rebake Texture"/> <menu_item_call label="Taille de l'interface par défaut" name="Set UI Size to Default"/> <menu_item_call label="Définir la taille de la fenêtre…" name="Set Window Size..."/> @@ -174,8 +183,7 @@ <menu_item_check label="Rechercher" name="Search"/> <menu_item_call label="Relâcher les touches" name="Release Keys"/> <menu_item_call label="Taille de l'interface par défaut" name="Set UI Size to Default"/> - <menu_item_check label="Toujours courir" name="Always Run"/> - <menu_item_check label="Voler" name="Fly"/> + <menu_item_check label="Afficher le menu Avancé - raccourci existant" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="Fermer la fenêtre" name="Close Window"/> <menu_item_call label="Fermer toutes les fenêtres" name="Close All Windows"/> <menu_item_call label="Photo sur disque" name="Snapshot to Disk"/> @@ -193,7 +201,6 @@ <menu_item_call label="Zoomer en avant" name="Zoom In"/> <menu_item_call label="Zoom par défaut" name="Zoom Default"/> <menu_item_call label="Zoomer en arrière" name="Zoom Out"/> - <menu_item_check label="Afficher le menu Avancé" name="Show Advanced Menu"/> </menu> <menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/> <menu_item_check label="Afficher le menu Développeurs" name="Debug Mode"/> @@ -308,8 +315,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="Téléportation par double-clic" name="DoubleClick Teleport"/> + <menu_item_check label="Console de débogage de région" name="Region Debug Console"/> <menu_item_check label="Débogage SelectMgr" name="Debug SelectMgr"/> <menu_item_check label="Débogage clics" name="Debug Clicks"/> <menu_item_check label="Débogage des vues" name="Debug Views"/> @@ -321,10 +327,9 @@ <menu label="XUI" name="XUI"> <menu_item_call label="Recharger les paramètres de couleurs" name="Reload Color Settings"/> <menu_item_call label="Afficher le test de police" name="Show Font Test"/> - <menu_item_call label="Charger à partir de XML" name="Load from XML"/> - <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"> @@ -361,9 +366,9 @@ <menu_item_call label="Compresser les images" name="Compress Images"/> <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/> <menu_item_check label="Console Window on next Run" name="Console Window"/> - <menu_item_check label="Afficher le menu Admin" name="View Admin Options"/> <menu_item_call label="Demander le statut Admin" name="Request Admin Options"/> <menu_item_call label="Quitter le statut Admin" name="Leave Admin Options"/> + <menu_item_check label="Afficher le menu Admin" name="View Admin Options"/> </menu> <menu label="Admin" name="Admin"> <menu label="Object"> diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml index 243bad8f8a..ec362d7f22 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"> @@ -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. @@ -387,6 +387,9 @@ Remarque : cela videra le cache. <notification name="ChangeSkin"> Le nouveau thème apparaîtra après le redémarrage de [APP_NAME]. </notification> + <notification name="ChangeLanguage"> + Le changement de langue sera effectué au redémarrage de [APP_NAME]. + </notification> <notification name="GoToAuctionPage"> Aller à la page web de [SECOND_LIFE] pour voir le détail des enchères ou enchérir ? <url name="url"> @@ -599,6 +602,10 @@ Assurez-vous que le fichier a l'extension correcte. Impossible de trouver les données dans l'en-tête WAV : [FILE] </notification> + <notification name="SoundFileInvalidChunkSize"> + Taille de fragment incorrecte dans le fichier WAV : +[FILE] + </notification> <notification name="SoundFileInvalidTooLong"> Le fichier audio est trop long (10 secondes maximum) : [FILE] @@ -920,12 +927,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 +970,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 +1085,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"/> @@ -1331,6 +1332,16 @@ Cette mise à jour n'est pas requise mais si vous voulez une meilleure perf Télécharger vers le dossier Applications ? <usetemplate name="okcancelbuttons" notext="Continuer" yestext="Télécharger"/> </notification> + <notification name="FailedUpdateInstall"> + Une erreur est survenue lors de l'installation de la mise à jour du client. +Veuillez télécharger et installer la dernière version du client à la page Web +http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DownloadBackground"> + Une mise à jour de [APP_NAME] a été téléchargée. +Elle sera appliquée au prochain redémarrage de [APP_NAME]. + </notification> <notification name="DeedObjectToGroup"> Si vous cédez cet objet, le groupe : * recevra les L$ versés pour l'objet ; @@ -1460,6 +1471,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 +2079,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 +2150,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 +2220,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,7 +2232,7 @@ Veuillez sélectionner un terrain plus petit. [NAME] [DATE] <form name="form"> - <button name="Description" text="Détails"/> + <button name="Details" text="Détails"/> <button name="Cancel" text="Annuler"/> </form> </notification> @@ -2217,7 +2268,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. @@ -2344,7 +2395,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"/> @@ -2409,9 +2460,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"/> @@ -2430,8 +2481,8 @@ Veuillez réessayer dans quelques minutes. Amitié refusée. </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] 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. + [NAME] vous offre sa carte de visite. +Un signet sera ajouté dans votre inventaire afin que vous puissiez envoyer rapidement un IM à ce résident. <form name="form"> <button name="Accept" text="Accepter"/> <button name="Decline" text="Refuser"/> @@ -2446,11 +2497,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"/> @@ -2466,7 +2517,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 ? @@ -2477,12 +2528,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"/> @@ -2490,14 +2541,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"/> @@ -2534,13 +2585,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]. @@ -2767,6 +2818,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_edit_gloves.xml b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml index 7f02222bef..68a7ac54e2 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_gloves_panel"> <panel name="avatar_gloves_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml index 0a87471db8..7e467b130c 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_jacket_panel"> <panel name="avatar_jacket_color_panel"> - <texture_picker label="Tissu (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/> - <texture_picker label="Tissu (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml index b9f81278e2..60d8e947f8 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_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_edit_shirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml index e4e66db2ed..9a263f6148 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml index 6fca0fe121..3eb70923ef 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shoes_panel"> <panel name="avatar_shoes_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml index 65fed2fbf4..f562d67937 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml index b9e9a07b8c..f97047ae28 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml index 7eddbd93f6..c83ce04885 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_underpants_panel"> <panel name="avatar_underpants_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml index e6bac22c23..689b7b81f4 100644 --- a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_undershirt_panel"> <panel name="avatar_undershirt_color_panel"> - <texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> + <texture_picker label="Texture" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/> <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/> </panel> <panel name="accordion_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_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..db7d254b7a 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] + [ITEM_COUNT] articles récupérés... [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_notify_textbox.xml b/indra/newview/skins/default/xui/fr/panel_notify_textbox.xml new file mode 100644 index 0000000000..a37770e184 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_notify_textbox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_notify_textbox"> + <string name="message_max_lines_count" value="7"/> + <panel label="info_panel" name="info_panel"> + <text_editor name="message" value="message"/> + parse_urls="false" + <button label="Soumettre" name="btn_submit"/> + </panel> + <panel label="control_panel" name="control_panel"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml index 76edc316c2..eecbabae2b 100644 --- a/indra/newview/skins/default/xui/fr/panel_people.xml +++ b/indra/newview/skins/default/xui/fr/panel_people.xml @@ -2,9 +2,9 @@ <!-- Side tray panel --> <panel label="Résidents" name="people_panel"> <string name="no_recent_people" value="Personne de récent. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/> - <string name="no_filtered_recent_people" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/> + <string name="no_filtered_recent_people" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]."/> <string name="no_one_near" value="Personne près de vous. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/> - <string name="no_one_filtered_near" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/> + <string name="no_one_filtered_near" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]."/> <string name="no_friends_online" value="Pas d'amis connectés"/> <string name="no_friends" value="Pas d'amis"/> <string name="no_friends_msg"> @@ -12,17 +12,17 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:///app/worldmap Carte du monde]. </string> <string name="no_filtered_friends_msg"> - Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]. + Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/[SEARCH_TERM] Rechercher]. </string> <string name="people_filter_label" value="Filtrer les personnes"/> <string name="groups_filter_label" value="Filtrer les groupes"/> - <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/Rechercher [SEARCH_TERM]]."/> + <string name="no_filtered_groups_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/[SEARCH_TERM] Rechercher]."/> <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/> <filter_editor label="Filtre" name="filter_input"/> <tab_container name="tabs"> <panel label="PRÈS DE VOUS" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="nearby_view_sort_btn" tool_tip="Options"/> + <menu_button name="nearby_view_sort_btn" tool_tip="Options"/> <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> </panel> </panel> @@ -34,27 +34,27 @@ Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:// <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="bottom_panel"> <layout_panel name="options_gear_btn_panel"> - <button name="friends_viewsort_btn" tool_tip="Afficher d'autres options"/> + <menu_button name="friends_viewsort_btn" tool_tip="Afficher d'autres options"/> </layout_panel> <layout_panel name="add_btn_panel"> <button name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/> </layout_panel> <layout_panel name="trash_btn_panel"> - <dnd_button name="trash_btn" tool_tip="Supprimer le résident sélectionné de votre liste d'amis"/> + <dnd_button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d'amis."/> </layout_panel> </layout_stack> </panel> </panel> <panel label="MES GROUPES" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="groups_viewsort_btn" tool_tip="Options"/> + <menu_button name="groups_viewsort_btn" tool_tip="Options"/> <button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/> <button name="activate_btn" tool_tip="Activer le groupe sélectionné"/> </panel> </panel> <panel label="RÉCENT" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="recent_viewsort_btn" tool_tip="Options"/> + <menu_button name="recent_viewsort_btn" tool_tip="Options"/> <button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d'amis"/> </panel> </panel> @@ -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_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml index 7f3601b90d..e252c224f8 100644 --- a/indra/newview/skins/default/xui/fr/panel_places.xml +++ b/indra/newview/skins/default/xui/fr/panel_places.xml @@ -21,7 +21,7 @@ <button label="Modifier" name="edit_btn" tool_tip="Modifier les informations du repère"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Afficher d'autres options"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Afficher d'autres options"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml index 9af3a8a5d8..3468afbafe 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml @@ -3,35 +3,16 @@ <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <panel.string name="middle_mouse"> - Bouton central de la souris - </panel.string> - <slider label="Angle de vue" name="camera_fov"/> - <slider label="Distance" name="camera_offset_scale"/> - <text name="heading2"> - Positionnement automatique pour : - </text> - <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/> - <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/> - <check_box initial_value="true" label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Positionnement auto de la caméra pour le panneau latéral"/> - <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/> - <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/> - <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/> - <check_box label="Faire bouger les lèvres de l'avatar quand il parle" name="enable_lip_sync"/> - <check_box label="Bulles de chat" name="bubble_text_chat"/> - <slider label="Opacité" name="bubble_chat_opacity"/> - <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/> <text name="UI Size:"> - Taille de l'interface + Taille d'interface : </text> <check_box label="Afficher les erreurs de script dans :" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="Chat près de moi" name="0"/> <radio_item label="Autre fenêtre" name="1"/> </radio_group> - <check_box label="Activer/désactiver la fonction Parler quand j'appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n'êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/> - <line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/> - <button label="Définir la touche" name="set_voice_hotkey_button"/> - <button label="Bouton central de la souris" name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/> - <button label="Autres accessoires" name="joystick_setup_button"/> + <check_box label="Clients multiples autorisés" name="allow_multiple_viewer_check"/> + <check_box label="Liste de sélection de grille affichée à la connexion" name="show_grid_selection_check"/> + <check_box label="Menu Avancé affiché" name="show_advanced_menu_check"/> + <check_box label="Menu Développeurs affiché" name="show_develop_menu_check"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index a482fa99d0..4b3fc35150 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -8,44 +8,10 @@ <radio_item label="Moyenne" name="radio2" value="1"/> <radio_item label="Grande" name="radio3" value="2"/> </radio_group> - <text name="font_colors"> - Couleurs de police : - </text> - <color_swatch label="Vous" name="user"/> - <text name="text_box1"> - Moi - </text> - <color_swatch label="Avatars" name="agent"/> - <text name="text_box2"> - Avatars - </text> - <color_swatch label="IM" name="im"/> - <text name="text_box3"> - IM - </text> - <color_swatch label="Système" name="system"/> - <text name="text_box4"> - Système - </text> - <color_swatch label="Erreurs de script" name="script_error"/> - <text name="text_box5"> - Erreurs de script - </text> - <color_swatch label="Objets" name="objects"/> - <text name="text_box6"> - Objets - </text> - <color_swatch label="Propriétaire" name="owner"/> - <text name="text_box7"> - Propriétaire - </text> - <color_swatch label="URL" name="links"/> - <text name="text_box9"> - URL - </text> <check_box initial_value="true" label="Jouer l'animation clavier quand vous écrivez" name="play_typing_animation"/> <check_box label="M'envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/> <check_box label="Activer l'historique des chats et des IM en texte brut" name="plain_text_chat_history"/> + <check_box label="Bulles de chat" name="bubble_text_chat"/> <text name="show_ims_in_label"> Afficher les IM dans : </text> @@ -56,6 +22,13 @@ <radio_item label="Plusieurs fenêtres" name="radio" value="0"/> <radio_item label="Onglets" name="radio2" value="1"/> </radio_group> + <text name="disable_toast_label"> + Activer les popups de chat entrant : + </text> + <check_box label="Chats de groupe" name="EnableGroupChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message de chat de groupe."/> + <check_box label="Chats IM" name="EnableIMChatPopups" tool_tip="Cocher cette case pour qu'un popup s'affiche à réception d'un message instantané."/> + <spinner label="Durée de vie du popup Chat près de moi :" name="nearby_toasts_lifetime"/> + <spinner label="Disparition progressive du popup Chat près de moi :" name="nearby_toasts_fadingtime"/> <check_box label="Utiliser la traduction automatique lors des chats (fournie par Google)" name="translate_chat_checkbox"/> <text name="translate_language_text"> Traduire le chat en : diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml new file mode 100644 index 0000000000..e94bb08c9c --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_preferences_colors.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Couleurs" name="colors_panel"> + <text name="effects_color_textbox"> + Mes effets (faisceau de sélection lumineux) : + </text> + <color_swatch name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs."/> + <text name="font_colors"> + Couleurs de la police du chat : + </text> + <text name="text_box1"> + Moi + </text> + <text name="text_box2"> + Autres résidents + </text> + <text name="text_box3"> + Objets + </text> + <text name="text_box4"> + Système + </text> + <text name="text_box5"> + Erreurs + </text> + <text name="text_box7"> + Propriétaire + </text> + <text name="text_box9"> + URL + </text> + <text name="bubble_chat"> + Arrière-plan des bulles de chat : + </text> + <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat."/> + <slider label="Opacité :" name="bubble_chat_opacity"/> + <text name="floater_opacity"> + Opacité des fenêtres flottantes : + </text> + <slider label="Actives :" name="active"/> + <slider label="Inactives :" name="inactive"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml index 20d5f754ce..2786798173 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml @@ -44,16 +44,22 @@ <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"/> - <text name="effects_color_textbox"> - Mes effets : + <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."/> + <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."/> + <check_box label="Activer les astuces de l'interface" name="viewer_hints_check"/> + <text name="inworld_typing_rg_label"> + Appuyer sur les touches lettre : </text> + <radio_group name="inworld_typing_preference"> + <radio_item label="Lance le chat local" name="radio_start_chat" value="1"/> + <radio_item label="Affecte le déplacement (ZQSD/WASD)" name="radio_move" value="0"/> + </radio_group> <text name="title_afk_text"> Me montrer absent après : </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/> <combo_box label="Me montrer absent après :" name="afk"> <combo_box.item label="2 minutes" name="item0"/> <combo_box.item label="5 minutes" name="item1"/> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml index 0c8d957f5b..c90edd443e 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml @@ -25,6 +25,7 @@ <text name="ShadersText"> Effets : </text> + <check_box initial_value="true" label="Eau transparente" name="TransparentWater"/> <check_box initial_value="true" label="Placage de relief et brillance" name="BumpShiny"/> <check_box initial_value="true" label="Effets de base" name="BasicShaders" tool_tip="La désactivation de cette option peut éviter le plantage de certains pilotes de cartes graphiques"/> <check_box initial_value="true" label="Effets atmosphériques" name="WindLightUseAtmosShaders"/> @@ -42,8 +43,8 @@ <text name="DrawDistanceMeterText2"> m </text> - <slider label="Nombre de particules max. :" label_width="147" name="MaxParticleCount"/> - <slider label="Nb max d'avatars non éloignés en 2D :" name="MaxNumberAvatarDrawn"/> + <slider label="Nb max. de particules :" label_width="147" name="MaxParticleCount"/> + <slider label="Avatars max. non éloignés en 2D :" name="MaxNumberAvatarDrawn"/> <slider label="Qualité post-traitement :" name="RenderPostProcess"/> <text name="MeshDetailText"> Détails des rendus : diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_move.xml b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml new file mode 100644 index 0000000000..5f1b206a39 --- /dev/null +++ b/indra/newview/skins/default/xui/fr/panel_preferences_move.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Déplacement" name="move_panel"> + <slider label="Angle de vue" name="camera_fov"/> + <slider label="Distance" name="camera_offset_scale"/> + <text name="heading2"> + Positionnement automatique pour : + </text> + <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra lorsque vous entrez en mode de modification et le quittez."/> + <check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra en mode de modification."/> + <check_box initial_value="true" label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Utiliser le positionnement automatique de la caméra pour le panneau latéral."/> + <check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/> + <text name=" Mouse Sensitivity"> + Sensibilité de la souris en vue subjective : + </text> + <check_box label="Inverser" name="invert_mouse"/> + <check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/> + <check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/> + <check_box label="Double-cliquer pour :" name="double_click_chkbox"/> + <radio_group name="double_click_action"> + <radio_item label="Téléportation" name="radio_teleport"/> + <radio_item label="Pilotage auto" name="radio_autopilot"/> + </radio_group> + <button label="Autres accessoires" name="joystick_setup_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml index f14ccc3a8e..6a4c77a10e 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml @@ -10,17 +10,20 @@ <check_box label="Seuls mes amis et groupes voient quand je suis en ligne" name="online_visibility"/> <check_box label="Seuls mes amis et groupes peuvent m'appeler ou m'envoyer un IM" name="voice_call_friends_only_check"/> <check_box label="Fermer le micro à la fin d'un appel" name="auto_disengage_mic_check"/> - <check_box label="Accepter les cookies" name="cookies_enabled"/> <text name="Logs:"> - Journaux : + Journaux de chat : </text> <check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/> <check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/> - <check_box label="Inclure les dates et heures" name="show_timestamps_check_im"/> + <check_box label="Inclure la date et l'heure pour chaque ligne du journal de chat" name="show_timestamps_check_im"/> + <check_box label="Inclure la date dans le nom du fichier journal" name="logfile_name_datestamp"/> <text name="log_path_desc"> Emplacement : </text> <line_editor left="308" name="log_path_string" right="-20"/> <button label="Parcourir" label_selected="Parcourir" name="log_path_button" width="150"/> <button label="Liste des ignorés" name="block_list"/> + <text name="block_list_label"> + (personnes et/ou objets que vous avez ignorés) + </text> </panel> 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..8fa499d14a 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml @@ -1,13 +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> - <text name=" Mouse Sensitivity"> - Sensibilité de la souris - </text> - <check_box label="Inverser" name="invert_mouse"/> <text name="Network:"> Réseau : </text> @@ -40,10 +32,12 @@ <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 : </text> <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/> <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/> + <check_box initial_value="true" label="Télécharger et installer automatiquement les mises à jour [APP_NAME]" name="updater_service_active"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml index b82d8bcd18..654d40e2f9 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sons" name="Preference Media panel"> + <panel.string name="middle_mouse"> + Bouton central de la souris + </panel.string> <slider label="Volume principal" name="System Volume"/> <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/> <slider label="Boutons" name="UI Volume"/> @@ -23,6 +26,11 @@ <radio_item label="Position de la caméra" name="0"/> <radio_item label="Position de l'avatar" name="1"/> </radio_group> + <check_box label="Faire bouger les lèvres de l'avatar lorsqu'il parle" name="enable_lip_sync"/> + <check_box label="Activer/désactiver la fonction Parler quand j'appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n'êtes pas en mode bascule, le micro ne diffuse votre voix que lorsque vous maintenez la touche de contrôle de la fonction enfoncée."/> + <line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/> + <button label="Définir la touche" name="set_voice_hotkey_button"/> + <button name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/> <button label="Périphériques d'entrée/de sortie" name="device_settings_btn"/> <panel label="Paramètres du matériel" name="device_settings_panel"> <panel.string name="default_text"> diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml index 4606f5a0c6..6b611923af 100644 --- a/indra/newview/skins/default/xui/fr/panel_profile.xml +++ b/indra/newview/skins/default/xui/fr/panel_profile.xml @@ -57,7 +57,7 @@ <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Payer le résident ou partager l'inventaire avec lui"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Payer le résident ou partager l'inventaire avec lui"/> </layout_panel> </layout_stack> </layout_panel> 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_script_ed.xml b/indra/newview/skins/default/xui/fr/panel_script_ed.xml index 3b3b676aa1..2c86dd72b6 100644 --- a/indra/newview/skins/default/xui/fr/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/fr/panel_script_ed.xml @@ -15,11 +15,6 @@ <panel.string name="Title"> Script : [NAME] </panel.string> - <text_editor name="Script Editor"> - Chargement... - </text_editor> - <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/> - <combo_box label="Insérer..." name="Insert..."/> <menu_bar name="script_menu"> <menu label="Fichier" name="File"> <menu_item_call label="Enregistrer" name="Save"/> @@ -40,4 +35,10 @@ <menu_item_call label="Aide par mots-clés..." name="Keyword Help..."/> </menu> </menu_bar> + <text_editor name="Script Editor"> + Chargement... + </text_editor> + <combo_box label="Insérer..." name="Insert..."/> + <button label="Enregistrer" label_selected="Enregistrer" name="Save_btn"/> + <button label="Modifier..." name="Edit_btn"/> </panel> diff --git a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml index 1586c201da..cf1266a460 100644 --- a/indra/newview/skins/default/xui/fr/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/fr/panel_teleport_history.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="Teleport History"> <accordion name="history_accordion"> - <no_matched_tabs_text name="no_matched_teleports_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/Rechercher [SEARCH_TERM]]."/> + <no_matched_tabs_text name="no_matched_teleports_msg" value="Vous n'avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/[SEARCH_TERM] Rechercher]."/> <no_visible_tabs_text name="no_teleports_msg" value="L'historique des téléportations est vide. Essayez [secondlife:///app/search/places/ Rechercher]."/> <accordion_tab name="today" title="Aujourd'hui"/> <accordion_tab name="yesterday" title="Hier"/> 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 af70048106..d75f6c731d 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> @@ -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/[SEARCH_TERM] Rechercher]. </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/[SEARCH_TERM] Rechercher]. </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 @@ -1764,11 +1773,8 @@ <string name="InvOfferGaveYou"> vous a donné </string> - <string name="InvOfferYouDecline"> - Vous avez refusé - </string> - <string name="InvOfferFrom"> - de la part de + <string name="InvOfferDecline"> + Vous refusez l'offre [DESC] de <nolink>[NAME]</nolink>. </string> <string name="GroupMoneyTotal"> Total @@ -3574,7 +3580,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 +3649,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 +3666,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 +3687,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_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_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/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml index ffd27d55e8..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. @@ -2223,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]'. @@ -2433,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"/> @@ -2493,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"/> @@ -2537,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_places.xml b/indra/newview/skins/default/xui/it/panel_places.xml index e33f8190eb..61830f186f 100644 --- a/indra/newview/skins/default/xui/it/panel_places.xml +++ b/indra/newview/skins/default/xui/it/panel_places.xml @@ -21,7 +21,7 @@ <button label="Modifica" name="edit_btn" tool_tip="Modifica le informazioni del punto di riferimento"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Mostra ulteriori opzioni"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Mostra ulteriori opzioni"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml index 8a8d8f5846..c11adeda3d 100644 --- a/indra/newview/skins/default/xui/it/panel_profile.xml +++ b/indra/newview/skins/default/xui/it/panel_profile.xml @@ -53,7 +53,7 @@ <button label="Teleport" name="teleport" tool_tip="Offri teleport"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Paga del denaro o condividi qualcosa dall'inventario con il residente"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Paga del denaro o condividi qualcosa dall'inventario con il residente"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml index 9dbfc2b79c..dfe635182e 100644 --- a/indra/newview/skins/default/xui/it/strings.xml +++ b/indra/newview/skins/default/xui/it/strings.xml @@ -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_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_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/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 93d6644902..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"> オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ä¸ã¯è³¼å…¥ã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。 @@ -2273,7 +2270,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã </notification> <notification name="OtherObjectsReturned"> é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ - [FIRST] [LAST] + [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="OtherObjectsReturned2"> @@ -2488,7 +2485,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‹’å¦ã•ã‚Œã¾ã—ãŸã€‚ </notification> <notification name="OfferCallingCard"> - [FIRST] [LAST] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ + [NAME] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•ã‚Œã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ <form name="form"> <button name="Accept" text="å—ã‘入れる"/> @@ -2548,7 +2545,7 @@ Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã </form> </notification> <notification name="ScriptDialog"> - [FIRST] [LAST] ã®ã€Œ [TITLE] 〠+ [NAME] ã®ã€Œ <nolink>[TITLE]</nolink> 〠[MESSAGE] <form name="form"> <button name="Ignore" text="無視ã™ã‚‹"/> @@ -2592,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_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_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml index 3e364c9b3a..e19b86e552 100644 --- a/indra/newview/skins/default/xui/ja/panel_places.xml +++ b/indra/newview/skins/default/xui/ja/panel_places.xml @@ -21,7 +21,7 @@ <button label="編集" name="edit_btn" tool_tip="ランドマークã®æƒ…å ±ã‚’ç·¨é›†ã—ã¾ã™"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="オプションを表示ã—ã¾ã™"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="オプションを表示ã—ã¾ã™"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml index 860020c87c..c2ffd74ec0 100644 --- a/indra/newview/skins/default/xui/ja/panel_profile.xml +++ b/indra/newview/skins/default/xui/ja/panel_profile.xml @@ -57,7 +57,7 @@ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/> </layout_panel> </layout_stack> </layout_panel> diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml index 92bbedaee5..187f21257a 100644 --- a/indra/newview/skins/default/xui/ja/strings.xml +++ b/indra/newview/skins/default/xui/ja/strings.xml @@ -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_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_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml index b72e4d4681..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: @@ -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 b4b56a035f..be0c17d2ff 100644 --- a/indra/newview/skins/default/xui/nl/notifications.xml +++ b/indra/newview/skins/default/xui/nl/notifications.xml @@ -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> @@ -2780,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"/> 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/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml index 844945913f..07265d2716 100644 --- a/indra/newview/skins/default/xui/nl/strings.xml +++ b/indra/newview/skins/default/xui/nl/strings.xml @@ -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_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 6b24720d86..d278114969 100644 --- a/indra/newview/skins/default/xui/pl/floater_event.xml +++ b/indra/newview/skins/default/xui/pl/floater_event.xml @@ -1,40 +1,11 @@ -<?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"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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="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.string name="done_text"> + ZakoÅ„czono + </floater.string> + <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_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_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_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 80200cfb21..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,7 +19,7 @@ <layout_panel name="my_panel"> <text name="user_text" value="Mój awatar:"/> </layout_panel> - <layout_panel name="leave_call_panel"> + <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"/> 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 36c662394e..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,7 +2194,7 @@ Spróbuj wybrać mniejszy obszar. [NAME] [DATE] <form name="form"> - <button name="Details" text="Opis"/> + <button name="Details" text="Szczegóły"/> <button name="Cancel" text="Anuluj"/> </form> </notification> @@ -2193,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. @@ -2317,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"/> @@ -2382,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"> @@ -2403,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"/> @@ -2423,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"/> @@ -2439,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"/> @@ -2450,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"/> @@ -2463,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"/> @@ -2509,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]. @@ -2741,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_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_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_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_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_places.xml b/indra/newview/skins/default/xui/pl/panel_places.xml index e0a0cfd96a..34c105225d 100644 --- a/indra/newview/skins/default/xui/pl/panel_places.xml +++ b/indra/newview/skins/default/xui/pl/panel_places.xml @@ -21,7 +21,7 @@ <button label="Edytuj" name="edit_btn" tool_tip="Edytuj informacje landmarka"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Pokaż opcje dodatkowe"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Pokaż opcje dodatkowe"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> 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_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml index f4a5699f8d..4152c00386 100644 --- a/indra/newview/skins/default/xui/pl/panel_profile.xml +++ b/indra/newview/skins/default/xui/pl/panel_profile.xml @@ -42,7 +42,7 @@ <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="ZapÅ‚ać lub udostÄ™pnij obiekt Rezydentowi"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="ZapÅ‚ać lub udostÄ™pnij obiekt Rezydentowi"/> </layout_panel> </layout_stack> </layout_panel> 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/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 e355bdbb96..ea8bdd75b9 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> @@ -3460,7 +3469,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj siÄ™ z [SUPPORT_SITE]. Rozmowa gÅ‚osowa zakoÅ„czona </string> <string name="conference-title-incoming"> - Konferencja z [AGENT_NAME] + Konferencja z [AGENT_NAME] </string> <string name="no_session_message"> (Sesja IM wygasÅ‚a) @@ -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 df4fe9a6a8..a8dc3f96d7 100644 --- a/indra/newview/skins/default/xui/pt/floater_event.xml +++ b/indra/newview/skins/default/xui/pt/floater_event.xml @@ -1,40 +1,11 @@ -<?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"> +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<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="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.string name="done_text"> + Pronto + </floater.string> + <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_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml index c666a941fe..8c95a3b548 100644 --- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml +++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml @@ -14,6 +14,9 @@ <combo_box.item label="8x" name="8x"/> <combo_box.item label="16x" name="16x"/> </combo_box> + <text name="antialiasing restart"> + (Reinicie para ativar) + </text> <spinner label="Gama:" name="gamma"/> <text name="(brightness, lower is brighter)"> (0 = brilho padrão, menor = mais brilho) 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_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_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_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml index 2c76a72ca8..c89a61d9b1 100644 --- a/indra/newview/skins/default/xui/pt/floater_preferences.xml +++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml @@ -5,10 +5,12 @@ <tab_container name="pref core"> <panel label="Geral" name="general"/> <panel label="VÃdeo" name="display"/> - <panel label="Privacidade" name="im"/> <panel label="Som e mÃdia" name="audio"/> <panel label="Bate-papo" name="chat"/> + <panel label="Mover e ver" name="move"/> <panel label="Notificações" name="msgs"/> + <panel label="Cores" name="colors"/> + <panel label="Privacidade" name="im"/> <panel label="Configurações" name="input"/> <panel label="Avançado" name="advanced1"/> </tab_container> diff --git a/indra/newview/skins/default/xui/pt/floater_region_debug_console.xml b/indra/newview/skins/default/xui/pt/floater_region_debug_console.xml new file mode 100644 index 0000000000..d3b5df2d74 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_region_debug_console.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="region_debug_console" title="Depuração de região"/> 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 2337ee3074..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,7 +19,7 @@ <layout_panel name="my_panel"> <text name="user_text" value="Meu avatar:"/> </layout_panel> - <layout_panel name="leave_call_panel"> + <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"/> 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_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml index a3e62924ec..3400578d9a 100644 --- a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml @@ -1,8 +1,9 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> -<menu name="menu_gear_default"> +<toggleable_menu name="menu_gear_default"> <menu_item_call label="Nova janela de inventário" name="new_window"/> - <menu_item_call label="Ordenar por nome" name="sort_by_name"/> - <menu_item_call label="Ordenar por mais recente" name="sort_by_recent"/> + <menu_item_check label="Ordenar por nome" name="sort_by_name"/> + <menu_item_check label="Ordenar por mais recente" name="sort_by_recent"/> + <menu_item_check label="Pastas do sistema no topo" name="sort_system_folders_to_top"/> <menu_item_call label="Mostrar filtros" name="show_filters"/> <menu_item_call label="Restabelecer filtros" name="reset_filters"/> <menu_item_call label="Fechar todas as pastas" name="close_folders"/> @@ -12,4 +13,4 @@ <menu_item_call label="Encontrar original" name="Find Original"/> <menu_item_call label="Encontrar todos os links" name="Find All Links"/> <menu_item_call label="Esvaziar lixeira" name="empty_trash"/> -</menu> +</toggleable_menu> diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml index 90adb3fdb5..95c37c53ca 100644 --- a/indra/newview/skins/default/xui/pt/menu_viewer.xml +++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml @@ -12,6 +12,12 @@ <menu_item_check label="Meu inventário" name="ShowSidetrayInventory"/> <menu_item_check label="Meus gestos" name="Gestures"/> <menu_item_check label="Minha voz" name="ShowVoice"/> + <menu label="Movimentos" name="Movement"> + <menu_item_call label="Sentar" name="Sit Down Here"/> + <menu_item_check label="Voar" name="Fly"/> + <menu_item_check label="Correr sempre" name="Always Run"/> + <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/> + </menu> <menu label="Meu status" name="Status"> <menu_item_call label="Ausente" name="Set Away"/> <menu_item_call label="Ocupado" name="Set Busy"/> @@ -47,6 +53,7 @@ <menu_item_check label="Proprietários" name="Land Owners"/> <menu_item_check label="Coordenadas" name="Coordinates"/> <menu_item_check label="Propriedades do lote" name="Parcel Properties"/> + <menu_item_check label="Menu avançado" name="Show Advanced Menu"/> </menu> <menu_item_call label="Teletransportar para meu inÃcio" name="Teleport Home"/> <menu_item_call label="Definir como InÃcio" name="Set Home to Here"/> @@ -85,6 +92,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 +106,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,9 +127,9 @@ <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"/> <menu_item_call label="Recarregar texturas" name="Rebake Texture"/> <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/> <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/> @@ -174,8 +183,7 @@ <menu_item_check label="Busca" name="Search"/> <menu_item_call label="Soltar objeto" name="Release Keys"/> <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/> - <menu_item_check label="Correr sempre" name="Always Run"/> - <menu_item_check label="Voar" name="Fly"/> + <menu_item_check label="Mostrar menu avançado - atalho antigo" name="Show Advanced Menu - legacy shortcut"/> <menu_item_call label="Fechar janela" name="Close Window"/> <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/> <menu_item_call label="Gravar fotos no HD" name="Snapshot to Disk"/> @@ -193,7 +201,6 @@ <menu_item_call label="Mais zoom" name="Zoom In"/> <menu_item_call label="Zoom padrão" name="Zoom Default"/> <menu_item_call label="Menos zoom" name="Zoom Out"/> - <menu_item_check label="Exibir menu avançado" name="Show Advanced Menu"/> </menu> <menu_item_call label="Mostrar configurações de depuração" name="Debug Settings"/> <menu_item_check label="Show Develop Menu" name="Debug Mode"/> @@ -264,18 +271,16 @@ <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="Teletransportar c/ dois cliques" name="DoubleClick Teleport"/> + <menu_item_check label="Console de depuração de região" name="Region Debug Console"/> <menu_item_check label="Debug Clicks" name="Debug Clicks"/> <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/> </menu> <menu label="XUI" name="XUI"> <menu_item_call label="Recarregar cores" name="Reload Color Settings"/> <menu_item_call label="Teste de fonte" name="Show Font Test"/> - <menu_item_call label="Carregar de XML" name="Load from XML"/> - <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"> @@ -299,9 +304,9 @@ </menu> <menu_item_check label="Texturas HTTP" name="HTTP Textures"/> <menu_item_check label="Console Window on next Run" name="Console Window"/> - <menu_item_check label="Mostrar menu admin" name="View Admin Options"/> <menu_item_call label="Request Admin Status" name="Request Admin Options"/> <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/> + <menu_item_check label="Mostrar menu admin" name="View Admin Options"/> </menu> <menu label="Admin" name="Admin"> <menu label="Object"> diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml index 9a7c9579e2..dc38b740aa 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. @@ -385,6 +385,9 @@ Nota: Este procedimento limpa o cache. <notification name="ChangeSkin"> Reinicie o [APP_NAME] para ativar a pele nova. </notification> + <notification name="ChangeLanguage"> + Reinicie o [APP_NAME] para exibir o idioma selecionado. + </notification> <notification name="GoToAuctionPage"> Ir para a página do [SECOND_LIFE] para ver os detalhes do leilão ou fazer um lance? <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir para a página"/> @@ -594,6 +597,10 @@ Esperada [VALIDS] Não pode ser encontrado bloco de dados no cabeçalho WAV: [FILE] </notification> + <notification name="SoundFileInvalidChunkSize"> + Pedaço de arquivo WAV de tamanho errado: +[FILE] + </notification> <notification name="SoundFileInvalidTooLong"> Arquivo de áudio é muito longo (no máximo 10 segundos): [FILE] @@ -913,12 +920,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 +963,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 +1079,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"> @@ -1321,6 +1323,16 @@ Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e Salvar na pasta Aplicativos? <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/> </notification> + <notification name="FailedUpdateInstall"> + Ocorreu um erro de atualização do visualizador. +Baixe e instale a versão mais recente do visualizador em +http://secondlife.com/download. + <usetemplate name="okbutton" yestext="OK"/> + </notification> + <notification name="DownloadBackground"> + Foi baixada uma nova versão do [APP_NAME] +A nova versão será exibida quando o [APP_NAME] for reiniciado. + </notification> <notification name="DeedObjectToGroup"> Delegar este objeto causará ao grupo: * Receber os L$ pagos ao objeto @@ -1450,6 +1462,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 +2070,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 +2140,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 +2209,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,7 +2221,7 @@ Selecione o residente da lista e clique em 'MI' na parte de baixo do p [NAME] [DATE] <form name="form"> - <button name="Details" text="Descrição"/> + <button name="Details" text="Detalhes"/> <button name="Cancel" text="Cancelar"/> </form> </notification> @@ -2203,7 +2255,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. @@ -2327,7 +2379,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"/> @@ -2392,9 +2444,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"/> @@ -2413,8 +2465,8 @@ 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. -Ele colocará um item de inventário, para você possa contatá-lo facilmente. + [NOME] está te oferecendo um cartão de visita. +Ele será um item no seu inventário, para você possa contatá-lo facilmente. <form name="form"> <button name="Accept" text="Aceitar"/> <button name="Decline" text="Recusar"/> @@ -2429,11 +2481,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"/> @@ -2449,10 +2501,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"/> @@ -2460,12 +2512,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"/> @@ -2473,14 +2525,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"/> @@ -2517,13 +2569,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]. @@ -2750,6 +2802,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_edit_gloves.xml b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml index a94716e659..281823d641 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_gloves_panel"> <panel name="avatar_gloves_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml index f555bd9ac7..5798325bd7 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_jacket_panel"> <panel name="avatar_jacket_color_panel"> - <texture_picker label="Tecido de cima" name="Upper Fabric" tool_tip="Selecionar imagem"/> - <texture_picker label="Tecido de baixo" name="Lower Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura superior" name="Upper Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura inferior" name="Lower Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml index 67c300cc8d..18568a81a8 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_pants_panel"> <panel name="avatar_pants_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_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_edit_shirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml index fb7c4c080c..c7e2b1e64c 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shirt_panel"> <panel name="avatar_shirt_color_panel"> - <texture_picker label="tecido" name="Fabric" tool_tip="Clique para escolher uma foto"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Clique para escolher uma foto"/> <color_swatch label="Cor/Matiz" name="Color/Tint" tool_tip="Clique para abrir o selecionador de cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml index d1d30cf46e..08465d09e7 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_shoes_panel"> <panel name="avatar_shoes_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml index b67cd53a83..275efba6e6 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_skirt_panel"> <panel name="avatar_skirt_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml index 405568abeb..6f4779d855 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_socks_panel"> <panel name="avatar_socks_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml index f858dc0495..c383471851 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_underpants_panel"> <panel name="avatar_underpants_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_panel"> diff --git a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml index 9c18fc1d6c..0bf510c67f 100644 --- a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml +++ b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel name="edit_undershirt_panel"> <panel name="avatar_undershirt_color_panel"> - <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/> + <texture_picker label="Textura" name="Fabric" tool_tip="Selecionar imagem"/> <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/> </panel> <panel name="accordion_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_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_notify_textbox.xml b/indra/newview/skins/default/xui/pt/panel_notify_textbox.xml new file mode 100644 index 0000000000..d9614fe76b --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_notify_textbox.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="instant_message" name="panel_notify_textbox"> + <string name="message_max_lines_count" value="7"/> + <panel label="info_panel" name="info_panel"> + <text_editor name="message" value="mensagem"/> + parse_urls="false" + <button label="Enviar" name="btn_submit"/> + </panel> + <panel label="control_panel" name="control_panel"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml index e02e3998eb..f1632729a9 100644 --- a/indra/newview/skins/default/xui/pt/panel_people.xml +++ b/indra/newview/skins/default/xui/pt/panel_people.xml @@ -22,7 +22,7 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <tab_container name="tabs"> <panel label="PROXIMIDADE" name="nearby_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="nearby_view_sort_btn" tool_tip="Opções"/> + <menu_button name="nearby_view_sort_btn" tool_tip="Opções"/> <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> </panel> </panel> @@ -34,27 +34,27 @@ Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa- <panel label="bottom_panel" name="bottom_panel"> <layout_stack name="bottom_panel"> <layout_panel name="options_gear_btn_panel"> - <button name="friends_viewsort_btn" tool_tip="Mostrar opções adicionais"/> + <menu_button name="friends_viewsort_btn" tool_tip="Mostrar opções adicionais"/> </layout_panel> <layout_panel name="add_btn_panel"> <button name="add_btn" tool_tip="Oferecer amizade para um residente"/> </layout_panel> <layout_panel name="trash_btn_panel"> - <dnd_button name="trash_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/> + <dnd_button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/> </layout_panel> </layout_stack> </panel> </panel> <panel label="MEUS GRUPOS" name="groups_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="groups_viewsort_btn" tool_tip="Opções"/> + <menu_button name="groups_viewsort_btn" tool_tip="Opções"/> <button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/> <button name="activate_btn" tool_tip="Ativar o grupo selecionado"/> </panel> </panel> <panel label="RECENTE" name="recent_panel"> <panel label="bottom_panel" name="bottom_panel"> - <button name="recent_viewsort_btn" tool_tip="Opções"/> + <menu_button name="recent_viewsort_btn" tool_tip="Opções"/> <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/> </panel> </panel> 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_places.xml b/indra/newview/skins/default/xui/pt/panel_places.xml index 2e443bc057..828ef3e469 100644 --- a/indra/newview/skins/default/xui/pt/panel_places.xml +++ b/indra/newview/skins/default/xui/pt/panel_places.xml @@ -21,7 +21,7 @@ <button label="Editar" name="edit_btn" tool_tip="Editar dados do marco"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Mostrar opções adicionais"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Mostrar opções adicionais"/> </layout_panel> </layout_stack> <layout_stack name="bottom_bar_ls3"> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml index 13cb8a444e..bbe7e15ba2 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml @@ -3,35 +3,16 @@ <panel.string name="aspect_ratio_text"> [NUM]:[DEN] </panel.string> - <panel.string name="middle_mouse"> - Botão do meio do mouse - </panel.string> - <slider label="Ângulo de visão" name="camera_fov"/> - <slider label="Distância" name="camera_offset_scale"/> - <text name="heading2"> - Posicionamento automático da: - </text> - <check_box label="Construção/Edição" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/> - <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/> - <check_box initial_value="verdadeiro" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar posicionamento automático da câmera na barra lateral"/> - <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/> - <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/> - <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/> - <check_box label="Mover os lábios do avatar ao falar" name="enable_lip_sync"/> - <check_box label="Balão de bate-papo" name="bubble_text_chat"/> - <slider label="Opacidade" name="bubble_chat_opacity"/> - <color_swatch name="background" tool_tip="Cor do balão de bate-papo"/> <text name="UI Size:"> - Interface + Interface: </text> <check_box label="Mostrar erros de script" name="show_script_errors"/> <radio_group name="show_location"> <radio_item label="Bate-papo local" name="0"/> <radio_item label="Janelas separadas" name="1"/> </radio_group> - <check_box label="Tecla liga/desliga da minha voz:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Quando em modo de alternância, o microfone só transmite sua voz quando o botão estiver pressionado."/> - <line_editor label="Botão apertar e falar" name="modifier_combo"/> - <button label="Definir tecla" name="set_voice_hotkey_button"/> - <button label="Botão do meio do mouse" name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/> - <button label="Outros dispositivos" name="joystick_setup_button"/> + <check_box label="Permitir vários visualizadores" name="allow_multiple_viewer_check"/> + <check_box label="Mostrar grade selecionada ao entrar" name="show_grid_selection_check"/> + <check_box label="Exibir menu avançado" name="show_advanced_menu_check"/> + <check_box label="Exibir menu desenvolvedor" name="show_develop_menu_check"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index ea15b90628..368c474ee9 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -8,44 +8,10 @@ <radio_item label="Médio" name="radio2" value="1"/> <radio_item label="Grande" name="radio3" value="2"/> </radio_group> - <text name="font_colors"> - Cor da fonte: - </text> - <color_swatch label="Você" name="user"/> - <text name="text_box1"> - Eu - </text> - <color_swatch label="Outros" name="agent"/> - <text name="text_box2"> - Outros - </text> - <color_swatch label="MI" name="im"/> - <text name="text_box3"> - MI - </text> - <color_swatch label="Sistema" name="system"/> - <text name="text_box4"> - Sistema - </text> - <color_swatch label="Erros" name="script_error"/> - <text name="text_box5"> - Erros - </text> - <color_swatch label="Objetos" name="objects"/> - <text name="text_box6"> - Objetos - </text> - <color_swatch label="Dono" name="owner"/> - <text name="text_box7"> - Dono - </text> - <color_swatch label="URLs" name="links"/> - <text name="text_box9"> - URLs - </text> <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/> <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/> <check_box label="Ativar MIs e bate-papos de texto simples" name="plain_text_chat_history"/> + <check_box label="Balão de bate-papo" name="bubble_text_chat"/> <text name="show_ims_in_label"> Mostrar MIs em: </text> @@ -56,6 +22,13 @@ <radio_item label="Janelas separadas" name="radio" value="0"/> <radio_item label="Guias" name="radio2" value="1"/> </radio_group> + <text name="disable_toast_label"> + Ativar pop-ups de novos bate-papos: + </text> + <check_box label="Bate-papo de grupo" name="EnableGroupChatPopups" tool_tip="Exibir pop-up de bate-papos novos de grupos"/> + <check_box label="Bate-papos de MI" name="EnableIMChatPopups" tool_tip="Exibir pop-up de mensagens instantâneas novas"/> + <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_lifetime"/> + <spinner label="Transição de avisos de bate-papos por perto:" name="nearby_toasts_fadingtime"/> <check_box label="Traduzir bate-papo automaticamente (via Google)" name="translate_chat_checkbox"/> <text name="translate_language_text"> Traduzir bate-papo para: diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml new file mode 100644 index 0000000000..3ca9da06c9 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_preferences_colors.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Cores" name="colors_panel"> + <text name="effects_color_textbox"> + Meus efeitos (raio de seleção): + </text> + <color_swatch name="effect_color_swatch" tool_tip="Selecionar a cor"/> + <text name="font_colors"> + Cores no bate-papo: + </text> + <text name="text_box1"> + Eu + </text> + <text name="text_box2"> + Outros + </text> + <text name="text_box3"> + Objetos + </text> + <text name="text_box4"> + Sistema + </text> + <text name="text_box5"> + Erros + </text> + <text name="text_box7"> + Proprietário + </text> + <text name="text_box9"> + URLs + </text> + <text name="bubble_chat"> + Fundo do balão: + </text> + <color_swatch name="background" tool_tip="Escolha a cor do balão de bate-papo"/> + <slider label="Opacidade:" name="bubble_chat_opacity"/> + <text name="floater_opacity"> + Opacidade: + </text> + <slider label="Ativo:" name="active"/> + <slider label="Inativo:" name="inactive"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml index aefee32d44..deeb917e82 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml @@ -44,16 +44,22 @@ <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"/> - <text name="effects_color_textbox"> - Meus efeitos: + <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"/> + <check_box label="Ver nomes de tela" name="display_names_check" tool_tip="Usar nome de tela no bate-papo, MI, etc."/> + <check_box label="Exibir dicas da interface" name="viewer_hints_check"/> + <text name="inworld_typing_rg_label"> + Teclas de letras: </text> + <radio_group name="inworld_typing_preference"> + <radio_item label="Inicia o bate-papo local" name="radio_start_chat" value="1"/> + <radio_item label="Afeta o movimento (ex.: WASD)" name="radio_move" value="0"/> + </radio_group> <text name="title_afk_text"> Entrar no modo ausente em: </text> - <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/> <combo_box label="Entrar no modo ausente em:" name="afk"> <combo_box.item label="2 minutos" name="item0"/> <combo_box.item label="5 minutos" name="item1"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml index 912eea13b8..c2efbf0300 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml @@ -26,6 +26,7 @@ rápido <text name="ShadersText"> Sombreadores: </text> + <check_box initial_value="verdadeiro" label="Ãgua transparente" name="TransparentWater"/> <check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/> <check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vÃdeo a travem."/> <check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_move.xml b/indra/newview/skins/default/xui/pt/panel_preferences_move.xml new file mode 100644 index 0000000000..1a4c271827 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/panel_preferences_move.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<panel label="Movimentar" name="move_panel"> + <slider label="Ângulo de visão" name="camera_fov"/> + <slider label="Distância" name="camera_offset_scale"/> + <text name="heading2"> + Posicionamento automático: + </text> + <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/> + <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/> + <check_box initial_value="verdadeiro" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar posicionamento automático da câmera na barra lateral"/> + <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/> + <text name=" Mouse Sensitivity"> + Sensibilidade do mouse: + </text> + <check_box label="Inverter" name="invert_mouse"/> + <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/> + <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/> + <check_box label="Dar dois cliques para:" name="double_click_chkbox"/> + <radio_group name="double_click_action"> + <radio_item label="Teletransportar" name="radio_teleport"/> + <radio_item label="Piloto automático" name="radio_autopilot"/> + </radio_group> + <button label="Outros dispositivos" name="joystick_setup_button"/> +</panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml index ba4ebdb9bf..5545dcda38 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml @@ -10,17 +10,20 @@ <check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/> <check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/> <check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/> - <check_box label="Aceitar cookies" name="cookies_enabled"/> <text name="Logs:"> - Logs: + Registro de bate-papos: </text> <check_box label="Salvar logs de bate- papo das proximidades no meu computador" name="log_nearby_chat"/> <check_box label="Salvar logs de MI no meu computador" name="log_instant_messages"/> - <check_box label="Adicionar timestamp" name="show_timestamps_check_im"/> + <check_box label="Anotar horas de cada linha de bate-papo" name="show_timestamps_check_im"/> + <check_box label="Anotar a data ao arquivo." name="logfile_name_datestamp"/> <text name="log_path_desc"> Localização dos logs: </text> <line_editor left="278" name="log_path_string" right="-20"/> <button label="Procurar" label_selected="Procurar" name="log_path_button" width="120"/> <button label="Lista de bloqueados" name="block_list"/> + <text name="block_list_label"> + (Pessoas ou objetos que você bloqueou) + </text> </panel> 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..0c6fb68140 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml @@ -1,13 +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> - <text name=" Mouse Sensitivity"> - Sensibilidade do mouse - </text> - <check_box label="Inverter" name="invert_mouse"/> <text name="Network:"> Rede: </text> @@ -40,10 +32,12 @@ <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: </text> <line_editor name="web_proxy_editor" tool_tip="O nome ou endereço IP do proxy da sua preferência"/> <spinner label="Porta:" name="web_proxy_port"/> + <check_box initial_value="verdadeiro" label="Baixar e instalar atualizações [APP_NAME] automaticamente" name="updater_service_active"/> </panel> diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml index 5be07f4d1f..60f51c33e5 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml @@ -1,5 +1,8 @@ <?xml version="1.0" encoding="utf-8" standalone="yes"?> <panel label="Sons" name="Preference Media panel"> + <panel.string name="middle_mouse"> + Botão do meio do mouse + </panel.string> <slider label="Volume principal" name="System Volume"/> <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/> <slider label="Botões" name="UI Volume"/> @@ -23,6 +26,11 @@ <radio_item label="Posição de câmera" name="0"/> <radio_item label="Posição do avatar" name="1"/> </radio_group> + <check_box label="Mover os lábios do avatar quando estiver falando" name="enable_lip_sync"/> + <check_box label="Tecla liga/desliga da minha voz:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Fora do modo de alternância, o microfone só transmite sua voz enquanto o botão estiver pressionado."/> + <line_editor label="Botão apertar e falar" name="modifier_combo"/> + <button label="Definir chave" name="set_voice_hotkey_button"/> + <button name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/> <button label="Controles de entrada/saÃda" name="device_settings_btn" width="180"/> <panel label="Configuração dos dispositivo" name="device_settings_panel"> <panel.string name="default_text"> diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml index e4200ae5da..f984ed6a7b 100644 --- a/indra/newview/skins/default/xui/pt/panel_profile.xml +++ b/indra/newview/skins/default/xui/pt/panel_profile.xml @@ -53,7 +53,7 @@ <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/> </layout_panel> <layout_panel name="overflow_btn_lp"> - <button label="â–¼" name="overflow_btn" tool_tip="Pagar ou compartilhar inventário com o residente"/> + <menu_button label="â–¼" name="overflow_btn" tool_tip="Pagar ou compartilhar inventário com o residente"/> </layout_panel> </layout_stack> </layout_panel> 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_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml index 6f022945c2..563f4fe054 100644 --- a/indra/newview/skins/default/xui/pt/panel_script_ed.xml +++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml @@ -15,11 +15,6 @@ <panel.string name="Title"> Script: [NOME] </panel.string> - <text_editor name="Script Editor"> - Carregando... - </text_editor> - <button label="Salvar" label_selected="Salvar" name="Save_btn"/> - <combo_box label="Inserir..." name="Insert..."/> <menu_bar name="script_menu"> <menu label="Arquivo" name="File"> <menu_item_call label="Salvar" name="Save"/> @@ -40,4 +35,10 @@ <menu_item_call label="ajuda palavra- chave..." name="Keyword Help..."/> </menu> </menu_bar> + <text_editor name="Script Editor"> + Carregando... + </text_editor> + <combo_box label="Inserir..." name="Insert..."/> + <button label="Salvar" label_selected="Salvar" name="Save_btn"/> + <button label="Editar..." name="Edit_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 800ad479fc..ce2c2ddaa1 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> @@ -1731,11 +1740,8 @@ <string name="InvOfferGaveYou"> deu a você </string> - <string name="InvOfferYouDecline"> - Você recusa - </string> - <string name="InvOfferFrom"> - de + <string name="InvOfferDecline"> + Você recusou um(a) [DESC] de <nolink>[NAME]</nolink>. </string> <string name="GroupMoneyTotal"> Total @@ -3471,7 +3477,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 +3546,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 +3563,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 +3584,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/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp index db50b89620..309e9e9ee3 100644 --- a/indra/newview/tests/lllogininstance_test.cpp +++ b/indra/newview/tests/lllogininstance_test.cpp @@ -48,6 +48,9 @@ const std::string VIEWERLOGIN_GRIDLABEL("viewerlogin_grid"); const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno"); +const std::string VIEWERLOGIN_CHANNEL("invalid_channel"); +const std::string VIEWERLOGIN_VERSION_CHANNEL("invalid_version"); + // Link seams. //----------------------------------------------------------------------------- @@ -160,7 +163,6 @@ std::string LLGridManager::getAppSLURLBase(const std::string& grid_name) //----------------------------------------------------------------------------- #include "../llviewercontrol.h" LLControlGroup gSavedSettings("Global"); -std::string gCurrentVersion = "invalid_version"; LLControlGroup::LLControlGroup(const std::string& name) : LLInstanceTracker<LLControlGroup, std::string>(name){} @@ -177,6 +179,10 @@ BOOL LLControlGroup::declareString(const std::string& name, const std::string &i #include "lluicolortable.h" void LLUIColorTable::saveUserSettings(void)const {} +//----------------------------------------------------------------------------- +#include "../llversioninfo.h" +const std::string &LLVersionInfo::getChannelAndVersion() { return VIEWERLOGIN_VERSION_CHANNEL; } +const std::string &LLVersionInfo::getChannel() { return VIEWERLOGIN_CHANNEL; } //----------------------------------------------------------------------------- #include "llnotifications.h" @@ -290,7 +296,6 @@ namespace tut gSavedSettings.declareBOOL("UseDebugMenus", FALSE, "", FALSE); gSavedSettings.declareBOOL("ForceMandatoryUpdate", FALSE, "", FALSE); gSavedSettings.declareString("ClientSettingsFile", "test_settings.xml", "", FALSE); - gSavedSettings.declareString("VersionChannelName", "test_version_string", "", FALSE); gSavedSettings.declareString("NextLoginLocation", "", "", FALSE); gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE); diff --git a/indra/newview/tests/llremoteparcelrequest_test.cpp b/indra/newview/tests/llremoteparcelrequest_test.cpp new file mode 100644 index 0000000000..a6c1f69c82 --- /dev/null +++ b/indra/newview/tests/llremoteparcelrequest_test.cpp @@ -0,0 +1,134 @@ +/**
+ * @file llremoteparcelrequest_test.cpp
+ * @author Brad Kittenbrink <brad@lindenlab.com>
+ *
+ * $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 "../test/lltut.h"
+
+#include "../llremoteparcelrequest.h"
+
+#include "../llagent.h"
+#include "message.h"
+
+namespace {
+ LLControlGroup s_saved_settings("dummy_settings");
+ const LLUUID TEST_PARCEL_ID("11111111-1111-1111-1111-111111111111");
+}
+
+LLCurl::Responder::Responder() { }
+LLCurl::Responder::~Responder() { }
+void LLCurl::Responder::error(U32,std::string const &) { }
+void LLCurl::Responder::result(LLSD const &) { }
+void LLCurl::Responder::errorWithContent(U32 status,std::string const &,LLSD const &) { }
+void LLCurl::Responder::completedRaw(U32 status, std::string const &, LLChannelDescriptors const &,boost::shared_ptr<LLBufferArray> const &) { }
+void LLCurl::Responder::completed(U32 status, std::string const &, LLSD const &) { }
+void LLCurl::Responder::completedHeader(U32 status, std::string const &, LLSD const &) { }
+void LLMessageSystem::getF32(char const *,char const *,F32 &,S32) { }
+void LLMessageSystem::getU8(char const *,char const *,U8 &,S32) { }
+void LLMessageSystem::getS32(char const *,char const *,S32 &,S32) { }
+void LLMessageSystem::getString(char const *,char const *, std::string &,S32) { }
+void LLMessageSystem::getUUID(char const *,char const *, LLUUID & out_id,S32)
+{
+ out_id = TEST_PARCEL_ID;
+}
+void LLMessageSystem::nextBlock(char const *) { }
+void LLMessageSystem::addUUID(char const *,LLUUID const &) { }
+void LLMessageSystem::addUUIDFast(char const *,LLUUID const &) { }
+void LLMessageSystem::nextBlockFast(char const *) { }
+void LLMessageSystem::newMessage(char const *) { }
+LLMessageSystem * gMessageSystem;
+char * _PREHASH_AgentID;
+char * _PREHASH_AgentData;
+LLAgent gAgent;
+LLAgent::LLAgent() : mAgentAccess(s_saved_settings) { }
+LLAgent::~LLAgent() { }
+void LLAgent::sendReliableMessage(void) { }
+LLUUID gAgentSessionID;
+LLUUID gAgentID;
+LLUIColor::LLUIColor(void) { }
+LLAgentAccess::LLAgentAccess(LLControlGroup & settings) : mSavedSettings(settings) { }
+LLControlGroup::LLControlGroup(std::string const & name) : LLInstanceTracker<LLControlGroup, std::string>(name) { }
+LLControlGroup::~LLControlGroup(void) { }
+
+namespace tut
+{
+ struct TestObserver : public LLRemoteParcelInfoObserver {
+ TestObserver() : mProcessed(false) { }
+
+ virtual void processParcelInfo(const LLParcelData& parcel_data)
+ {
+ mProcessed = true;
+ }
+
+ virtual void setParcelID(const LLUUID& parcel_id) { }
+
+ virtual void setErrorStatus(U32 status, const std::string& reason) { }
+
+ bool mProcessed;
+ };
+
+ struct RemoteParcelRequestData
+ {
+ RemoteParcelRequestData()
+ {
+ }
+ };
+
+ typedef test_group<RemoteParcelRequestData> remoteparcelrequest_t;
+ typedef remoteparcelrequest_t::object remoteparcelrequest_object_t;
+ tut::remoteparcelrequest_t tut_remoteparcelrequest("LLRemoteParcelRequest");
+
+ template<> template<>
+ void remoteparcelrequest_object_t::test<1>()
+ {
+ set_test_name("observer pointer");
+
+ boost::scoped_ptr<TestObserver> observer(new TestObserver());
+
+ LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance();
+ processor.addObserver(LLUUID(TEST_PARCEL_ID), observer.get());
+
+ processor.processParcelInfoReply(gMessageSystem, NULL);
+
+ ensure(observer->mProcessed);
+ }
+
+ template<> template<>
+ void remoteparcelrequest_object_t::test<2>()
+ {
+ set_test_name("CHOP-220: dangling observer pointer");
+
+ LLRemoteParcelInfoObserver * observer = new TestObserver();
+
+ LLRemoteParcelInfoProcessor & processor = LLRemoteParcelInfoProcessor::instance();
+ processor.addObserver(LLUUID(TEST_PARCEL_ID), observer);
+
+ delete observer;
+ observer = NULL;
+
+ processor.processParcelInfoReply(gMessageSystem, NULL);
+ }
+}
diff --git a/indra/newview/tests/llversioninfo_test.cpp b/indra/newview/tests/llversioninfo_test.cpp new file mode 100644 index 0000000000..398d8f16ed --- /dev/null +++ b/indra/newview/tests/llversioninfo_test.cpp @@ -0,0 +1,114 @@ +/** + * @file llversioninfo_test.cpp + * + * $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 "../test/lltut.h" + +#include "../llversioninfo.h" +#include "llversionviewer.h" + +namespace tut +{ + struct versioninfo + { + versioninfo() + : mResetChannel("Reset Channel") + { + std::ostringstream stream; + stream << LL_VERSION_MAJOR << "." + << LL_VERSION_MINOR << "." + << LL_VERSION_PATCH << "." + << LL_VERSION_BUILD; + mVersion = stream.str(); + stream.str(""); + + stream << LL_VERSION_MAJOR << "." + << LL_VERSION_MINOR << "." + << LL_VERSION_PATCH; + mShortVersion = stream.str(); + stream.str(""); + + stream << LL_CHANNEL + << " " + << mVersion; + mVersionAndChannel = stream.str(); + stream.str(""); + + stream << mResetChannel + << " " + << mVersion; + mResetVersionAndChannel = stream.str(); + } + std::string mResetChannel; + std::string mVersion; + std::string mShortVersion; + std::string mVersionAndChannel; + std::string mResetVersionAndChannel; + }; + + typedef test_group<versioninfo> versioninfo_t; + typedef versioninfo_t::object versioninfo_object_t; + tut::versioninfo_t tut_versioninfo("LLVersionInfo"); + + template<> template<> + void versioninfo_object_t::test<1>() + { + ensure_equals("Major version", + LLVersionInfo::getMajor(), + LL_VERSION_MAJOR); + ensure_equals("Minor version", + LLVersionInfo::getMinor(), + LL_VERSION_MINOR); + ensure_equals("Patch version", + LLVersionInfo::getPatch(), + LL_VERSION_PATCH); + ensure_equals("Build version", + LLVersionInfo::getBuild(), + LL_VERSION_BUILD); + ensure_equals("Channel version", + LLVersionInfo::getChannel(), + LL_CHANNEL); + + ensure_equals("Version String", + LLVersionInfo::getVersion(), + mVersion); + ensure_equals("Short Version String", + LLVersionInfo::getShortVersion(), + mShortVersion); + ensure_equals("Version and channel String", + LLVersionInfo::getChannelAndVersion(), + mVersionAndChannel); + + LLVersionInfo::resetChannel(mResetChannel); + ensure_equals("Reset channel version", + LLVersionInfo::getChannel(), + mResetChannel); + + ensure_equals("Reset Version and channel String", + LLVersionInfo::getChannelAndVersion(), + mResetVersionAndChannel); + } +} diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp index a0f1d1c3c3..b425b50c8b 100644 --- a/indra/newview/tests/llviewerhelputil_test.cpp +++ b/indra/newview/tests/llviewerhelputil_test.cpp @@ -72,16 +72,13 @@ static void substitute_string(std::string &input, const std::string &search, con } } -class LLAgent -{ -public: - LLAgent() {} - ~LLAgent() {} -#ifdef __GNUC__ - __attribute__ ((noinline)) -#endif - bool isGodlike() const { return FALSE; } -}; +#include "../llagent.h" +LLAgent::LLAgent() : mAgentAccess(gSavedSettings) { } +LLAgent::~LLAgent() { } +bool LLAgent::isGodlike() const { return FALSE; } +LLAgentAccess::LLAgentAccess(LLControlGroup& settings) : mSavedSettings(settings) { } +LLUIColor::LLUIColor() {} + LLAgent gAgent; std::string LLWeb::expandURLSubstitutions(const std::string &url, diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index e637c43674..9fc76a09c4 100644 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -247,6 +247,7 @@ class WindowsManifest(ViewerManifest): self.disable_manifest_check() + self.path(src="../viewer_components/updater/scripts/windows/update_install.bat", dst="update_install.bat") # Get shared libs from the shared libs staging directory if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), dst=""): @@ -586,6 +587,8 @@ class DarwinManifest(ViewerManifest): # copy additional libs in <bundle>/Contents/MacOS/ self.path("../../libraries/universal-darwin/lib_release/libndofdev.dylib", dst="MacOS/libndofdev.dylib") + self.path("../viewer_components/updater/scripts/darwin/update_install", "MacOS/update_install") + # most everything goes in the Resources directory if self.prefix(src="", dst="Resources"): super(DarwinManifest, self).construct() @@ -661,8 +664,11 @@ class DarwinManifest(ViewerManifest): ): self.path(os.path.join(libdir, libfile), libfile) - #libfmodwrapper.dylib - self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib") + try: + # FMOD for sound + self.path(self.args['configuration'] + "/libfmodwrapper.dylib", "libfmodwrapper.dylib") + except: + print "Skipping FMOD - not found" # our apps self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app") @@ -723,6 +729,12 @@ class DarwinManifest(ViewerManifest): { 'viewer_binary' : self.dst_path_of('Contents/MacOS/Second Life')}) + def copy_finish(self): + # Force executable permissions to be set for scripts + # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802 + for script in 'Contents/MacOS/update_install',: + self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) + def package_finish(self): channel_standin = 'Second Life Viewer 2' # hah, our default channel is not usable on its own if not self.default_channel(): @@ -758,6 +770,11 @@ class DarwinManifest(ViewerManifest): devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip() volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip() + if devfile != '/dev/disk1': + # adding more debugging info based upon nat's hunches to the + # logs to help track down 'SetFile -a V' failures -brad + print "WARNING: 'SetFile -a V' command below is probably gonna fail" + # Copy everything in to the mounted .dmg if self.default_channel() and not self.default_grid(): @@ -847,6 +864,36 @@ class LinuxManifest(ViewerManifest): # Create an appropriate gridargs.dat for this package, denoting required grid. self.put_in_file(self.flags_list(), 'etc/gridargs.dat') + self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin") + self.path("../linux_crash_logger/linux-crash-logger","bin/linux-crash-logger.bin") + self.path("../linux_updater/linux-updater", "bin/linux-updater.bin") + self.path("../llplugin/slplugin/SLPlugin", "bin/SLPlugin") + + if self.prefix("res-sdl"): + self.path("*") + # recurse + self.end_prefix("res-sdl") + + self.path("../viewer_components/updater/scripts/linux/update_install", "bin/update_install") + + # plugins + if self.prefix(src="", dst="bin/llplugin"): + self.path("../media_plugins/webkit/libmedia_plugin_webkit.so", "libmedia_plugin_webkit.so") + self.path("../media_plugins/gstreamer010/libmedia_plugin_gstreamer010.so", "libmedia_plugin_gstreamer.so") + self.end_prefix("bin/llplugin") + + try: + self.path("../llcommon/libllcommon.so", "lib/libllcommon.so") + except: + print "Skipping llcommon.so (assuming llcommon was linked statically)" + + self.path("featuretable_linux.txt") + + def copy_finish(self): + # Force executable permissions to be set for scripts + # see CHOP-223 and http://mercurial.selenic.com/bts/issue1802 + for script in 'secondlife', 'bin/update_install': + self.run_command("chmod +x %r" % os.path.join(self.get_dst_prefix(), script)) def package_finish(self): if 'installer_name' in self.args: @@ -861,6 +908,10 @@ class LinuxManifest(ViewerManifest): else: installer_name += '_' + self.channel_oneword().upper() + if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): + print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" + self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure + # Fix access permissions self.run_command(""" find %(dst)s -type d | xargs --no-run-if-empty chmod 755; @@ -886,6 +937,9 @@ class LinuxManifest(ViewerManifest): 'dir': self.get_build_prefix(), 'inst_name': installer_name, 'inst_path':self.build_path_of(installer_name)}) + else: + print "Skipping %s.tar.bz2 for non-Release build (%s)" % \ + (installer_name, self.args['buildtype']) finally: self.run_command("mv %(inst)s %(dst)s" % { 'dst': self.get_dst_prefix(), @@ -897,6 +951,12 @@ class Linux_i686Manifest(LinuxManifest): # install either the libllkdu we just built, or a prebuilt one, in # decreasing order of preference. for linux package, this goes to bin/ + try: + self.path(self.find_existing_file('../llkdu/libllkdu.so', + '../../libraries/i686-linux/lib_release_client/libllkdu.so'), + dst='bin/libllkdu.so') + except: + print "Skipping libllkdu.so - not found" for lib, destdir in ("llkdu", "bin"), ("llcommon", "lib"): libfile = "lib%s.so" % lib try: @@ -934,9 +994,11 @@ class Linux_i686Manifest(LinuxManifest): self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0") self.path("libdb-4.2.so") self.path("libcrypto.so.0.9.7") + self.path("libuuid.so.1") self.path("libexpat.so.1") self.path("libglod.so") self.path("libssl.so.0.9.7") + self.path("libuuid.so.1") self.path("libSDL-1.2.so.0") self.path("libELFIO.so") self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3") @@ -955,7 +1017,7 @@ class Linux_i686Manifest(LinuxManifest): self.path("libfmod-3.75.so") pass except: - print "Skipping libkdu_v42R.so - not found" + print "Skipping libfmod-3.75.so - not found" pass self.end_prefix("lib") @@ -971,6 +1033,11 @@ class Linux_i686Manifest(LinuxManifest): self.path("libvivoxplatform.so") self.end_prefix("lib") + if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer(): + print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build" + self.run_command("find %(d)r/bin %(d)r/lib -type f \\! -name update_install | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure + + class Linux_x86_64Manifest(LinuxManifest): def construct(self): super(Linux_x86_64Manifest, self).construct() diff --git a/indra/viewer_components/CMakeLists.txt b/indra/viewer_components/CMakeLists.txt index 0993b64b14..74c9b4568d 100644 --- a/indra/viewer_components/CMakeLists.txt +++ b/indra/viewer_components/CMakeLists.txt @@ -1,4 +1,4 @@ # -*- cmake -*- add_subdirectory(login) - +add_subdirectory(updater) diff --git a/indra/viewer_components/updater/CMakeLists.txt b/indra/viewer_components/updater/CMakeLists.txt new file mode 100644 index 0000000000..0e288bb496 --- /dev/null +++ b/indra/viewer_components/updater/CMakeLists.txt @@ -0,0 +1,82 @@ +# -*- cmake -*- + +project(updater_service) + +include(00-Common) +if(LL_TESTS) + include(LLAddBuildTest) +endif(LL_TESTS) +include(CMakeCopyIfDifferent) +include(CURL) +include(LLCommon) +include(LLMessage) +include(LLPlugin) +include(LLVFS) + +include_directories( + ${LLCOMMON_INCLUDE_DIRS} + ${LLMESSAGE_INCLUDE_DIRS} + ${LLPLUGIN_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} + ${CURL_INCLUDE_DIRS} + ) + +set(updater_service_SOURCE_FILES + llupdaterservice.cpp + llupdatechecker.cpp + llupdatedownloader.cpp + llupdateinstaller.cpp + ) + +set(updater_service_HEADER_FILES + llupdaterservice.h + llupdatechecker.h + llupdatedownloader.h + llupdateinstaller.h + ) + +set_source_files_properties(${updater_service_HEADER_FILES} + PROPERTIES HEADER_FILE_ONLY TRUE) + +list(APPEND + updater_service_SOURCE_FILES + ${updater_service_HEADER_FILES} + ) + +add_library(llupdaterservice + ${updater_service_SOURCE_FILES} + ) + +target_link_libraries(llupdaterservice + ${LLCOMMON_LIBRARIES} + ${LLMESSAGE_LIBRARIES} + ${LLPLUGIN_LIBRARIES} + ${LLVFS_LIBRARIES} + ) + +if(LL_TESTS) + SET(llupdater_service_TEST_SOURCE_FILES + llupdaterservice.cpp + ) + +# *NOTE:Mani - I was trying to use the preprocessor seam to mock out +# llifstream (and other) llcommon classes. I didn't work +# because of the windows declspec(dllimport)attribute. +#set_source_files_properties( +# llupdaterservice.cpp +# PROPERTIES +# LL_TEST_ADDITIONAL_CFLAGS "-Dllifstream=llus_mock_llifstream" +# ) + + LL_ADD_PROJECT_UNIT_TESTS(llupdaterservice "${llupdater_service_TEST_SOURCE_FILES}") +endif(LL_TESTS) + +set(UPDATER_INCLUDE_DIRS + ${LIBS_OPEN_DIR}/viewer_components/updater + CACHE INTERNAL "" +) + +set(UPDATER_LIBRARIES + llupdaterservice + CACHE INTERNAL "" +) diff --git a/indra/viewer_components/updater/llupdatechecker.cpp b/indra/viewer_components/updater/llupdatechecker.cpp new file mode 100644 index 0000000000..c6aa9b0f11 --- /dev/null +++ b/indra/viewer_components/updater/llupdatechecker.cpp @@ -0,0 +1,194 @@ +/** + * @file llupdaterservice.cpp + * + * $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 <stdexcept> +#include <boost/format.hpp> +#include "llhttpclient.h" +#include "llsd.h" +#include "llupdatechecker.h" +#include "lluri.h" + + +#if LL_WINDOWS +#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally +#endif + + +class LLUpdateChecker::CheckError: + public std::runtime_error +{ +public: + CheckError(const char * message): + std::runtime_error(message) + { + ; // No op. + } +}; + + +class LLUpdateChecker::Implementation: + public LLHTTPClient::Responder +{ +public: + Implementation(Client & client); + ~Implementation(); + void check(std::string const & protocolVersion, std::string const & hostUrl, + std::string const & servicePath, std::string channel, std::string version); + + // Responder: + virtual void completed(U32 status, + const std::string & reason, + const LLSD& content); + virtual void error(U32 status, const std::string & reason); + +private: + static const char * sProtocolVersion; + + Client & mClient; + LLHTTPClient mHttpClient; + bool mInProgress; + std::string mVersion; + + std::string buildUrl(std::string const & protocolVersion, std::string const & hostUrl, + std::string const & servicePath, std::string channel, std::string version); + + LOG_CLASS(LLUpdateChecker::Implementation); +}; + + + +// LLUpdateChecker +//----------------------------------------------------------------------------- + + +LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client): + mImplementation(new LLUpdateChecker::Implementation(client)) +{ + ; // No op. +} + + +void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl, + std::string const & servicePath, std::string channel, std::string version) +{ + mImplementation->check(protocolVersion, hostUrl, servicePath, channel, version); +} + + + +// LLUpdateChecker::Implementation +//----------------------------------------------------------------------------- + + +const char * LLUpdateChecker::Implementation::sProtocolVersion = "v1.0"; + + +LLUpdateChecker::Implementation::Implementation(LLUpdateChecker::Client & client): + mClient(client), + mInProgress(false) +{ + ; // No op. +} + + +LLUpdateChecker::Implementation::~Implementation() +{ + ; // No op. +} + + +void LLUpdateChecker::Implementation::check(std::string const & protocolVersion, std::string const & hostUrl, + std::string const & servicePath, std::string channel, std::string version) +{ + llassert(!mInProgress); + + if(protocolVersion != sProtocolVersion) throw CheckError("unsupported protocol"); + + mInProgress = true; + mVersion = version; + std::string checkUrl = buildUrl(protocolVersion, hostUrl, servicePath, channel, version); + LL_INFOS("UpdateCheck") << "checking for updates at " << checkUrl << llendl; + + // The HTTP client will wrap a raw pointer in a boost::intrusive_ptr causing the + // passed object to be silently and automatically deleted. We pass a self- + // referential intrusive pointer to which we add a reference to keep the + // client from deleting the update checker implementation instance. + LLHTTPClient::ResponderPtr temporaryPtr(this); + boost::intrusive_ptr_add_ref(temporaryPtr.get()); + mHttpClient.get(checkUrl, temporaryPtr); +} + +void LLUpdateChecker::Implementation::completed(U32 status, + const std::string & reason, + const LLSD & content) +{ + mInProgress = false; + + if(status != 200) { + LL_WARNS("UpdateCheck") << "html error " << status << " (" << reason << ")" << llendl; + mClient.error(reason); + } else if(!content.asBoolean()) { + LL_INFOS("UpdateCheck") << "up to date" << llendl; + mClient.upToDate(); + } else if(content["required"].asBoolean()) { + LL_INFOS("UpdateCheck") << "version invalid" << llendl; + LLURI uri(content["url"].asString()); + mClient.requiredUpdate(content["version"].asString(), uri, content["hash"].asString()); + } else { + LL_INFOS("UpdateCheck") << "newer version " << content["version"].asString() << " available" << llendl; + LLURI uri(content["url"].asString()); + mClient.optionalUpdate(content["version"].asString(), uri, content["hash"].asString()); + } +} + + +void LLUpdateChecker::Implementation::error(U32 status, const std::string & reason) +{ + mInProgress = false; + LL_WARNS("UpdateCheck") << "update check failed; " << reason << llendl; + mClient.error(reason); +} + + +std::string LLUpdateChecker::Implementation::buildUrl(std::string const & protocolVersion, std::string const & hostUrl, + std::string const & servicePath, std::string channel, std::string version) +{ +#ifdef LL_WINDOWS + static const char * platform = "win"; +#elif LL_DARWIN + static const char * platform = "mac"; +#else + static const char * platform = "lnx"; +#endif + + LLSD path; + path.append(servicePath); + path.append(protocolVersion); + path.append(channel); + path.append(version); + path.append(platform); + return LLURI::buildHTTP(hostUrl, path).asString(); +} diff --git a/indra/viewer_components/updater/llupdatechecker.h b/indra/viewer_components/updater/llupdatechecker.h new file mode 100644 index 0000000000..cea1f13647 --- /dev/null +++ b/indra/viewer_components/updater/llupdatechecker.h @@ -0,0 +1,82 @@ +/** + * @file llupdatechecker.h + * + * $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_UPDATERCHECKER_H +#define LL_UPDATERCHECKER_H + + +#include <boost/shared_ptr.hpp> + + +// +// Implements asynchronous checking for updates. +// +class LLUpdateChecker { +public: + class Client; + class Implementation; + + // An exception that may be raised on check errors. + class CheckError; + + LLUpdateChecker(Client & client); + + // Check status of current app on the given host for the channel and version provided. + void check(std::string const & protocolVersion, std::string const & hostUrl, + std::string const & servicePath, std::string channel, std::string version); + +private: + boost::shared_ptr<Implementation> mImplementation; +}; + + +class LLURI; // From lluri.h + + +// +// The client interface implemented by a requestor checking for an update. +// +class LLUpdateChecker::Client +{ +public: + // An error occurred while checking for an update. + virtual void error(std::string const & message) = 0; + + // A newer version is available, but the current version may still be used. + virtual void optionalUpdate(std::string const & newVersion, + LLURI const & uri, + std::string const & hash) = 0; + + // A newer version is available, and the current version is no longer valid. + virtual void requiredUpdate(std::string const & newVersion, + LLURI const & uri, + std::string const & hash) = 0; + + // The checked version is up to date; no newer version exists. + virtual void upToDate(void) = 0; +}; + + +#endif diff --git a/indra/viewer_components/updater/llupdatedownloader.cpp b/indra/viewer_components/updater/llupdatedownloader.cpp new file mode 100644 index 0000000000..c17a50e242 --- /dev/null +++ b/indra/viewer_components/updater/llupdatedownloader.cpp @@ -0,0 +1,428 @@ +/** + * @file llupdatedownloader.cpp + * + * $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 <stdexcept> +#include <boost/format.hpp> +#include <boost/lexical_cast.hpp> +#include <curl/curl.h> +#include "lldir.h" +#include "llfile.h" +#include "llmd5.h" +#include "llsd.h" +#include "llsdserialize.h" +#include "llthread.h" +#include "llupdatedownloader.h" +#include "llupdaterservice.h" + + +class LLUpdateDownloader::Implementation: + public LLThread +{ +public: + Implementation(LLUpdateDownloader::Client & client); + ~Implementation(); + void cancel(void); + void download(LLURI const & uri, std::string const & hash); + bool isDownloading(void); + size_t onHeader(void * header, size_t size); + size_t onBody(void * header, size_t size); + void resume(void); + +private: + bool mCancelled; + LLUpdateDownloader::Client & mClient; + CURL * mCurl; + LLSD mDownloadData; + llofstream mDownloadStream; + std::string mDownloadRecordPath; + curl_slist * mHeaderList; + + void initializeCurlGet(std::string const & url, bool processHeader); + void resumeDownloading(size_t startByte); + void run(void); + void startDownloading(LLURI const & uri, std::string const & hash); + void throwOnCurlError(CURLcode code); + bool validateDownload(void); + + LOG_CLASS(LLUpdateDownloader::Implementation); +}; + + +namespace { + class DownloadError: + public std::runtime_error + { + public: + DownloadError(const char * message): + std::runtime_error(message) + { + ; // No op. + } + }; + + + const char * gSecondLifeUpdateRecord = "SecondLifeUpdateDownload.xml"; +}; + + + +// LLUpdateDownloader +//----------------------------------------------------------------------------- + + + +std::string LLUpdateDownloader::downloadMarkerPath(void) +{ + return gDirUtilp->getExpandedFilename(LL_PATH_LOGS, gSecondLifeUpdateRecord); +} + + +LLUpdateDownloader::LLUpdateDownloader(Client & client): + mImplementation(new LLUpdateDownloader::Implementation(client)) +{ + ; // No op. +} + + +void LLUpdateDownloader::cancel(void) +{ + mImplementation->cancel(); +} + + +void LLUpdateDownloader::download(LLURI const & uri, std::string const & hash) +{ + mImplementation->download(uri, hash); +} + + +bool LLUpdateDownloader::isDownloading(void) +{ + return mImplementation->isDownloading(); +} + + +void LLUpdateDownloader::resume(void) +{ + mImplementation->resume(); +} + + + +// LLUpdateDownloader::Implementation +//----------------------------------------------------------------------------- + + +namespace { + size_t write_function(void * data, size_t blockSize, size_t blocks, void * downloader) + { + size_t bytes = blockSize * blocks; + return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onBody(data, bytes); + } + + + size_t header_function(void * data, size_t blockSize, size_t blocks, void * downloader) + { + size_t bytes = blockSize * blocks; + return reinterpret_cast<LLUpdateDownloader::Implementation *>(downloader)->onHeader(data, bytes); + } +} + + +LLUpdateDownloader::Implementation::Implementation(LLUpdateDownloader::Client & client): + LLThread("LLUpdateDownloader"), + mCancelled(false), + mClient(client), + mCurl(0), + mHeaderList(0) +{ + CURLcode code = curl_global_init(CURL_GLOBAL_ALL); // Just in case. + llverify(code == CURLE_OK); // TODO: real error handling here. +} + + +LLUpdateDownloader::Implementation::~Implementation() +{ + if(isDownloading()) { + cancel(); + shutdown(); + } else { + ; // No op. + } + if(mCurl) curl_easy_cleanup(mCurl); +} + + +void LLUpdateDownloader::Implementation::cancel(void) +{ + mCancelled = true; +} + + +void LLUpdateDownloader::Implementation::download(LLURI const & uri, std::string const & hash) +{ + if(isDownloading()) mClient.downloadError("download in progress"); + + mDownloadRecordPath = downloadMarkerPath(); + mDownloadData = LLSD(); + try { + startDownloading(uri, hash); + } catch(DownloadError const & e) { + mClient.downloadError(e.what()); + } +} + + +bool LLUpdateDownloader::Implementation::isDownloading(void) +{ + return !isStopped(); +} + + +void LLUpdateDownloader::Implementation::resume(void) +{ + mCancelled = false; + + if(isDownloading()) { + mClient.downloadError("download in progress"); + } + + mDownloadRecordPath = downloadMarkerPath(); + llifstream dataStream(mDownloadRecordPath); + if(!dataStream) { + mClient.downloadError("no download marker"); + return; + } + + LLSDSerialize::fromXMLDocument(mDownloadData, dataStream); + + if(!mDownloadData.asBoolean()) { + mClient.downloadError("no download information in marker"); + return; + } + + std::string filePath = mDownloadData["path"].asString(); + try { + if(LLFile::isfile(filePath)) { + llstat fileStatus; + LLFile::stat(filePath, &fileStatus); + if(fileStatus.st_size != mDownloadData["size"].asInteger()) { + resumeDownloading(fileStatus.st_size); + } else if(!validateDownload()) { + LLFile::remove(filePath); + download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString()); + } else { + mClient.downloadComplete(mDownloadData); + } + } else { + download(LLURI(mDownloadData["url"].asString()), mDownloadData["hash"].asString()); + } + } catch(DownloadError & e) { + mClient.downloadError(e.what()); + } +} + + +size_t LLUpdateDownloader::Implementation::onHeader(void * buffer, size_t size) +{ + char const * headerPtr = reinterpret_cast<const char *> (buffer); + std::string header(headerPtr, headerPtr + size); + size_t colonPosition = header.find(':'); + if(colonPosition == std::string::npos) return size; // HTML response; ignore. + + if(header.substr(0, colonPosition) == "Content-Length") { + try { + size_t firstDigitPos = header.find_first_of("0123456789", colonPosition); + size_t lastDigitPos = header.find_last_of("0123456789"); + std::string contentLength = header.substr(firstDigitPos, lastDigitPos - firstDigitPos + 1); + size_t size = boost::lexical_cast<size_t>(contentLength); + LL_INFOS("UpdateDownload") << "download size is " << size << LL_ENDL; + + mDownloadData["size"] = LLSD(LLSD::Integer(size)); + llofstream odataStream(mDownloadRecordPath); + LLSDSerialize::toPrettyXML(mDownloadData, odataStream); + } catch (std::exception const & e) { + LL_WARNS("UpdateDownload") << "unable to read content length (" + << e.what() << ")" << LL_ENDL; + } + } else { + ; // No op. + } + + return size; +} + + +size_t LLUpdateDownloader::Implementation::onBody(void * buffer, size_t size) +{ + if(mCancelled) return 0; // Forces a write error which will halt curl thread. + if((size == 0) || (buffer == 0)) return 0; + + mDownloadStream.write(reinterpret_cast<const char *>(buffer), size); + if(mDownloadStream.bad()) { + return 0; + } else { + return size; + } +} + + +void LLUpdateDownloader::Implementation::run(void) +{ + CURLcode code = curl_easy_perform(mCurl); + mDownloadStream.close(); + if(code == CURLE_OK) { + LLFile::remove(mDownloadRecordPath); + if(validateDownload()) { + LL_INFOS("UpdateDownload") << "download successful" << LL_ENDL; + mClient.downloadComplete(mDownloadData); + } else { + LL_INFOS("UpdateDownload") << "download failed hash check" << LL_ENDL; + std::string filePath = mDownloadData["path"].asString(); + if(filePath.size() != 0) LLFile::remove(filePath); + mClient.downloadError("failed hash check"); + } + } else if(mCancelled && (code == CURLE_WRITE_ERROR)) { + LL_INFOS("UpdateDownload") << "download canceled by user" << LL_ENDL; + // Do not call back client. + } else { + LL_WARNS("UpdateDownload") << "download failed with error '" << + curl_easy_strerror(code) << "'" << LL_ENDL; + LLFile::remove(mDownloadRecordPath); + if(mDownloadData.has("path")) LLFile::remove(mDownloadData["path"].asString()); + mClient.downloadError("curl error"); + } + + if(mHeaderList) { + curl_slist_free_all(mHeaderList); + mHeaderList = 0; + } +} + + +void LLUpdateDownloader::Implementation::initializeCurlGet(std::string const & url, bool processHeader) +{ + if(mCurl == 0) { + mCurl = curl_easy_init(); + } else { + curl_easy_reset(mCurl); + } + + if(mCurl == 0) throw DownloadError("failed to initialize curl"); + + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_NOSIGNAL, true)); + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_FOLLOWLOCATION, true)); + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_WRITEFUNCTION, &write_function)); + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_WRITEDATA, this)); + if(processHeader) { + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HEADERFUNCTION, &header_function)); + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HEADERDATA, this)); + } + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HTTPGET, true)); + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_URL, url.c_str())); +} + + +void LLUpdateDownloader::Implementation::resumeDownloading(size_t startByte) +{ + LL_INFOS("UpdateDownload") << "resuming download from " << mDownloadData["url"].asString() + << " at byte " << startByte << LL_ENDL; + + initializeCurlGet(mDownloadData["url"].asString(), false); + + // The header 'Range: bytes n-' will request the bytes remaining in the + // source begining with byte n and ending with the last byte. + boost::format rangeHeaderFormat("Range: bytes=%u-"); + rangeHeaderFormat % startByte; + mHeaderList = curl_slist_append(mHeaderList, rangeHeaderFormat.str().c_str()); + if(mHeaderList == 0) throw DownloadError("cannot add Range header"); + throwOnCurlError(curl_easy_setopt(mCurl, CURLOPT_HTTPHEADER, mHeaderList)); + + mDownloadStream.open(mDownloadData["path"].asString(), + std::ios_base::out | std::ios_base::binary | std::ios_base::app); + start(); +} + + +void LLUpdateDownloader::Implementation::startDownloading(LLURI const & uri, std::string const & hash) +{ + mDownloadData["url"] = uri.asString(); + mDownloadData["hash"] = hash; + mDownloadData["current_version"] = ll_get_version(); + LLSD path = uri.pathArray(); + if(path.size() == 0) throw DownloadError("no file path"); + std::string fileName = path[path.size() - 1].asString(); + std::string filePath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, fileName); + mDownloadData["path"] = filePath; + + LL_INFOS("UpdateDownload") << "downloading " << filePath + << " from " << uri.asString() << LL_ENDL; + LL_INFOS("UpdateDownload") << "hash of file is " << hash << LL_ENDL; + + llofstream dataStream(mDownloadRecordPath); + LLSDSerialize::toPrettyXML(mDownloadData, dataStream); + + mDownloadStream.open(filePath, std::ios_base::out | std::ios_base::binary); + initializeCurlGet(uri.asString(), true); + start(); +} + + +void LLUpdateDownloader::Implementation::throwOnCurlError(CURLcode code) +{ + if(code != CURLE_OK) { + const char * errorString = curl_easy_strerror(code); + if(errorString != 0) { + throw DownloadError(curl_easy_strerror(code)); + } else { + throw DownloadError("unknown curl error"); + } + } else { + ; // No op. + } +} + + +bool LLUpdateDownloader::Implementation::validateDownload(void) +{ + std::string filePath = mDownloadData["path"].asString(); + llifstream fileStream(filePath, std::ios_base::in | std::ios_base::binary); + if(!fileStream) return false; + + std::string hash = mDownloadData["hash"].asString(); + if(hash.size() != 0) { + LL_INFOS("UpdateDownload") << "checking hash..." << LL_ENDL; + char digest[33]; + LLMD5(fileStream).hex_digest(digest); + if(hash != digest) { + LL_WARNS("UpdateDownload") << "download hash mismatch; expeted " << hash << + " but download is " << digest << LL_ENDL; + } + return hash == digest; + } else { + return true; // No hash check provided. + } +} diff --git a/indra/viewer_components/updater/llupdatedownloader.h b/indra/viewer_components/updater/llupdatedownloader.h new file mode 100644 index 0000000000..1b3d7480fd --- /dev/null +++ b/indra/viewer_components/updater/llupdatedownloader.h @@ -0,0 +1,87 @@ +/** + * @file llupdatedownloader.h + * + * $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_UPDATE_DOWNLOADER_H +#define LL_UPDATE_DOWNLOADER_H + + +#include <string> +#include <boost/shared_ptr.hpp> +#include "lluri.h" + + +// +// An asynchronous download service for fetching updates. +// +class LLUpdateDownloader +{ +public: + class Client; + class Implementation; + + // Returns the path to the download marker file containing details of the + // latest download. + static std::string downloadMarkerPath(void); + + LLUpdateDownloader(Client & client); + + // Cancel any in progress download; a no op if none is in progress. The + // client will not receive a complete or error callback. + void cancel(void); + + // Start a new download. + void download(LLURI const & uri, std::string const & hash); + + // Returns true if a download is in progress. + bool isDownloading(void); + + // Resume a partial download. + void resume(void); + +private: + boost::shared_ptr<Implementation> mImplementation; +}; + + +// +// An interface to be implemented by clients initiating a update download. +// +class LLUpdateDownloader::Client { +public: + + // The download has completed successfully. + // data is a map containing the following items: + // url - source (remote) location + // hash - the md5 sum that should match the installer file. + // path - destination (local) location + // size - the size of the installer in bytes + virtual void downloadComplete(LLSD const & data) = 0; + + // The download failed. + virtual void downloadError(std::string const & message) = 0; +}; + + +#endif diff --git a/indra/viewer_components/updater/llupdateinstaller.cpp b/indra/viewer_components/updater/llupdateinstaller.cpp new file mode 100644 index 0000000000..650ef88af4 --- /dev/null +++ b/indra/viewer_components/updater/llupdateinstaller.cpp @@ -0,0 +1,90 @@ +/** + * @file llupdateinstaller.cpp + * + * $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 <apr_file_io.h> +#include "llapr.h" +#include "llprocesslauncher.h" +#include "llupdateinstaller.h" +#include "lldir.h" + + +namespace { + class RelocateError {}; + + + std::string copy_to_temp(std::string const & path) + { + std::string scriptFile = gDirUtilp->getBaseFileName(path); + std::string newPath = gDirUtilp->getExpandedFilename(LL_PATH_TEMP, scriptFile); + apr_status_t status = apr_file_copy(path.c_str(), newPath.c_str(), APR_FILE_SOURCE_PERMS, gAPRPoolp); + if(status != APR_SUCCESS) throw RelocateError(); + + return newPath; + } +} + + +int ll_install_update(std::string const & script, std::string const & updatePath, LLInstallScriptMode mode) +{ + std::string actualScriptPath; + switch(mode) { + case LL_COPY_INSTALL_SCRIPT_TO_TEMP: + try { + actualScriptPath = copy_to_temp(script); + } + catch (RelocateError &) { + return -1; + } + break; + case LL_RUN_INSTALL_SCRIPT_IN_PLACE: + actualScriptPath = script; + break; + default: + llassert(!"unpossible copy mode"); + } + + llinfos << "UpdateInstaller: installing " << updatePath << " using " << + actualScriptPath << LL_ENDL; + + LLProcessLauncher launcher; + launcher.setExecutable(actualScriptPath); + launcher.addArgument(updatePath); + launcher.addArgument(ll_install_failed_marker_path().c_str()); + int result = launcher.launch(); + launcher.orphan(); + + return result; +} + + +std::string const & ll_install_failed_marker_path(void) +{ + static std::string path; + if(path.empty()) { + path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeInstallFailed.marker"); + } + return path; +} diff --git a/indra/viewer_components/updater/llupdateinstaller.h b/indra/viewer_components/updater/llupdateinstaller.h new file mode 100644 index 0000000000..6ce08ce6fa --- /dev/null +++ b/indra/viewer_components/updater/llupdateinstaller.h @@ -0,0 +1,57 @@ +/** + * @file llupdateinstaller.h + * + * $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_UPDATE_INSTALLER_H +#define LL_UPDATE_INSTALLER_H + + +#include <string> + + +enum LLInstallScriptMode { + LL_RUN_INSTALL_SCRIPT_IN_PLACE, + LL_COPY_INSTALL_SCRIPT_TO_TEMP +}; + +// +// Launch the installation script. +// +// The updater will overwrite the current installation, so it is highly recommended +// that the current application terminate once this function is called. +// +int ll_install_update( + std::string const & script, // Script to execute. + std::string const & updatePath, // Path to update file. + LLInstallScriptMode mode=LL_COPY_INSTALL_SCRIPT_TO_TEMP); // Run in place or copy to temp? + + +// +// Returns the path which points to the failed install marker file, should it +// exist. +// +std::string const & ll_install_failed_marker_path(void); + + +#endif diff --git a/indra/viewer_components/updater/llupdaterservice.cpp b/indra/viewer_components/updater/llupdaterservice.cpp new file mode 100644 index 0000000000..cc60eaead2 --- /dev/null +++ b/indra/viewer_components/updater/llupdaterservice.cpp @@ -0,0 +1,519 @@ +/** + * @file llupdaterservice.cpp + * + * $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 "llupdatedownloader.h" +#include "llevents.h" +#include "lltimer.h" +#include "llupdaterservice.h" +#include "llupdatechecker.h" +#include "llupdateinstaller.h" +#include "llversionviewer.h" + +#include <boost/scoped_ptr.hpp> +#include <boost/weak_ptr.hpp> +#include "lldir.h" +#include "llsdserialize.h" +#include "llfile.h" + +#if LL_WINDOWS +#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally +#endif + + +namespace +{ + boost::weak_ptr<LLUpdaterServiceImpl> gUpdater; + + const std::string UPDATE_MARKER_FILENAME("SecondLifeUpdateReady.xml"); + std::string update_marker_path() + { + return gDirUtilp->getExpandedFilename(LL_PATH_LOGS, + UPDATE_MARKER_FILENAME); + } + + std::string install_script_path(void) + { +#ifdef LL_WINDOWS + std::string scriptFile = "update_install.bat"; +#else + std::string scriptFile = "update_install"; +#endif + return gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, scriptFile); + } + + LLInstallScriptMode install_script_mode(void) + { +#ifdef LL_WINDOWS + return LL_COPY_INSTALL_SCRIPT_TO_TEMP; +#else + return LL_RUN_INSTALL_SCRIPT_IN_PLACE; +#endif + }; + +} + +class LLUpdaterServiceImpl : + public LLUpdateChecker::Client, + public LLUpdateDownloader::Client +{ + static const std::string sListenerName; + + std::string mProtocolVersion; + std::string mUrl; + std::string mPath; + std::string mChannel; + std::string mVersion; + + unsigned int mCheckPeriod; + bool mIsChecking; + bool mIsDownloading; + + LLUpdateChecker mUpdateChecker; + LLUpdateDownloader mUpdateDownloader; + LLTimer mTimer; + + LLUpdaterService::app_exit_callback_t mAppExitCallback; + + LOG_CLASS(LLUpdaterServiceImpl); + +public: + LLUpdaterServiceImpl(); + virtual ~LLUpdaterServiceImpl(); + + void initialize(const std::string& protocol_version, + const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version); + + void setCheckPeriod(unsigned int seconds); + + void startChecking(bool install_if_ready); + void stopChecking(); + bool isChecking(); + + void setAppExitCallback(LLUpdaterService::app_exit_callback_t aecb) { mAppExitCallback = aecb;} + + bool checkForInstall(bool launchInstaller); // Test if a local install is ready. + bool checkForResume(); // Test for resumeable d/l. + + // LLUpdateChecker::Client: + virtual void error(std::string const & message); + virtual void optionalUpdate(std::string const & newVersion, + LLURI const & uri, + std::string const & hash); + virtual void requiredUpdate(std::string const & newVersion, + LLURI const & uri, + std::string const & hash); + virtual void upToDate(void); + + // LLUpdateDownloader::Client + void downloadComplete(LLSD const & data); + void downloadError(std::string const & message); + + bool onMainLoop(LLSD const & event); + +private: + void restartTimer(unsigned int seconds); + void stopTimer(); +}; + +const std::string LLUpdaterServiceImpl::sListenerName = "LLUpdaterServiceImpl"; + +LLUpdaterServiceImpl::LLUpdaterServiceImpl() : + mIsChecking(false), + mIsDownloading(false), + mCheckPeriod(0), + mUpdateChecker(*this), + mUpdateDownloader(*this) +{ +} + +LLUpdaterServiceImpl::~LLUpdaterServiceImpl() +{ + LL_INFOS("UpdaterService") << "shutting down updater service" << LL_ENDL; + LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName); +} + +void LLUpdaterServiceImpl::initialize(const std::string& protocol_version, + const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version) +{ + if(mIsChecking || mIsDownloading) + { + throw LLUpdaterService::UsageError("LLUpdaterService::initialize call " + "while updater is running."); + } + + mProtocolVersion = protocol_version; + mUrl = url; + mPath = path; + mChannel = channel; + mVersion = version; +} + +void LLUpdaterServiceImpl::setCheckPeriod(unsigned int seconds) +{ + mCheckPeriod = seconds; +} + +void LLUpdaterServiceImpl::startChecking(bool install_if_ready) +{ + if(mUrl.empty() || mChannel.empty() || mVersion.empty()) + { + throw LLUpdaterService::UsageError("Set params before call to " + "LLUpdaterService::startCheck()."); + } + + mIsChecking = true; + + // Check to see if an install is ready. + bool has_install = checkForInstall(install_if_ready); + if(!has_install) + { + checkForResume(); // will set mIsDownloading to true if resuming + + if(!mIsDownloading) + { + // Checking can only occur during the mainloop. + // reset the timer to 0 so that the next mainloop event + // triggers a check; + restartTimer(0); + } + } +} + +void LLUpdaterServiceImpl::stopChecking() +{ + if(mIsChecking) + { + mIsChecking = false; + stopTimer(); + } + + if(mIsDownloading) + { + mUpdateDownloader.cancel(); + mIsDownloading = false; + } +} + +bool LLUpdaterServiceImpl::isChecking() +{ + return mIsChecking; +} + +bool LLUpdaterServiceImpl::checkForInstall(bool launchInstaller) +{ + bool foundInstall = false; // return true if install is found. + + llifstream update_marker(update_marker_path(), + std::ios::in | std::ios::binary); + + if(update_marker.is_open()) + { + // Found an update info - now lets see if its valid. + LLSD update_info; + LLSDSerialize::fromXMLDocument(update_info, update_marker); + update_marker.close(); + + // Get the path to the installer file. + LLSD path = update_info.get("path"); + if(update_info["current_version"].asString() != ll_get_version()) + { + // This viewer is not the same version as the one that downloaded + // the update. Do not install this update. + if(!path.asString().empty()) + { + llinfos << "ignoring update dowloaded by different client version" << llendl; + LLFile::remove(path.asString()); + LLFile::remove(update_marker_path()); + } + else + { + ; // Nothing to clean up. + } + + foundInstall = false; + } + else if(path.isDefined() && !path.asString().empty()) + { + if(launchInstaller) + { + LLFile::remove(update_marker_path()); + + int result = ll_install_update(install_script_path(), + update_info["path"].asString(), + install_script_mode()); + + if((result == 0) && mAppExitCallback) + { + mAppExitCallback(); + } else if(result != 0) { + llwarns << "failed to run update install script" << LL_ENDL; + } else { + ; // No op. + } + } + + foundInstall = true; + } + } + return foundInstall; +} + +bool LLUpdaterServiceImpl::checkForResume() +{ + bool result = false; + std::string download_marker_path = mUpdateDownloader.downloadMarkerPath(); + if(LLFile::isfile(download_marker_path)) + { + llifstream download_marker_stream(download_marker_path, + std::ios::in | std::ios::binary); + if(download_marker_stream.is_open()) + { + LLSD download_info; + LLSDSerialize::fromXMLDocument(download_info, download_marker_stream); + download_marker_stream.close(); + if(download_info["current_version"].asString() == ll_get_version()) + { + mIsDownloading = true; + mUpdateDownloader.resume(); + result = true; + } + else + { + // The viewer that started this download is not the same as this viewer; ignore. + llinfos << "ignoring partial download from different viewer version" << llendl; + std::string path = download_info["path"].asString(); + if(!path.empty()) LLFile::remove(path); + LLFile::remove(download_marker_path); + } + } + } + return result; +} + +void LLUpdaterServiceImpl::error(std::string const & message) +{ + if(mIsChecking) + { + restartTimer(mCheckPeriod); + } +} + +void LLUpdaterServiceImpl::optionalUpdate(std::string const & newVersion, + LLURI const & uri, + std::string const & hash) +{ + stopTimer(); + mIsDownloading = true; + mUpdateDownloader.download(uri, hash); +} + +void LLUpdaterServiceImpl::requiredUpdate(std::string const & newVersion, + LLURI const & uri, + std::string const & hash) +{ + stopTimer(); + mIsDownloading = true; + mUpdateDownloader.download(uri, hash); +} + +void LLUpdaterServiceImpl::upToDate(void) +{ + if(mIsChecking) + { + restartTimer(mCheckPeriod); + } +} + +void LLUpdaterServiceImpl::downloadComplete(LLSD const & data) +{ + mIsDownloading = false; + + // Save out the download data to the SecondLifeUpdateReady + // marker file. + llofstream update_marker(update_marker_path()); + LLSDSerialize::toPrettyXML(data, update_marker); + + LLSD event; + event["pump"] = LLUpdaterService::pumpName(); + LLSD payload; + payload["type"] = LLSD(LLUpdaterService::DOWNLOAD_COMPLETE); + event["payload"] = payload; + LLEventPumps::instance().obtain("mainlooprepeater").post(event); +} + +void LLUpdaterServiceImpl::downloadError(std::string const & message) +{ + LL_INFOS("UpdaterService") << "Error downloading: " << message << LL_ENDL; + + mIsDownloading = false; + + // Restart the timer on error + if(mIsChecking) + { + restartTimer(mCheckPeriod); + } + + LLSD event; + event["pump"] = LLUpdaterService::pumpName(); + LLSD payload; + payload["type"] = LLSD(LLUpdaterService::DOWNLOAD_ERROR); + payload["message"] = message; + event["payload"] = payload; + LLEventPumps::instance().obtain("mainlooprepeater").post(event); +} + +void LLUpdaterServiceImpl::restartTimer(unsigned int seconds) +{ + LL_INFOS("UpdaterService") << "will check for update again in " << + seconds << " seconds" << LL_ENDL; + mTimer.start(); + mTimer.setTimerExpirySec(seconds); + LLEventPumps::instance().obtain("mainloop").listen( + sListenerName, boost::bind(&LLUpdaterServiceImpl::onMainLoop, this, _1)); +} + +void LLUpdaterServiceImpl::stopTimer() +{ + mTimer.stop(); + LLEventPumps::instance().obtain("mainloop").stopListening(sListenerName); +} + +bool LLUpdaterServiceImpl::onMainLoop(LLSD const & event) +{ + if(mTimer.getStarted() && mTimer.hasExpired()) + { + stopTimer(); + + // Check for failed install. + if(LLFile::isfile(ll_install_failed_marker_path())) + { + // TODO: notify the user. + llinfos << "found marker " << ll_install_failed_marker_path() << llendl; + llinfos << "last install attempt failed" << llendl; + LLFile::remove(ll_install_failed_marker_path()); + + LLSD event; + event["type"] = LLSD(LLUpdaterService::INSTALL_ERROR); + LLEventPumps::instance().obtain(LLUpdaterService::pumpName()).post(event); + } + else + { + mUpdateChecker.check(mProtocolVersion, mUrl, mPath, mChannel, mVersion); + } + } + else + { + // Keep on waiting... + } + + return false; +} + + +//----------------------------------------------------------------------- +// Facade interface + +std::string const & LLUpdaterService::pumpName(void) +{ + static std::string name("updater_service"); + return name; +} + +LLUpdaterService::LLUpdaterService() +{ + if(gUpdater.expired()) + { + mImpl = + boost::shared_ptr<LLUpdaterServiceImpl>(new LLUpdaterServiceImpl()); + gUpdater = mImpl; + } + else + { + mImpl = gUpdater.lock(); + } +} + +LLUpdaterService::~LLUpdaterService() +{ +} + +void LLUpdaterService::initialize(const std::string& protocol_version, + const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version) +{ + mImpl->initialize(protocol_version, url, path, channel, version); +} + +void LLUpdaterService::setCheckPeriod(unsigned int seconds) +{ + mImpl->setCheckPeriod(seconds); +} + +void LLUpdaterService::startChecking(bool install_if_ready) +{ + mImpl->startChecking(install_if_ready); +} + +void LLUpdaterService::stopChecking() +{ + mImpl->stopChecking(); +} + +bool LLUpdaterService::isChecking() +{ + return mImpl->isChecking(); +} + +void LLUpdaterService::setImplAppExitCallback(LLUpdaterService::app_exit_callback_t aecb) +{ + return mImpl->setAppExitCallback(aecb); +} + + +std::string const & ll_get_version(void) { + static std::string version(""); + + if (version.empty()) { + std::ostringstream stream; + stream << LL_VERSION_MAJOR << "." + << LL_VERSION_MINOR << "." + << LL_VERSION_PATCH << "." + << LL_VERSION_BUILD; + version = stream.str(); + } + + return version; +} + diff --git a/indra/viewer_components/updater/llupdaterservice.h b/indra/viewer_components/updater/llupdaterservice.h new file mode 100644 index 0000000000..752a6f834b --- /dev/null +++ b/indra/viewer_components/updater/llupdaterservice.h @@ -0,0 +1,85 @@ +/** + * @file llupdaterservice.h + * + * $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_UPDATERSERVICE_H +#define LL_UPDATERSERVICE_H + +#include <boost/shared_ptr.hpp> +#include <boost/function.hpp> + +class LLUpdaterServiceImpl; + +class LLUpdaterService +{ +public: + class UsageError: public std::runtime_error + { + public: + UsageError(const std::string& msg) : std::runtime_error(msg) {} + }; + + // Name of the event pump through which update events will be delivered. + static std::string const & pumpName(void); + + // Type codes for events posted by this service. Stored the event's 'type' element. + enum eUpdateEvent { + INVALID, + DOWNLOAD_COMPLETE, + DOWNLOAD_ERROR, + INSTALL_ERROR + }; + + LLUpdaterService(); + ~LLUpdaterService(); + + void initialize(const std::string& protocol_version, + const std::string& url, + const std::string& path, + const std::string& channel, + const std::string& version); + + void setCheckPeriod(unsigned int seconds); + + void startChecking(bool install_if_ready = false); + void stopChecking(); + bool isChecking(); + + typedef boost::function<void (void)> app_exit_callback_t; + template <typename F> + void setAppExitCallback(F const &callable) + { + app_exit_callback_t aecb = callable; + setImplAppExitCallback(aecb); + } + +private: + boost::shared_ptr<LLUpdaterServiceImpl> mImpl; + void setImplAppExitCallback(app_exit_callback_t aecb); +}; + +// Returns the full version as a string. +std::string const & ll_get_version(void); + +#endif // LL_UPDATERSERVICE_H diff --git a/indra/viewer_components/updater/scripts/darwin/update_install b/indra/viewer_components/updater/scripts/darwin/update_install new file mode 100644 index 0000000000..b174b3570a --- /dev/null +++ b/indra/viewer_components/updater/scripts/darwin/update_install @@ -0,0 +1,9 @@ +#! /bin/bash + +# +# The first argument contains the path to the installer app. The second a path +# to a marker file which should be created if the installer fails.q +# + +open ../Resources/mac-updater.app --args -dmg "$1" -name "Second Life Viewer 2" -marker "$2" +exit 0 diff --git a/indra/viewer_components/updater/scripts/linux/update_install b/indra/viewer_components/updater/scripts/linux/update_install new file mode 100644 index 0000000000..fef5ef7d09 --- /dev/null +++ b/indra/viewer_components/updater/scripts/linux/update_install @@ -0,0 +1,10 @@ +#! /bin/bash +INSTALL_DIR=$(cd "$(dirname $0)/.." ; pwd) +export LD_LIBRARY_PATH=$INSTALL_DIR/lib +bin/linux-updater.bin --file "$1" --dest "$INSTALL_DIR" --name "Second Life Viewer 2" --stringsdir "$INSTALL_DIR/skins/default/xui/en" --stringsfile "strings.xml" + +if [ $? -ne 0 ] + then touch $2 +fi + +rm -f $1 diff --git a/indra/viewer_components/updater/scripts/windows/update_install.bat b/indra/viewer_components/updater/scripts/windows/update_install.bat new file mode 100644 index 0000000000..42e148a707 --- /dev/null +++ b/indra/viewer_components/updater/scripts/windows/update_install.bat @@ -0,0 +1,3 @@ +start /WAIT %1 /SKIP_DIALOGS
+IF ERRORLEVEL 1 ECHO %ERRORLEVEL% > %2
+DEL %1
diff --git a/indra/viewer_components/updater/tests/llupdaterservice_test.cpp b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp new file mode 100644 index 0000000000..04ed4e6364 --- /dev/null +++ b/indra/viewer_components/updater/tests/llupdaterservice_test.cpp @@ -0,0 +1,199 @@ +/**
+ * @file llupdaterservice_test.cpp
+ * @brief Tests of llupdaterservice.cpp.
+ *
+ * $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$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "../llupdaterservice.h"
+#include "../llupdatechecker.h"
+#include "../llupdatedownloader.h"
+#include "../llupdateinstaller.h"
+
+#include "../../../test/lltut.h"
+//#define DEBUG_ON
+#include "../../../test/debug.h"
+
+#include "llevents.h"
+#include "lldir.h"
+
+/*****************************************************************************
+* MOCK'd
+*****************************************************************************/
+LLUpdateChecker::LLUpdateChecker(LLUpdateChecker::Client & client)
+{}
+void LLUpdateChecker::check(std::string const & protocolVersion, std::string const & hostUrl,
+ std::string const & servicePath, std::string channel, std::string version)
+{}
+LLUpdateDownloader::LLUpdateDownloader(Client & ) {}
+void LLUpdateDownloader::download(LLURI const & , std::string const &){}
+
+class LLDir_Mock : public LLDir
+{
+ void initAppDirs(const std::string &app_name,
+ const std::string& app_read_only_data_dir = "") {}
+ U32 countFilesInDir(const std::string &dirname, const std::string &mask)
+ {
+ return 0;
+ }
+
+ BOOL getNextFileInDir(const std::string &dirname,
+ const std::string &mask,
+ std::string &fname)
+ {
+ return false;
+ }
+ void getRandomFileInDir(const std::string &dirname,
+ const std::string &mask,
+ std::string &fname) {}
+ std::string getCurPath() { return ""; }
+ BOOL fileExists(const std::string &filename) const { return false; }
+ std::string getLLPluginLauncher() { return ""; }
+ std::string getLLPluginFilename(std::string base_name) { return ""; }
+
+} gDirUtil;
+LLDir* gDirUtilp = &gDirUtil;
+LLDir::LLDir() {}
+LLDir::~LLDir() {}
+S32 LLDir::deleteFilesInDir(const std::string &dirname,
+ const std::string &mask)
+{ return 0; }
+
+void LLDir::setChatLogsDir(const std::string &path){}
+void LLDir::setPerAccountChatLogsDir(const std::string &username){}
+void LLDir::setLindenUserDir(const std::string &username){}
+void LLDir::setSkinFolder(const std::string &skin_folder){}
+bool LLDir::setCacheDir(const std::string &path){ return true; }
+void LLDir::dumpCurrentDirectories() {}
+
+std::string LLDir::getExpandedFilename(ELLPath location,
+ const std::string &filename) const
+{
+ return "";
+}
+
+std::string LLUpdateDownloader::downloadMarkerPath(void)
+{
+ return "";
+}
+
+void LLUpdateDownloader::resume(void) {}
+void LLUpdateDownloader::cancel(void) {}
+
+int ll_install_update(std::string const &, std::string const &, LLInstallScriptMode)
+{
+ return 0;
+}
+
+std::string const & ll_install_failed_marker_path()
+{
+ static std::string wubba;
+ return wubba;
+}
+
+/*
+#pragma warning(disable: 4273)
+llus_mock_llifstream::llus_mock_llifstream(const std::string& _Filename,
+ ios_base::openmode _Mode,
+ int _Prot) :
+ std::basic_istream<char,std::char_traits< char > >(NULL,true)
+{}
+
+llus_mock_llifstream::~llus_mock_llifstream() {}
+bool llus_mock_llifstream::is_open() const {return true;}
+void llus_mock_llifstream::close() {}
+*/
+
+/*****************************************************************************
+* TUT
+*****************************************************************************/
+namespace tut
+{
+ struct llupdaterservice_data
+ {
+ llupdaterservice_data() :
+ pumps(LLEventPumps::instance()),
+ test_url("dummy_url"),
+ test_channel("dummy_channel"),
+ test_version("dummy_version")
+ {}
+ LLEventPumps& pumps;
+ std::string test_url;
+ std::string test_channel;
+ std::string test_version;
+ };
+
+ typedef test_group<llupdaterservice_data> llupdaterservice_group;
+ typedef llupdaterservice_group::object llupdaterservice_object;
+ llupdaterservice_group llupdaterservicegrp("LLUpdaterService");
+
+ template<> template<>
+ void llupdaterservice_object::test<1>()
+ {
+ DEBUG;
+ LLUpdaterService updater;
+ bool got_usage_error = false;
+ try
+ {
+ updater.startChecking();
+ }
+ catch(LLUpdaterService::UsageError)
+ {
+ got_usage_error = true;
+ }
+ ensure("Caught start before params", got_usage_error);
+ }
+
+ template<> template<>
+ void llupdaterservice_object::test<2>()
+ {
+ DEBUG;
+ LLUpdaterService updater;
+ bool got_usage_error = false;
+ try
+ {
+ updater.initialize("1.0",test_url, "update" ,test_channel, test_version);
+ updater.startChecking();
+ updater.initialize("1.0", "other_url", "update", test_channel, test_version);
+ }
+ catch(LLUpdaterService::UsageError)
+ {
+ got_usage_error = true;
+ }
+ ensure("Caught params while running", got_usage_error);
+ }
+
+ template<> template<>
+ void llupdaterservice_object::test<3>()
+ {
+ DEBUG;
+ LLUpdaterService updater;
+ updater.initialize("1.0", test_url, "update", test_channel, test_version);
+ updater.startChecking();
+ ensure(updater.isChecking());
+ updater.stopChecking();
+ ensure(!updater.isChecking());
+ }
+}
|