diff options
Diffstat (limited to 'indra')
133 files changed, 1910 insertions, 756 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index b159092592..1f578eec5f 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -119,14 +119,14 @@ if (LINUX)    endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})    # Let's actually get a numerical version of gxx's version -  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION}) +  STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION}) -  # gcc 4.3 and above don't like the LL boost and also  +  # gcc 4.3 and above don't like the LL boost and also    # cause warnings due to our use of deprecated headers -  if(${CXX_VERSION} GREATER 429) +  if(${CXX_VERSION_NUMBER} GREATER 429)      add_definitions(-Wno-parentheses)      set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}") -  endif (${CXX_VERSION} GREATER 429) +  endif (${CXX_VERSION_NUMBER} GREATER 429)    # End of hacks. diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index bbf31f9297..342accad7a 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -19,10 +19,12 @@ if(WINDOWS)      set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")      set(vivox_files          SLVoice.exe -        alut.dll +	libsndfile-1.dll +        vivoxplatform.dll          vivoxsdk.dll          ortp.dll -        wrap_oal.dll +        zlib1.dll +        vivoxoal.dll          )      #******************************* @@ -139,9 +141,10 @@ elseif(DARWIN)      set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")      set(vivox_files          SLVoice -        libalut.dylib -        libopenal.dylib +        libsndfile.dylib +        libvivoxoal.dylib          libortp.dylib +        libvivoxplatform.dylib          libvivoxsdk.dylib         )      # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables @@ -190,9 +193,10 @@ elseif(LINUX)      set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")      set(vivox_files -        libalut.so -        libopenal.so.1 +        libsndfile.so.1          libortp.so +        libvivoxoal.so.1 +        libvivoxplatform.so          libvivoxsdk.so          SLVoice         ) diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py index fff78ecbe3..0f6967e42a 100644 --- a/indra/cmake/run_build_test.py +++ b/indra/cmake/run_build_test.py @@ -64,20 +64,20 @@ def main(command, libpath=[], vars={}):          # might not exist; instead of KeyError, just use an empty string.          dirs = os.environ.get(var, "").split(os.pathsep)          # Append the sequence in libpath -##         print "%s += %r" % (var, libpath) +        print "%s += %r" % (var, libpath)          dirs.extend(libpath)          # Now rebuild the path string. This way we use a minimum of separators          # -- and we avoid adding a pointless separator when libpath is empty.          os.environ[var] = os.pathsep.join(dirs)      # Now handle arbitrary environment variables. The tricky part is ensuring      # that all the keys and values we try to pass are actually strings. -##     if vars: -##         print "Setting:" -##         for key, value in vars.iteritems(): -##             print "%s=%s" % (key, value) +    if vars: +         print "Setting:" +         for key, value in vars.iteritems(): +             print "%s=%s" % (key, value)      os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))      # Run the child process. -##     print "Running: %s" % " ".join(command) +    print "Running: %s" % " ".join(command)      return subprocess.call(command)  if __name__ == "__main__": diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index 9e9e1aaeae..bfa2c34c12 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -31,7 +31,6 @@ set(llaudio_SOURCE_FILES      llaudioengine.cpp      lllistener.cpp      llaudiodecodemgr.cpp -    llvorbisdecode.cpp      llvorbisencode.cpp      ) @@ -41,7 +40,6 @@ set(llaudio_HEADER_FILES      llaudioengine.h      lllistener.h      llaudiodecodemgr.h -    llvorbisdecode.h      llvorbisencode.h      llwindgen.h      ) @@ -60,11 +58,11 @@ if (FMOD)           )      if (LINUX) -      if (${CXX_VERSION} MATCHES "4.[23]") +      if (${CXX_VERSION_NUMBER} GREATER 419)          set_source_files_properties(llaudioengine_fmod.cpp                                      llstreamingaudio_fmod.cpp                                      COMPILE_FLAGS -Wno-write-strings) -      endif (${CXX_VERSION} MATCHES "4.[23]") +      endif (${CXX_VERSION_NUMBER} GREATER 419)      endif (LINUX)  endif (FMOD) diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp index ae959eaa81..6bbaad9cef 100644 --- a/indra/llaudio/llaudiodecodemgr.cpp +++ b/indra/llaudio/llaudiodecodemgr.cpp @@ -33,7 +33,6 @@  #include "llaudiodecodemgr.h" -#include "llvorbisdecode.h"  #include "llaudioengine.h"  #include "lllfsthread.h"  #include "llvfile.h" diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index c3d8a5aa23..70d770ef7e 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -2,6 +2,7 @@   * @file llpluginclassmedia.cpp   * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index dcc4a3bd6a..6b64688718 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -2,6 +2,7 @@   * @file llpluginclassmedia.h   * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINCLASSMEDIA_H diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index c798af29ca..6d369cd51a 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -2,6 +2,7 @@   * @file llpluginclassmediaowner.h   * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINCLASSMEDIAOWNER_H diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp index 58fb792d0d..16ba492669 100644 --- a/indra/llplugin/llplugininstance.cpp +++ b/indra/llplugin/llplugininstance.cpp @@ -2,6 +2,7 @@   * @file llplugininstance.cpp   * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h index ba569df10c..02936f65fb 100644 --- a/indra/llplugin/llplugininstance.h +++ b/indra/llplugin/llplugininstance.h @@ -2,6 +2,7 @@   * @file llplugininstance.h   * @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGININSTANCE_H diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp index 32601b47db..34e02c356e 100644 --- a/indra/llplugin/llpluginmessage.cpp +++ b/indra/llplugin/llpluginmessage.cpp @@ -2,6 +2,7 @@   * @file llpluginmessage.cpp   * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h index 5e93d8b7a1..99f8d1194f 100644 --- a/indra/llplugin/llpluginmessage.h +++ b/indra/llplugin/llpluginmessage.h @@ -2,6 +2,7 @@   * @file llpluginmessage.h   * @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINMESSAGE_H diff --git a/indra/llplugin/llpluginmessageclasses.h b/indra/llplugin/llpluginmessageclasses.h index 927fcf2eb2..01fddb92c5 100644 --- a/indra/llplugin/llpluginmessageclasses.h +++ b/indra/llplugin/llpluginmessageclasses.h @@ -2,6 +2,7 @@   * @file llpluginmessageclasses.h   * @brief This file defines the versions of existing message classes for LLPluginMessage.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINMESSAGECLASSES_H diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp index 31ea138912..cc193fca42 100644 --- a/indra/llplugin/llpluginmessagepipe.cpp +++ b/indra/llplugin/llpluginmessagepipe.cpp @@ -2,6 +2,7 @@   * @file llpluginmessagepipe.cpp   * @brief Classes that implement connections from the plugin system to pipes/pumps.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h index 4eb6575bd4..1ddb38de68 100644 --- a/indra/llplugin/llpluginmessagepipe.h +++ b/indra/llplugin/llpluginmessagepipe.h @@ -2,6 +2,7 @@   * @file llpluginmessagepipe.h   * @brief Classes that implement connections from the plugin system to pipes/pumps.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINMESSAGEPIPE_H diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp index fc95136d9e..55cf11c620 100644 --- a/indra/llplugin/llpluginprocesschild.cpp +++ b/indra/llplugin/llpluginprocesschild.cpp @@ -2,6 +2,7 @@   * @file llpluginprocesschild.cpp   * @brief LLPluginProcessChild handles the child side of the external-process plugin API.    * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h index 75860bdf0a..f5c57c3d49 100644 --- a/indra/llplugin/llpluginprocesschild.h +++ b/indra/llplugin/llpluginprocesschild.h @@ -2,6 +2,7 @@   * @file llpluginprocesschild.h   * @brief LLPluginProcessChild handles the child side of the external-process plugin API.    * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINPROCESSCHILD_H diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp index b7ce800c3a..332ce288d7 100644 --- a/indra/llplugin/llpluginprocessparent.cpp +++ b/indra/llplugin/llpluginprocessparent.cpp @@ -2,6 +2,7 @@   * @file llpluginprocessparent.cpp   * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h index 1289e86c13..25669f5d78 100644 --- a/indra/llplugin/llpluginprocessparent.h +++ b/indra/llplugin/llpluginprocessparent.h @@ -2,6 +2,7 @@   * @file llpluginprocessparent.h   * @brief LLPluginProcessParent handles the parent side of the external-process plugin API.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINPROCESSPARENT_H diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp index ce8b8e3e09..3c69a69d28 100644 --- a/indra/llplugin/llpluginsharedmemory.cpp +++ b/indra/llplugin/llpluginsharedmemory.cpp @@ -2,6 +2,7 @@   * @file llpluginsharedmemory.cpp   * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h index a4613b9a54..4014620c52 100644 --- a/indra/llplugin/llpluginsharedmemory.h +++ b/indra/llplugin/llpluginsharedmemory.h @@ -2,6 +2,7 @@   * @file llpluginsharedmemory.h   * @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef LL_LLPLUGINSHAREDMEMORY_H diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp index 005e427572..23dc532ba5 100644 --- a/indra/llplugin/slplugin/slplugin.cpp +++ b/indra/llplugin/slplugin/slplugin.cpp @@ -1,11 +1,13 @@ -/**  +/**   * @file slplugin.cpp   * @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.   * + * @cond + *   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. - *  + *   * Second Life Viewer Source Code   * The source code in this file ("Source Code") is provided by Linden Lab   * to you under the terms of the GNU General Public License, version 2.0 @@ -13,20 +15,22 @@   * ("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://secondlife.com/developers/opensource/gplv2 - *  + *   * There are special exceptions to the terms and conditions of the GPL as   * it is applied to this Source Code. View the full text of the exception   * in the file doc/FLOSS-exception.txt in this software distribution, or   * online at http://secondlife.com/developers/opensource/flossexception - *  + *   * By copying, modifying or distributing this software, you acknowledge   * that you have read and understood your obligations described above,   * and agree to abide by those obligations. - *  + *   * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * + * @endcond   */ @@ -48,15 +52,15 @@  /*  	On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist. -	 +  	Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags: -	 +  	-sectcreate __TEXT __info_plist /path/to/slplugin_info.plist -	 +  	which means adding this to the gcc flags: -	 +  	-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist -	 +  */  #if LL_DARWIN || LL_LINUX @@ -67,7 +71,7 @@ static void crash_handler(int sig)  	// TODO: add our own crash reporting  	_exit(1);  } -#endif	 +#endif  #if LL_WINDOWS  #include <windows.h> @@ -80,7 +84,48 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop  	//std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;  	// TODO: replace exception handler before we exit? -	return EXCEPTION_EXECUTE_HANDLER;	 +	return EXCEPTION_EXECUTE_HANDLER; +} + +// Taken from : http://blog.kalmbachnet.de/?postid=75 +// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson) +// even with the other exception handling code. This (terrifying) piece of code +// patches things so that doesn't happen. +LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter( +	LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter ) +{ +	return NULL; +} + +BOOL PreventSetUnhandledExceptionFilter() +{ +// WARNING: This won't work on 64-bit Windows systems so we turn it off it. +//          It should work for any flavor of 32-bit Windows we care about. +//          If it's off, sometimes you will see an OS message when a plugin crashes +#ifndef _WIN64 +	HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" ); +	if ( NULL == hKernel32 ) +		return FALSE; + +	void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" ); +	if( NULL == pOrgEntry ) +		return FALSE; + +	unsigned char newJump[ 100 ]; +	DWORD dwOrgEntryAddr = (DWORD)pOrgEntry; +	dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far +	void *pNewFunc = &MyDummySetUnhandledExceptionFilter; +	DWORD dwNewEntryAddr = (DWORD) pNewFunc; +	DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; + +	newJump[ 0 ] = 0xE9;  // JMP absolute +	memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) ); +	SIZE_T bytesWritten; +	BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten ); +	return bRet; +#else +	return FALSE; +#endif  }  //////////////////////////////////////////////////////////////////////////////// @@ -91,6 +136,7 @@ void initExceptionHandler()  	// save old exception handler in case we need to restore it at the end  	prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler ); +	PreventSetUnhandledExceptionFilter();  }  bool checkExceptionHandler() @@ -99,6 +145,8 @@ bool checkExceptionHandler()  	LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;  	prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler); +	PreventSetUnhandledExceptionFilter(); +  	if (prev_filter != myWin32ExceptionHandler)  	{  		LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL; @@ -122,7 +170,7 @@ bool checkExceptionHandler()  }  #endif -// If this application on Windows platform is a console application, a console is always  +// If this application on Windows platform is a console application, a console is always  // created which is bad. Making it a Windows "application" via CMake settings but not  // adding any code to explicitly create windows does the right thing.  #if LL_WINDOWS @@ -133,7 +181,7 @@ int main(int argc, char **argv)  {  	ll_init_apr(); -	// Set up llerror logging  +	// Set up llerror logging  	{  		LLError::initForApplication(".");  		LLError::setDefaultLevel(LLError::LEVEL_INFO); @@ -146,14 +194,14 @@ int main(int argc, char **argv)  	{  		LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;  	}; -	 +  	U32 port = 0;  	if(!LLStringUtil::convertToU32(lpCmdLine, port))  	{  		LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;  	}; -	// Insert our exception handler into the system so this plugin doesn't  +	// Insert our exception handler into the system so this plugin doesn't  	// display a crash message if something bad happens. The host app will  	// see the missing heartbeat and log appropriately.  	initExceptionHandler(); @@ -162,7 +210,7 @@ int main(int argc, char **argv)  	{  		LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;  	} -	 +  	U32 port = 0;  	if(!LLStringUtil::convertToU32(argv[1], port))  	{ @@ -183,17 +231,17 @@ int main(int argc, char **argv)  	LLPluginProcessChild *plugin = new LLPluginProcessChild();  	plugin->init(port); -	 +  	LLTimer timer;  	timer.start();  #if LL_WINDOWS  	checkExceptionHandler();  #endif -		 +  	while(!plugin->isDone())  	{ -		timer.reset();	 +		timer.reset();  		plugin->idle();  #if LL_DARWIN  		{ @@ -204,7 +252,7 @@ int main(int argc, char **argv)  #endif  		F64 elapsed = timer.getElapsedTimeF64();  		F64 remaining = plugin->getSleepTime() - elapsed; -		 +  		if(remaining <= 0.0f)  		{  			// We've already used our full allotment. @@ -217,26 +265,26 @@ int main(int argc, char **argv)  		{  //			LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL; -//			timer.reset();	 -			 +//			timer.reset(); +  			// This also services the network as needed.  			plugin->sleep(remaining); -			 +  //			LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" <<  LL_ENDL;  		}  #if LL_WINDOWS  	// More agressive checking of interfering exception handlers. -	// Doesn't appear to be required so far - even for plugins  -	// that do crash with a single call to the intercept  +	// Doesn't appear to be required so far - even for plugins +	// that do crash with a single call to the intercept  	// exception handler such as QuickTime.  	//checkExceptionHandler();  #endif  	}  	delete plugin; -	 -	ll_cleanup_apr();	 + +	ll_cleanup_apr();  	return 0;  } diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp index 8de3a8a96f..ddfb0f8534 100644 --- a/indra/llui/llflatlistview.cpp +++ b/indra/llui/llflatlistview.cpp @@ -484,6 +484,8 @@ void LLFlatListView::rearrangeItems()  void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)  {  	if (!item_pair) return; + +	setFocus(TRUE);  	bool select_item = !isSelected(item_pair); @@ -554,12 +556,21 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)  			break;  	} -	if ( key == KEY_UP || key == KEY_DOWN ) +	if ( ( key == KEY_UP || key == KEY_DOWN ) && mSelectedItemPairs.size() )  	{ -		LLRect selcted_rect = getLastSelectedItemRect().stretch(1); -		LLRect visible_rect = getVisibleContentRect(); -		if ( !visible_rect.contains (selcted_rect) ) -			scrollToShowRect(selcted_rect); +		LLRect visible_rc = getVisibleContentRect(); +		LLRect selected_rc = getLastSelectedItemRect(); + +		if ( !visible_rc.contains (selected_rc) ) +		{ +			// But scroll in Items panel coordinates +			scrollToShowRect(selected_rc); +		} + +		// In case we are in accordion tab notify parent to show selected rectangle +		LLRect screen_rc; +		localRectToScreen(selected_rc, &screen_rc); +		notifyParent(LLSD().insert("scrollToShowRect",screen_rc.getValue()));  		handled = TRUE;  	} @@ -645,8 +656,6 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)  		onCommit();  	} -	setFocus(TRUE); -  	// Stretch selected items rect to ensure it won't be clipped  	mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1)); diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp index c8b6e814e1..62ca569e6c 100644 --- a/indra/llui/llprogressbar.cpp +++ b/indra/llui/llprogressbar.cpp @@ -72,12 +72,13 @@ LLProgressBar::~LLProgressBar()  void LLProgressBar::draw()  {  	static LLTimer timer; - -	LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga"); +	F32 alpha = getDrawContext().mAlpha; -	mImageBar->draw(getLocalRect(), mColorBackground.get()); +	LLColor4 image_bar_color = mColorBackground.get(); +	image_bar_color.setAlpha(alpha); +	mImageBar->draw(getLocalRect(), image_bar_color); -	F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32())); +	alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));  	LLColor4 bar_color = mColorBar.get();  	bar_color.mV[VALPHA] *= alpha; // modulate alpha  	LLRect progress_rect = getLocalRect(); diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp index a7cf9be277..0c46edf300 100644 --- a/indra/llui/llresizebar.cpp +++ b/indra/llui/llresizebar.cpp @@ -144,9 +144,10 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)  		if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )  		{  			// undock floater when user resize it -			if (((LLFloater*)getParent())->isDocked()) +			LLFloater* parent = dynamic_cast<LLFloater*>( getParent()); +			if (parent && parent->isDocked())  			{ -				((LLFloater*)getParent())->setDocked(false, false); +				parent->setDocked( false, false);  			}  			// Resize the parent diff --git a/indra/llui/llscrollcontainer.cpp b/indra/llui/llscrollcontainer.cpp index 53c5a8d07d..8a33619b58 100644 --- a/indra/llui/llscrollcontainer.cpp +++ b/indra/llui/llscrollcontainer.cpp @@ -111,7 +111,8 @@ LLScrollContainer::LLScrollContainer(const LLScrollContainer::Params& p)  	LLView::addChild( mBorder );  	mInnerRect.set( 0, getRect().getHeight(), getRect().getWidth(), 0 ); -	mInnerRect.stretch( -mBorder->getBorderWidth()  ); +	if ( mBorder->getVisible() ) +		mInnerRect.stretch( -mBorder->getBorderWidth() );  	LLRect vertical_scroll_rect = mInnerRect;  	vertical_scroll_rect.mLeft = vertical_scroll_rect.mRight - scrollbar_size; @@ -189,7 +190,8 @@ void LLScrollContainer::reshape(S32 width, S32 height,  	LLUICtrl::reshape( width, height, called_from_parent );  	mInnerRect = getLocalRect(); -	mInnerRect.stretch( -mBorder->getBorderWidth() ); +	if ( mBorder->getVisible() ) +		mInnerRect.stretch( -mBorder->getBorderWidth() );  	if (mScrolledView)  	{ diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index cf135997b2..01c7a81309 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -228,7 +228,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)  	{  		LLButton::Params p_button;  		p_button.name(std::string("play_media")); -		p_button.label(""); // provid label but set to empty so name does not overwrite it -angela +		p_button.label(""); // provide label but set to empty so name does not overwrite it -angela  		TOOLTIP_PLAYBUTTON_SIZE = 16;  		LLRect button_rect;  		button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE); diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp index 6acac07423..8c8fa24a65 100644 --- a/indra/media_plugins/base/media_plugin_base.cpp +++ b/indra/media_plugins/base/media_plugin_base.cpp @@ -2,6 +2,7 @@   * @file media_plugin_base.cpp   * @brief Media plugin base class for LLMedia API plugin system   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h index f1e96335f9..4dd157a07c 100644 --- a/indra/media_plugins/base/media_plugin_base.h +++ b/indra/media_plugins/base/media_plugin_base.h @@ -2,6 +2,7 @@   * @file media_plugin_base.h   * @brief Media plugin base class for LLMedia API plugin system   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp index 99e0199a29..f5b077fea0 100644 --- a/indra/media_plugins/example/media_plugin_example.cpp +++ b/indra/media_plugins/example/media_plugin_example.cpp @@ -2,6 +2,7 @@   * @file media_plugin_example.cpp   * @brief Example plugin for LLMedia API plugin system   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2009, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h index ef41736c18..48accd3e66 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h @@ -3,6 +3,7 @@   * @author Tofu Linden   * @brief implementation that supports media playback via GStreamer.   * + * @cond   * $LicenseInfo:firstyear=2007&license=viewergpl$   *    * Copyright (c) 2007-2009, Linden Research, Inc. @@ -29,6 +30,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  // header guard diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp index cc52232496..52cea46d46 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp @@ -2,6 +2,7 @@   * @file llmediaimplgstreamer_syms.cpp   * @brief dynamic GStreamer symbol-grabbing code   * + * @cond   * $LicenseInfo:firstyear=2007&license=viewergpl$   *    * Copyright (c) 2007-2009, Linden Research, Inc. @@ -28,6 +29,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #if LL_GSTREAMER010_ENABLED diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h index ee7473d6d1..88f100af6e 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h @@ -2,6 +2,7 @@   * @file llmediaimplgstreamer_syms.h   * @brief dynamic GStreamer symbol-grabbing code   * + * @cond   * $LicenseInfo:firstyear=2007&license=viewergpl$   *    * Copyright (c) 2007-2009, Linden Research, Inc. @@ -28,6 +29,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h index e31d4a3282..2244ccc146 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h @@ -2,6 +2,7 @@   * @file llmediaimplgstreamertriviallogging.h   * @brief minimal logging utilities.   * + * @cond   * $LicenseInfo:firstyear=2009&license=viewergpl$   *    * Copyright (c) 2009, Linden Research, Inc. @@ -28,6 +29,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__ diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp index d8ccfaa702..5bb0ef5a99 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp @@ -2,6 +2,7 @@   * @file llmediaimplgstreamervidplug.h   * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl   * + * @cond   * $LicenseInfo:firstyear=2007&license=viewergpl$   *    * Copyright (c) 2007-2009, Linden Research, Inc. @@ -28,6 +29,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #if LL_GSTREAMER010_ENABLED diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h index f6d55b8758..208523e8d0 100644 --- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h +++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h @@ -2,6 +2,7 @@   * @file llmediaimplgstreamervidplug.h   * @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl   * + * @cond   * $LicenseInfo:firstyear=2007&license=viewergpl$   *    * Copyright (c) 2007-2009, Linden Research, Inc. @@ -28,6 +29,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #ifndef __GST_SLVIDEO_H__ diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp index a4c43988ba..d21ff26f83 100644 --- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp +++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp @@ -2,6 +2,7 @@   * @file media_plugin_gstreamer010.cpp   * @brief GStreamer-0.10 plugin for LLMedia API plugin system   * + * @cond   * $LicenseInfo:firstyear=2007&license=viewergpl$   *   * Copyright (c) 2007, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp index 236f79978d..dbc44c8334 100644 --- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp +++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp @@ -2,6 +2,7 @@   * @file media_plugin_quicktime.cpp   * @brief QuickTime plugin for LLMedia API plugin system   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "linden_common.h" diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp index 09348782a4..30c7483229 100644 --- a/indra/media_plugins/webkit/media_plugin_webkit.cpp +++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp @@ -2,6 +2,7 @@   * @file media_plugin_webkit.cpp   * @brief Webkit plugin for LLMedia API plugin system   * + * @cond   * $LicenseInfo:firstyear=2008&license=viewergpl$   *   * Copyright (c) 2008, Linden Research, Inc. @@ -27,6 +28,7 @@   * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,   * COMPLETENESS OR PERFORMANCE.   * $/LicenseInfo$ + * @endcond   */  #include "llqtwebkit.h" diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index fc6955bc70..73240cebbb 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -90,6 +90,7 @@ set(viewer_SOURCE_FILES      llbox.cpp      llbreadcrumbview.cpp      llcallbacklist.cpp +    llcallfloater.cpp      llcallingcard.cpp      llcapabilitylistener.cpp      llcaphttpsender.cpp @@ -185,7 +186,7 @@ set(viewer_SOURCE_FILES      llfloatermediasettings.cpp      llfloatermemleak.cpp      llfloaternamedesc.cpp -        llfloaternearbymedia.cpp +    llfloaternearbymedia.cpp      llfloaternotificationsconsole.cpp      llfloateropenobject.cpp      llfloaterparcel.cpp @@ -212,6 +213,7 @@ set(viewer_SOURCE_FILES      llfloaterurldisplay.cpp      llfloaterurlentry.cpp      llfloatervoicedevicesettings.cpp +    llfloatervolumepulldown.cpp      llfloaterwater.cpp      llfloaterwhitelistentry.cpp      llfloaterwindlight.cpp @@ -291,6 +293,7 @@ set(viewer_SOURCE_FILES      llnetmap.cpp      llnotificationalerthandler.cpp      llnotificationgrouphandler.cpp +    llnotificationhandlerutil.cpp      llnotificationmanager.cpp      llnotificationofferhandler.cpp      llnotificationscripthandler.cpp @@ -588,6 +591,7 @@ set(viewer_HEADER_FILES      llbox.h      llbreadcrumbview.h      llcallbacklist.h +    llcallfloater.h      llcallingcard.h      llcapabilitylistener.h      llcapabilityprovider.h diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index f196ebbf93..eb08707b61 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -907,6 +907,7 @@ static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");  static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");  static LLFastTimer::DeclareTimer FTM_DECODE("Image Decode");  static LLFastTimer::DeclareTimer FTM_VFS("VFS Thread"); +static LLFastTimer::DeclareTimer FTM_LFS("LFS Thread");  static LLFastTimer::DeclareTimer FTM_PAUSE_THREADS("Pause Threads");  static LLFastTimer::DeclareTimer FTM_IDLE("Idle");  static LLFastTimer::DeclareTimer FTM_PUMP("Pump"); @@ -1123,6 +1124,10 @@ bool LLAppViewer::mainLoop()  						LLFastTimer ftm(FTM_VFS);  	 					io_pending += LLVFSThread::updateClass(1);  					} +					{ +						LLFastTimer ftm(FTM_LFS); +	 					io_pending += LLLFSThread::updateClass(1); +					}  					if (io_pending > 1000)  					{ diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 327d80ba34..8f3eba98a6 100644 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -234,6 +234,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)  			// Check if cache already contains image_id for that avatar  			if (!updateFromCache())  			{ +				LLIconCtrl::setValue(mDefaultIconName);  				app->addObserver(mAvatarId, this);  				app->sendAvatarPropertiesRequest(mAvatarId);  			} diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp index bb03f47f46..202fbdebd4 100644 --- a/indra/newview/llavatarlist.cpp +++ b/indra/newview/llavatarlist.cpp @@ -153,6 +153,13 @@ void LLAvatarList::draw()  	}  } +//virtual +void LLAvatarList::clear() +{ +	getIDs().clear(); +	setDirty(true); +} +  void LLAvatarList::setNameFilter(const std::string& filter)  {  	if (mNameFilter != filter) @@ -363,37 +370,6 @@ void LLAvatarList::computeDifference(  	vadded.erase(it, vadded.end());  } -static std::string format_secs(S32 secs) -{ -	// *TODO: reinventing the wheel? -	// *TODO: i18n -	static const int LL_AL_MIN		= 60; -	static const int LL_AL_HOUR		= LL_AL_MIN * 60; -	static const int LL_AL_DAY		= LL_AL_HOUR * 24; -	static const int LL_AL_WEEK		= LL_AL_DAY * 7; -	static const int LL_AL_MONTH	= LL_AL_DAY * 31; -	static const int LL_AL_YEAR		= LL_AL_DAY * 365; - -    std::string s; - -    if (secs >= LL_AL_YEAR) -        s = llformat("%dy", secs / LL_AL_YEAR); -    else if (secs >= LL_AL_MONTH) -        s = llformat("%dmon", secs / LL_AL_MONTH); -    else if (secs >= LL_AL_WEEK) -        s = llformat("%dw", secs / LL_AL_WEEK); -    else if (secs >= LL_AL_DAY) -        s = llformat("%dd", secs / LL_AL_DAY); -    else if (secs >= LL_AL_HOUR) -        s = llformat("%dh", secs / LL_AL_HOUR); -    else if (secs >= LL_AL_MIN) -        s = llformat("%dm", secs / LL_AL_MIN); -    else -        s = llformat("%ds", secs); - -    return s; -} -  // Refresh shown time of our last interaction with all listed avatars.  void LLAvatarList::updateLastInteractionTimes()  { @@ -407,7 +383,7 @@ void LLAvatarList::updateLastInteractionTimes()  		LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);  		S32 secs_since = now - (S32) LLRecentPeople::instance().getDate(item->getAvatarId()).secondsSinceEpoch();  		if (secs_since >= 0) -			item->setLastInteractionTime(format_secs(secs_since)); +			item->setLastInteractionTime(secs_since);  	}  } diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h index 490f93e501..9058fec540 100644 --- a/indra/newview/llavatarlist.h +++ b/indra/newview/llavatarlist.h @@ -70,6 +70,8 @@ public:  	virtual void draw(); // from LLView +	virtual void clear(); +  	void setNameFilter(const std::string& filter);  	void setDirty(bool val = true)						{ mDirty = val; }  	uuid_vector_t& getIDs() 							{ return mIDs; } diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp index c670a65bcc..efc9538fa6 100644 --- a/indra/newview/llavatarlistitem.cpp +++ b/indra/newview/llavatarlistitem.cpp @@ -198,9 +198,9 @@ void LLAvatarListItem::showLastInteractionTime(bool show)  	mAvatarName->setRect(name_rect);  } -void LLAvatarListItem::setLastInteractionTime(const std::string& val) +void LLAvatarListItem::setLastInteractionTime(U32 secs_since)  { -	mLastInteractionTime->setValue(val); +	mLastInteractionTime->setValue(formatSeconds(secs_since));  }  void LLAvatarListItem::setShowInfoBtn(bool show) @@ -326,3 +326,51 @@ void LLAvatarListItem::reshapeAvatarName()  	mAvatarName->reshape(width, height);  } + +// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years", +// taking i18n into account. The format string to use is taken from the panel XML. +std::string LLAvatarListItem::formatSeconds(U32 secs) +{ +	static const U32 LL_ALI_MIN		= 60; +	static const U32 LL_ALI_HOUR	= LL_ALI_MIN	* 60; +	static const U32 LL_ALI_DAY		= LL_ALI_HOUR	* 24; +	static const U32 LL_ALI_WEEK	= LL_ALI_DAY	* 7; +	static const U32 LL_ALI_MONTH	= LL_ALI_DAY	* 30; +	static const U32 LL_ALI_YEAR	= LL_ALI_DAY	* 365; + +	std::string fmt;  +	U32 count = 0; + +	if (secs >= LL_ALI_YEAR) +	{ +		fmt = "FormatYears"; count = secs / LL_ALI_YEAR; +	} +	else if (secs >= LL_ALI_MONTH) +	{ +		fmt = "FormatMonths"; count = secs / LL_ALI_MONTH; +	} +	else if (secs >= LL_ALI_WEEK) +	{ +		fmt = "FormatWeeks"; count = secs / LL_ALI_WEEK; +	} +	else if (secs >= LL_ALI_DAY) +	{ +		fmt = "FormatDays"; count = secs / LL_ALI_DAY; +	} +	else if (secs >= LL_ALI_HOUR) +	{ +		fmt = "FormatHours"; count = secs / LL_ALI_HOUR; +	} +	else if (secs >= LL_ALI_MIN) +	{ +		fmt = "FormatMinutes"; count = secs / LL_ALI_MIN; +	} +	else +	{ +		fmt = "FormatSeconds"; count = secs; +	} + +	LLStringUtil::format_map_t args; +	args["[COUNT]"] = llformat("%u", count); +	return getString(fmt, args); +} diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h index 9d48101a44..341f5a6bcf 100644 --- a/indra/newview/llavatarlistitem.h +++ b/indra/newview/llavatarlistitem.h @@ -63,7 +63,7 @@ public:  	void setOnline(bool online);  	void setName(const std::string& name);  	void setAvatarId(const LLUUID& id, bool ignore_status_changes = false); -	void setLastInteractionTime(const std::string& val); +	void setLastInteractionTime(U32 secs_since);  	//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly  	void setShowProfileBtn(bool show);  	void setShowInfoBtn(bool show); @@ -94,6 +94,8 @@ private:  	void onNameCache(const std::string& first_name, const std::string& last_name); +	std::string formatSeconds(U32 secs); +  	LLAvatarIconCtrl* mAvatarIcon;  	LLTextBox* mAvatarName;  	LLTextBox* mLastInteractionTime; diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp new file mode 100644 index 0000000000..1b929eca0e --- /dev/null +++ b/indra/newview/llcallfloater.cpp @@ -0,0 +1,199 @@ +/**  + * @file llcallfloater.cpp + * @author Mike Antipov + * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...). + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llcallfloater.h" + +#include "llagentdata.h" // for gAgentID +#include "llavatarlist.h" +#include "llbottomtray.h" +#include "llparticipantlist.h" +#include "llspeakers.h" + + +LLCallFloater::LLCallFloater(const LLSD& key) +: LLDockableFloater(NULL, key) +, mSpeakerManager(NULL) +, mPaticipants(NULL) +, mAvatarList(NULL) +, mVoiceType(VC_LOCAL_CHAT) +{ + +} + +LLCallFloater::~LLCallFloater() +{ +	delete mPaticipants; +	mPaticipants = NULL; +} + +// virtual +BOOL LLCallFloater::postBuild() +{ +	LLDockableFloater::postBuild(); +	mAvatarList = getChild<LLAvatarList>("speakers_list"); + + +	LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel"); + +	setDockControl(new LLDockControl( +		anchor_panel, this, +		getDockTongue(), LLDockControl::TOP)); + +	initAgentData(); + +	// update list for current session +	updateSession(); + +	// subscribe to to be notified Voice Channel is changed +	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1)); +	return TRUE; +} + +// virtual +void LLCallFloater::onOpen(const LLSD& /*key*/) +{ +} + +////////////////////////////////////////////////////////////////////////// +/// PRIVATE SECTION +////////////////////////////////////////////////////////////////////////// +void LLCallFloater::updateSession() +{ +	LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); +	if (voice_channel) +	{ +		lldebugs << "Current voice channel: " << voice_channel->getSessionID() << llendl; + +		if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID()) +		{ +			lldebugs << "Speaker manager is already set for session: " << voice_channel->getSessionID() << llendl; +			return; +		} +		else +		{ +			mSpeakerManager = NULL; +		} +	} + +	const LLUUID& session_id = voice_channel->getSessionID(); +	lldebugs << "Set speaker manager for session: " << session_id << llendl; + +	LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id); +	if (im_session) +	{ +		mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id); +		switch (im_session->mType) +		{ +		case IM_NOTHING_SPECIAL: +		case IM_SESSION_P2P_INVITE: +			mVoiceType = VC_PEER_TO_PEER; +			break; +		case IM_SESSION_CONFERENCE_START: +			mVoiceType = VC_AD_HOC_CHAT; +			break; +		default: +			mVoiceType = VC_GROUP_CHAT; +			break; +		} +	} + +	if (NULL == mSpeakerManager) +	{ +		// by default let show nearby chat participants +		mSpeakerManager = LLLocalSpeakerMgr::getInstance(); +		lldebugs << "Set DEFAULT speaker manager" << llendl; +		mVoiceType = VC_LOCAL_CHAT; +	} + +	updateTitle(); +	refreshPartisipantList(); +} + +void LLCallFloater::refreshPartisipantList() +{ +	delete mPaticipants; +	mAvatarList->clear(); + +	bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager; +	mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat); + +	if (!do_not_use_context_menu_in_local_chat) +	{ +		mAvatarList->setNoItemsCommentText(getString("no_one_near")); +	} +} + +void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/) +{ +	updateSession(); +} + +void LLCallFloater::updateTitle() +{ +	LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel(); +	std::string title; +	switch (mVoiceType) +	{ +	case VC_LOCAL_CHAT: +		title = getString("title_nearby"); +		break; +	case VC_PEER_TO_PEER: +		title = voice_channel->getSessionName(); +		break; +	case VC_AD_HOC_CHAT: +		title = getString("title_adhoc"); +		break; +	case VC_GROUP_CHAT: +		LLStringUtil::format_map_t args; +		args["[GROUP]"] = voice_channel->getSessionName(); +		title = getString("title_group", args); +		break; +	} + +	setTitle(title); +} + +void LLCallFloater::initAgentData() +{ +	childSetValue("user_icon", gAgentID); + +	std::string name; +	gCacheName->getFullName(gAgentID, name); +	childSetValue("user_text", name); + +	LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator"); +	speaking_indicator->setSpeakerId(gAgentID); +} +//EOF diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h new file mode 100644 index 0000000000..8a440873ff --- /dev/null +++ b/indra/newview/llcallfloater.h @@ -0,0 +1,97 @@ +/**  + * @file llcallfloater.h + * @author Mike Antipov + * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...). + * + * $LicenseInfo:firstyear=2009&license=viewergpl$ + *  + * Copyright (c) 2009, Linden Research, Inc. + *  + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + *  + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + *  + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + *  + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + +#ifndef LL_LLCALLFLOATER_H +#define LL_LLCALLFLOATER_H + +#include "lldockablefloater.h" + +class LLAvatarList; +class LLParticipantList; +class LLSpeakerMgr; + +/** + * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button. + * It can be torn-off and freely positioned onscreen. + * + * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over  + * the Resident's own microphone input volume, the audible volume of each of the other participants, + * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording. + * + * When the Resident is engaged in Group Voice Chat, the Voice Control Panel also provides an  + * 'End Call' button to allow the Resident to leave that voice channel. + */ +class LLCallFloater : public LLDockableFloater +{ +public: +	LLCallFloater(const LLSD& key); +	~LLCallFloater(); + +	/*virtual*/ BOOL postBuild(); +	/*virtual*/ void onOpen(const LLSD& key); + +private: +	typedef enum e_voice_controls_type +	{ +		VC_LOCAL_CHAT, +		VC_GROUP_CHAT, +		VC_AD_HOC_CHAT, +		VC_PEER_TO_PEER +	}EVoiceControls; + +	/** +	 * Updates mSpeakerManager and list according to current Voice Channel +	 * +	 * It compares mSpeakerManager & current Voice Channel session IDs. +	 * If they are different gets Speaker manager related to current channel and updates channel participant list. +	 */ +	void updateSession(); + +	/** +	 * Refreshes participant list according to current Voice Channel +	 */ +	void refreshPartisipantList(); +	void onCurrentChannelChanged(const LLUUID& session_id); +	void updateTitle(); +	void initAgentData(); + +private: +	LLSpeakerMgr* mSpeakerManager; +	LLParticipantList* mPaticipants; +	LLAvatarList* mAvatarList; +	EVoiceControls mVoiceType; +}; + + +#endif //LL_LLCALLFLOATER_H + diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp index 476f1f41ac..714bd20ab8 100644 --- a/indra/newview/llcallingcard.cpp +++ b/indra/newview/llcallingcard.cpp @@ -633,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)  			{  				if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^  new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)  				{ -					std::string first, last; +					std::string name;  					LLSD args; -					if(gCacheName->getName(agent_id, first, last)) +					if(gCacheName->getFullName(agent_id, name))  					{ -						args["FIRST_NAME"] = first; -						args["LAST_NAME"] = last;	 +						args["NAME"] = name;  					} +					LLSD payload; +					payload["from_id"] = agent_id;  					if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)  					{ -						LLNotificationsUtil::add("GrantedModifyRights",args); +						LLNotificationsUtil::add("GrantedModifyRights",args, payload);  					}  					else  					{ -						LLNotificationsUtil::add("RevokedModifyRights",args); +						LLNotificationsUtil::add("RevokedModifyRights",args, payload);  					}  				}  				(mBuddyInfo[agent_id])->setRightsFrom(new_rights); diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp index d08be335c3..078c2518c6 100644 --- a/indra/newview/llchathistory.cpp +++ b/indra/newview/llchathistory.cpp @@ -199,7 +199,7 @@ public:  			userName->setValue(SL);  		} -		setTimeField(chat.mTimeStr); +		setTimeField(chat);  		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon"); @@ -267,11 +267,29 @@ protected:  	}  private: -	void setTimeField(const std::string& time_value) +	std::string appendTime(const LLChat& chat) +	{ +		time_t utc_time; +		utc_time = time_corrected(); +		std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" +			+LLTrans::getString("TimeMin")+"] "; + +		LLSD substitution; + +		substitution["datetime"] = (S32) utc_time; +		LLStringUtil::format (timeStr, substitution); + +		return timeStr; +	} + +	void setTimeField(const LLChat& chat)  	{  		LLTextBox* time_box = getChild<LLTextBox>("time_box");  		LLRect rect_before = time_box->getRect(); + +		std::string time_value = appendTime(chat); +  		time_box->setValue(time_value);  		// set necessary textbox width to fit all text @@ -284,7 +302,7 @@ private:  		time_box->translate(delta_pos_x, delta_pos_y);  		//... & change width of the name control -		LLUICtrl* user_name = getChild<LLUICtrl>("user_name"); +		LLView* user_name = getChild<LLView>("user_name");  		const LLRect& user_rect = user_name->getRect();  		user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());  	} @@ -386,7 +404,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		p.left_pad = mLeftWidgetPad;  		p.right_pad = mRightWidgetPad; -		if (mLastFromName == chat.mFromName) +		LLDate new_message_time = LLDate::now(); + +		if (mLastFromName == chat.mFromName &&  +			mLastMessageTime.notNull() && +			(new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0 )  		{  			view = getSeparator();  			p.top_pad = mTopSeparatorPad; @@ -414,6 +436,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_  		appendWidget(p, header_text, false);  		mLastFromName = chat.mFromName; +		mLastMessageTime = new_message_time;  	}  	//Handle IRC styled /me messages.  	std::string prefix = chat.mText.substr(0, 4); diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h index ef5839ff2f..d2cfa53d8b 100644 --- a/indra/newview/llchathistory.h +++ b/indra/newview/llchathistory.h @@ -114,6 +114,7 @@ class LLChatHistory : public LLTextEditor  	private:  		std::string mLastFromName; +		LLDate mLastMessageTime;  		std::string mMessageHeaderFilename;  		std::string mMessageSeparatorFilename; diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp index 8a6935b71b..efdaff3f6a 100644 --- a/indra/newview/llchatitemscontainerctrl.cpp +++ b/indra/newview/llchatitemscontainerctrl.cpp @@ -44,27 +44,12 @@  #include "llviewercontrol.h"  #include "llagentdata.h" -/* -static const S32 BORDER_MARGIN = 2; -static const S32 PARENT_BORDER_MARGIN = 0; - -static const S32 HORIZONTAL_MULTIPLE = 8; -static const S32 VERTICAL_MULTIPLE = 16; -static const F32 MIN_AUTO_SCROLL_RATE = 120.f; -static const F32 MAX_AUTO_SCROLL_RATE = 500.f; -static const F32 AUTO_SCROLL_RATE_ACCEL = 120.f; - -#define MAX_CHAT_HISTORY 100 -*/ - -static const S32 msg_left_offset = 30; +static const S32 msg_left_offset = 10;  static const S32 msg_right_offset = 10; -static const S32 msg_height_pad = 2; - -//static LLDefaultChildRegistry::Register<LLChatItemsContainerCtrl>	t2("chat_items_container"); +static const S32 msg_height_pad = 5;  //******************************************************************************************************************* -//LLChatItemCtrl +//LLNearbyChatToastPanel  //*******************************************************************************************************************  LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance() @@ -79,22 +64,22 @@ void	LLNearbyChatToastPanel::reshape		(S32 width, S32 height, BOOL called_from_p  {  	LLPanel::reshape(width, height,called_from_parent); -	// *NOTE: we must check if child items exist because reshape is called from the  -	// LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet -	LLPanel* caption = findChild<LLPanel>("msg_caption", false); -	LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text" ,false); -	if(caption && msg_text) -	{ -		LLRect caption_rect = caption->getRect(); -		caption_rect.setLeftTopAndSize( 2, height, width - 4, caption_rect.getHeight()); -		caption->reshape( width - 4, caption_rect.getHeight(), 1); -		caption->setRect(caption_rect); - -		LLRect msg_text_rect = msg_text->getRect(); -		msg_text_rect.setLeftTopAndSize( msg_left_offset, height - caption_rect.getHeight() , width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight()); -		msg_text->reshape( width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight(), 1); -		msg_text->setRect(msg_text_rect); -	} +	LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false); +	LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false); + +	LLRect msg_text_rect = msg_text->getRect(); +	LLRect avatar_rect = icon->getRect(); +	 +	avatar_rect.setLeftTopAndSize(2,height-2,avatar_rect.getWidth(),avatar_rect.getHeight()); +	icon->setRect(avatar_rect); + + +	msg_text_rect.setLeftTopAndSize( avatar_rect.mRight + msg_left_offset,  +		height - msg_height_pad,  +		width - avatar_rect.mRight  - msg_left_offset - msg_right_offset,  +		height - 2*msg_height_pad); +	msg_text->reshape( msg_text_rect.getWidth(), msg_text_rect.getHeight(), 1); +	msg_text->setRect(msg_text_rect);  }  BOOL LLNearbyChatToastPanel::postBuild() @@ -102,37 +87,63 @@ BOOL LLNearbyChatToastPanel::postBuild()  	return LLPanel::postBuild();  } - -std::string LLNearbyChatToastPanel::appendTime() +void LLNearbyChatToastPanel::addMessage(LLSD& notification)  { -	time_t utc_time; -	utc_time = time_corrected(); -	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" -		+LLTrans::getString("TimeMin")+"] "; +	std::string		messageText = notification["message"].asString();		// UTF-8 line of text -	LLSD substitution; +	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	substitution["datetime"] = (S32) utc_time; -	LLStringUtil::format (timeStr, substitution); +	std::string color_name = notification["text_color"].asString(); +	 +	LLColor4 textColor = LLUIColorTable::instance().getColor(color_name); +	textColor.mV[VALPHA] =notification["color_alpha"].asReal(); +	 +	S32 font_size = notification["font_size"].asInteger(); -	return timeStr; -} +	LLFontGL*       messageFont; +	switch(font_size) +	{ +		case 0:	messageFont = LLFontGL::getFontSansSerifSmall(); break; +		default: +		case 1: messageFont = LLFontGL::getFontSansSerif();	    break; +		case 2:	messageFont = LLFontGL::getFontSansSerifBig();	break; +	} +	//append text +	{ +		LLStyle::Params style_params; +		style_params.color(textColor); +		std::string font_name = LLFontGL::nameFromFont(messageFont); +		std::string font_style_size = LLFontGL::sizeFromFont(messageFont); +		style_params.font.name(font_name); +		style_params.font.size(font_style_size); +		int chat_type = notification["chat_type"].asInteger(); + +		if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC) +		{ +			messageText = messageText.substr(3); +			style_params.font.style = "ITALIC"; +		} +		else if( chat_type == CHAT_TYPE_SHOUT) +		{ +			style_params.font.style = "BOLD"; +		} +		else if( chat_type == CHAT_TYPE_WHISPER) +		{ +			style_params.font.style = "ITALIC"; +		} +		msg_text->appendText(messageText, TRUE, style_params); +	} + +	snapToMessageHeight(); -void	LLNearbyChatToastPanel::addText	(const std::string& message , const LLStyle::Params& input_params) -{ -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	msg_text->addText(message , input_params); -	mMessages.push_back(message);  }  void LLNearbyChatToastPanel::init(LLSD& notification)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); - -	mText = notification["message"].asString();		// UTF-8 line of text -	mFromName = notification["from"].asString();	// agent or object name +	std::string		messageText = notification["message"].asString();		// UTF-8 line of text +	std::string		fromName = notification["from"].asString();	// agent or object name  	mFromID = notification["from_id"].asUUID();		// agent id or object id  	int sType = notification["source"].asInteger(); @@ -140,192 +151,121 @@ void LLNearbyChatToastPanel::init(LLSD& notification)  	std::string color_name = notification["text_color"].asString(); -	mTextColor = LLUIColorTable::instance().getColor(color_name); -	mTextColor.mV[VALPHA] =notification["color_alpha"].asReal(); +	LLColor4 textColor = LLUIColorTable::instance().getColor(color_name); +	textColor.mV[VALPHA] =notification["color_alpha"].asReal();  	S32 font_size = notification["font_size"].asInteger(); + +	LLFontGL*       messageFont;  	switch(font_size)  	{ -		case 0: -			mFont = LLFontGL::getFontSansSerifSmall(); -			break; +		case 0:	messageFont = LLFontGL::getFontSansSerifSmall(); break;  		default: -		case 1: -			mFont = LLFontGL::getFontSansSerif(); -			break; -		case 2: -			mFont = LLFontGL::getFontSansSerifBig(); -			break; +		case 1: messageFont = LLFontGL::getFontSansSerif();	    break; +		case 2:	messageFont = LLFontGL::getFontSansSerifBig();	break;  	} -	LLStyle::Params style_params; -	style_params.color(mTextColor); -//	style_params.font(mFont); -	std::string font_name = LLFontGL::nameFromFont(mFont); -	std::string font_style_size = LLFontGL::sizeFromFont(mFont); -	style_params.font.name(font_name); -	style_params.font.size(font_style_size); +	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); + +	msg_text->setText(std::string(""));  	std::string str_sender;  	if(gAgentID != mFromID) -		str_sender = mFromName; +		str_sender = fromName;  	else -		str_sender = LLTrans::getString("You");; +		str_sender = LLTrans::getString("You"); -	caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params); -	 -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); +	str_sender+=" "; +	//append user name +	{ +		LLStyle::Params style_params_name; + +		LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor"); + +		style_params_name.color(userNameColor); +		 +		std::string font_name = LLFontGL::nameFromFont(messageFont); +		std::string font_style_size = LLFontGL::sizeFromFont(messageFont); +		style_params_name.font.name(font_name); +		style_params_name.font.size(font_style_size); +		 +		msg_text->appendText(str_sender, FALSE, style_params_name); +		 +	} -	if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC) +	//append text  	{ -		if (mFromName.size() > 0) +		LLStyle::Params style_params; +		style_params.color(textColor); +		std::string font_name = LLFontGL::nameFromFont(messageFont); +		std::string font_style_size = LLFontGL::sizeFromFont(messageFont); +		style_params.font.name(font_name); +		style_params.font.size(font_style_size); + +		int chat_type = notification["chat_type"].asInteger(); + +		if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)  		{ +			messageText = messageText.substr(3);  			style_params.font.style = "ITALIC"; -			 -			msg_text->setText(mFromName, style_params);  		} -		mText = mText.substr(3); -		style_params.font.style = "ITALIC"; -#define INFINITE_REFLOW_BUG 0 -#if INFINITE_REFLOW_BUG -		// This causes LLTextBase::reflow() to infinite loop until the viewer -		// runs out of memory, throws a bad_alloc exception from std::vector -		// in mLineInfoList, and the main loop catches it and continues. -		// It appears to be caused by addText() adding a line separator in the -		// middle of a line.  See EXT-2579, EXT-1949 -		msg_text->addText(mText,style_params); -#else -		msg_text->appendText(mText, FALSE, style_params); -#endif -	} -	else  -	{ -		msg_text->setText(mText, style_params); +		else if( chat_type == CHAT_TYPE_SHOUT) +		{ +			style_params.font.style = "BOLD"; +		} +		else if( chat_type == CHAT_TYPE_WHISPER) +		{ +			style_params.font.style = "ITALIC"; +		} +		msg_text->appendText(messageText, FALSE, style_params);  	} -	 -	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -	if(mSourceType != CHAT_SOURCE_AGENT) -		msg_inspector->setVisible(false); - -	mMessages.clear(); - -	snapToMessageHeight	(); +	snapToMessageHeight();  	mIsDirty = true;//will set Avatar Icon in draw  } -void	LLNearbyChatToastPanel::setMessage	(const LLChat& chat_msg) -{ -	LLSD notification; -	notification["message"] = chat_msg.mText; -	notification["from"] = chat_msg.mFromName; -	notification["from_id"] = chat_msg.mFromID; -	notification["time"] = chat_msg.mTime; -	notification["source"] = (S32)chat_msg.mSourceType; -	notification["chat_type"] = (S32)chat_msg.mChatType; -	notification["chat_style"] = (S32)chat_msg.mChatStyle; -	 -	std::string r_color_name="White"; -	F32 r_color_alpha = 1.0f;  -	LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha); -	 -	notification["text_color"] = r_color_name; -	notification["color_alpha"] = r_color_alpha; -	 -	notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ; -	init(notification); - -} -  void	LLNearbyChatToastPanel::snapToMessageHeight	()  {  	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false); -	S32 new_height = text_box->getTextPixelHeight() + msg_height_pad; +	S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25); +	  	LLRect panel_rect = getRect(); -	S32 caption_height = 0; -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); -	caption_height = caption->getRect().getHeight(); - -	panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), caption_height + new_height); +	panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), new_height); -	reshape( getRect().getWidth(), caption_height + new_height, 1); +	reshape( getRect().getWidth(), getRect().getHeight(), 1);  	setRect(panel_rect);  } - -void	LLNearbyChatToastPanel::setWidth(S32 width) -{ -	LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false); -	text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/); - -	LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false); -	 -	LLStyle::Params style_params; -	style_params.color(mTextColor); -	style_params.font(mFont); -	 -	 -	if(mText.length()) -		msg_text->setText(mText, style_params); -	 -	for(size_t i=0;i<mMessages.size();++i) -		msg_text->addText(mMessages[i] , style_params); - -	setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width	, getRect().mBottom)); -	snapToMessageHeight	(); -} -  void LLNearbyChatToastPanel::onMouseLeave			(S32 x, S32 y, MASK mask)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); -	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -	msg_inspector->setVisible(false);  }  void LLNearbyChatToastPanel::onMouseEnter				(S32 x, S32 y, MASK mask)  {  	if(mSourceType != CHAT_SOURCE_AGENT)  		return; -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); -	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -	msg_inspector->setVisible(true);  }  BOOL	LLNearbyChatToastPanel::handleMouseDown	(S32 x, S32 y, MASK mask)  {  	if(mSourceType != CHAT_SOURCE_AGENT)  		return LLPanel::handleMouseDown(x,y,mask); -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); -	LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector"); -	S32 local_x = x - msg_inspector->getRect().mLeft - caption->getRect().mLeft; -	S32 local_y = y - msg_inspector->getRect().mBottom - caption->getRect().mBottom; -	if(msg_inspector->pointInView(local_x, local_y)) -	{ -		LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mFromID)); -	} -	else -	{ -		LLFloaterReg::showInstance("nearby_chat",LLSD()); -	} +	LLFloaterReg::showInstance("nearby_chat",LLSD());  	return LLPanel::handleMouseDown(x,y,mask);  }  void	LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); - -	LLUICtrl* icon = caption->getChild<LLUICtrl>("avatar_icon", false); -	LLUICtrl* name = caption->getChild<LLUICtrl>("sender_name", false); - -	icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH); -	name->setVisible(e == CHATITEMHEADER_SHOW_ONLY_NAME || e==CHATITEMHEADER_SHOW_BOTH); +	LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false); +	if(icon) +		icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);  } @@ -339,11 +279,10 @@ bool	LLNearbyChatToastPanel::canAddText	()  BOOL	LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)  { -	LLPanel* caption = getChild<LLPanel>("msg_caption", false); -	LLUICtrl* avatar_icon = caption->getChild<LLUICtrl>("avatar_icon", false); +	LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false); -	S32 local_x = x - avatar_icon->getRect().mLeft - caption->getRect().mLeft; -	S32 local_y = y - avatar_icon->getRect().mBottom - caption->getRect().mBottom; +	S32 local_x = x - avatar_icon->getRect().mLeft; +	S32 local_y = y - avatar_icon->getRect().mBottom;  	//eat message for avatar icon if msg was from object  	if(avatar_icon->pointInView(local_x, local_y) && mSourceType != CHAT_SOURCE_AGENT) @@ -354,9 +293,12 @@ void LLNearbyChatToastPanel::draw()  {  	if(mIsDirty)  	{ -		LLPanel* caption = findChild<LLPanel>("msg_caption", false); -		if(caption) -			caption->getChild<LLAvatarIconCtrl>("avatar_icon", false)->setValue(mFromID); +		LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false); +		if(icon) +		{ +			icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT); +			icon->setValue(mFromID); +		}  		mIsDirty = false;  	}  	LLToastPanelBase::draw(); diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h index a65bfedd09..0a85c52401 100644 --- a/indra/newview/llchatitemscontainerctrl.h +++ b/indra/newview/llchatitemscontainerctrl.h @@ -59,9 +59,8 @@ public:  	const LLUUID& getFromID() const { return mFromID;} -	void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params()); -	void	setMessage	(const LLChat& msg); -	void	setWidth		(S32 width); +	//void	addText		(const std::string& message ,  const LLStyle::Params& input_params = LLStyle::Params()); +	//void	setMessage	(const LLChat& msg);  	void	snapToMessageHeight	();  	bool	canAddText	(); @@ -78,22 +77,16 @@ public:  	BOOL	handleRightMouseDown(S32 x, S32 y, MASK mask);  	virtual void init(LLSD& data); +	virtual void addMessage(LLSD& data);  	virtual void draw(); -private: -	 -	std::string appendTime	(); +	const LLUUID&	messageID() const { return mFromID;}  private: -	std::string		mText;		// UTF-8 line of text -	std::string		mFromName;	// agent or object name  	LLUUID			mFromID;	// agent id or object id  	EChatSourceType	mSourceType; -	LLColor4        mTextColor; -	LLFontGL*       mFont; - +	 -	std::vector<std::string> mMessages;  	bool mIsDirty;  }; diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 80b0a430e0..58c0c19761 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -269,10 +269,10 @@ LLSD LLFloaterAbout::getInfo()  	info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();  	bool want_fullname = true;  	info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD(); -	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown"; +	info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");  	// TODO: Implement media plugin version query -	info["QT_WEBKIT_VERSION"] = "4.5.2"; +	info["QT_WEBKIT_VERSION"] = "4.5.2 (version number hard-coded)";  	if (gPacketsIn > 0)  	{ diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp index 92e958b32d..764aff68c9 100644 --- a/indra/newview/llfloatercamera.cpp +++ b/indra/newview/llfloatercamera.cpp @@ -215,17 +215,38 @@ void LLFloaterCamera::onOpen(const LLSD& key)  		getDockTongue(), LLDockControl::TOP));  	mZoom->onOpen(key); + +	// Returns to previous mode, see EXT-2727(View tool should remember state). +	// In case floater was just hidden and it isn't reset the mode +	// just update state to current one. Else go to previous. +	if ( !mClosed ) +		updateState(); +	else +		toPrevMode(); +	mClosed = FALSE;  }  void LLFloaterCamera::onClose(bool app_quitting)  {  	//We don't care of camera mode if app is quitting -	if(!app_quitting) -		switchMode(CAMERA_CTRL_MODE_ORBIT); +	if(app_quitting) +		return; +	// When mCurrMode is in CAMERA_CTRL_MODE_ORBIT +	// switchMode won't modify mPrevMode, so force it here. +	// It is needed to correctly return to previous mode on open, see EXT-2727. +	if (mCurrMode == CAMERA_CTRL_MODE_ORBIT) +		mPrevMode = CAMERA_CTRL_MODE_ORBIT; + +	// HACK: Should always close as docked to prevent toggleInstance without calling onOpen. +	if ( !isDocked() ) +		setDocked(true); +	switchMode(CAMERA_CTRL_MODE_ORBIT); +	mClosed = TRUE;  }  LLFloaterCamera::LLFloaterCamera(const LLSD& val)  :	LLTransientDockableFloater(NULL, true, val), +	mClosed(FALSE),  	mCurrMode(CAMERA_CTRL_MODE_ORBIT),  	mPrevMode(CAMERA_CTRL_MODE_ORBIT)  { diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h index 4873a34e00..5d44b4944d 100644 --- a/indra/newview/llfloatercamera.h +++ b/indra/newview/llfloatercamera.h @@ -109,6 +109,7 @@ private:  	void assignButton2Mode(ECameraControlMode mode, const std::string& button_name); +	BOOL mClosed;  	ECameraControlMode mPrevMode;  	ECameraControlMode mCurrMode;  	std::map<ECameraControlMode, LLButton*> mMode2Button; diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp index 0f8e4c10d7..9d05d9de34 100644 --- a/indra/newview/llfloatergesture.cpp +++ b/indra/newview/llfloatergesture.cpp @@ -304,7 +304,7 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur  		{  			font_style = "BOLD";  		} - +		item_name = gesture->mName;  		element["columns"][0]["column"] = "trigger";  		element["columns"][0]["value"] = gesture->mTrigger;  		element["columns"][0]["font"]["name"] = "SANSSERIF"; diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp index 44e68d7745..f7ce826a39 100644 --- a/indra/newview/llfloatermediasettings.cpp +++ b/indra/newview/llfloatermediasettings.cpp @@ -41,6 +41,7 @@  #include "lluictrlfactory.h"  #include "llbutton.h"  #include "llselectmgr.h" +#include "llsdutil.h"  LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL; @@ -145,15 +146,15 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()  //static   void LLFloaterMediaSettings::apply()  { -    LLSD settings; +	LLSD settings;  	sInstance->mPanelMediaSettingsGeneral->preApply(); -    sInstance->mPanelMediaSettingsGeneral->getValues( settings ); +	sInstance->mPanelMediaSettingsGeneral->getValues( settings );  	sInstance->mPanelMediaSettingsSecurity->preApply();  	sInstance->mPanelMediaSettingsSecurity->getValues( settings );  	sInstance->mPanelMediaSettingsPermissions->preApply(); -    sInstance->mPanelMediaSettingsPermissions->getValues( settings ); +	sInstance->mPanelMediaSettingsPermissions->getValues( settings );  	LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA ); -    LLSelectMgr::getInstance()->selectionSetMediaData(settings); +	LLSelectMgr::getInstance()->selectionSetMediaData(settings);  	sInstance->mPanelMediaSettingsGeneral->postApply();  	sInstance->mPanelMediaSettingsSecurity->postApply();  	sInstance->mPanelMediaSettingsPermissions->postApply(); @@ -183,7 +184,12 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab  	sInstance->mPanelMediaSettingsPermissions->  		initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable ); - +	 +	// Squirrel away initial values  +	sInstance->mInitialValues.clear(); +	sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues ); +	sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues ); +	sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );  }  //////////////////////////////////////////////////////////////////////////////// @@ -206,7 +212,7 @@ void LLFloaterMediaSettings::clearValues( bool editable)  {  	// clean up all panels before updating  	sInstance->mPanelMediaSettingsGeneral	 ->clearValues(sInstance->mPanelMediaSettingsGeneral,  editable); -	sInstance->mPanelMediaSettingsSecurity	 ->clearValues(sInstance->mPanelMediaSettingsSecurity,  editable); +	sInstance->mPanelMediaSettingsSecurity	 ->clearValues(sInstance->mPanelMediaSettingsSecurity,	editable);  	sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions,  editable);	  } @@ -235,7 +241,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )  // static  void LLFloaterMediaSettings::onBtnCancel( void* userdata )  { - 	sInstance->closeFloater();  +	sInstance->closeFloater();   }  //////////////////////////////////////////////////////////////////////////////// @@ -250,7 +256,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)  //  void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )  { -	setCtrlsEnabled( enable );  	childSetEnabled( "OK", enable );  	childSetEnabled( "Apply", enable );  } @@ -265,7 +270,6 @@ const std::string LLFloaterMediaSettings::getHomeUrl()  		return std::string( "" );  } -  ////////////////////////////////////////////////////////////////////////////////  //  bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url ) @@ -279,3 +283,36 @@ bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )  		// this is all we can do  		return false;  } + +//////////////////////////////////////////////////////////////////////////////// +// virtual  +void LLFloaterMediaSettings::draw() +{ +	// *NOTE: The code below is very inefficient.  Better to do this +	// only when data change. +	// Every frame, check to see what the values are.  If they are not +	// the same as the default media data, enable the OK/Apply buttons +	LLSD settings; +	sInstance->mPanelMediaSettingsGeneral->getValues( settings ); +	sInstance->mPanelMediaSettingsSecurity->getValues( settings ); +	sInstance->mPanelMediaSettingsPermissions->getValues( settings ); + +	bool values_changed = false; +	 +	LLSD::map_const_iterator iter = settings.beginMap(); +	LLSD::map_const_iterator end = settings.endMap(); +	for ( ; iter != end; ++iter ) +	{ +		const std::string ¤t_key = iter->first; +		const LLSD ¤t_value = iter->second; +		if ( ! llsd_equals(current_value, mInitialValues[current_key])) +		{ +			values_changed = true; +			break; +		} +	} +	 +	enableOkApplyBtns(values_changed); +	 +	LLFloater::draw(); +} diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h index 17a47cb0f5..e2af1705bf 100644 --- a/indra/newview/llfloatermediasettings.h +++ b/indra/newview/llfloatermediasettings.h @@ -54,11 +54,13 @@ public:  	static void apply();  	static void initValues( const LLSD& media_settings , bool editable);  	static void clearValues( bool editable); -	void enableOkApplyBtns( bool enable ); -	LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;}; -	const std::string getHomeUrl(); + +	LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};	 +	const std::string getHomeUrl();	  	bool passesWhiteList( const std::string& test_url ); +	virtual void	draw(); +  	bool mIdenticalHasMediaInfo;  	bool mMultipleMedia;  	bool mMultipleValidMedia; @@ -83,6 +85,10 @@ protected:  	static LLFloaterMediaSettings* sInstance;  private: + +	void enableOkApplyBtns( bool enable ); +	 +	LLSD mInitialValues;  	bool mWaitingToClose;  }; diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp index e2df2ffdf7..c8ff36b4f4 100644 --- a/indra/newview/llfloatersearch.cpp +++ b/indra/newview/llfloatersearch.cpp @@ -37,6 +37,7 @@  #include "lllogininstance.h"  #include "lluri.h"  #include "llagent.h" +#include "llui.h"  LLFloaterSearch::LLFloaterSearch(const LLSD& key) :  	LLFloater(key), @@ -139,6 +140,9 @@ void LLFloaterSearch::search(const LLSD &key)  	}  	url += "&r=" + maturity; +	// add the current localization information +	url += "&lang=" + LLUI::getLanguage(); +  	// and load the URL in the web view  	mBrowser->navigateTo(url);  } diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index 77a2cbcfca..18ff53c127 100644 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -73,6 +73,7 @@ LLGestureManager::LLGestureManager()  	mActive(),  	mLoadingCount(0)  { +	mRetryIfMissing = true;  	gInventory.addObserver(this);  } @@ -984,7 +985,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,  			else  			{  				// Watch this item and set gesture name when item exists in inventory -				self.watchItem(item_id); +				item_ref_t ids; +				ids.push_back(item_id); +				self.fetchItems(ids);  			}  			self.mActive[item_id] = gesture; @@ -1177,6 +1180,7 @@ void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids)  void LLGestureManager::done()  { +	bool notify = false;  	for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)  	{  		if(it->second && it->second->mName.empty()) @@ -1185,10 +1189,14 @@ void LLGestureManager::done()  			if(item)  			{  				it->second->mName = item->getName(); +				notify = true;  			}  		}  	} -	notifyObservers(); +	if(notify) +	{ +		notifyObservers(); +	}  }  // static diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h index 094ca13798..e80eea9ae9 100644 --- a/indra/newview/llgesturemgr.h +++ b/indra/newview/llgesturemgr.h @@ -54,7 +54,7 @@ public:  	virtual void changed() = 0;  }; -class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver +class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryFetchObserver  {  public: diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp index ee93a9349a..5e9ffdf410 100644 --- a/indra/newview/llimfloater.cpp +++ b/indra/newview/llimfloater.cpp @@ -34,6 +34,8 @@  #include "llimfloater.h" +#include "llnotificationsutil.h" +  #include "llagent.h"  #include "llappviewer.h"  #include "llbutton.h" @@ -529,7 +531,6 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*  		//in disconnected state IM input editor should be disabled  		self->mInputEditor->setEnabled(!gDisconnected);  	} -	self->mChatHistory->setCursorAndScrollToEnd();  }  // static @@ -635,6 +636,9 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)  				else  					label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);  				mInputEditor->setLabel(label); + +				if (moderator_muted_text) +					LLNotificationsUtil::add("TextChatIsMutedByModerator");  			}  		}  	} diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp index c096b5220a..be719c0a78 100644 --- a/indra/newview/llimview.cpp +++ b/indra/newview/llimview.cpp @@ -165,6 +165,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  	{  		mVoiceChannel = new LLVoiceChannelGroup(session_id, name);  	} + +	if(mVoiceChannel) +	{ +		mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2)); +	}  	mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);  	// All participants will be added to the list of people we've recently interacted with. @@ -191,6 +196,56 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&  		LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);  } +void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) +{ +	bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel); +	bool is_incoming_call = false; +	std::string other_avatar_name; + +	if(is_p2p_session) +	{ +		is_incoming_call = static_cast<LLVoiceChannelP2P*>(mVoiceChannel)->isIncomingCall(); +		gCacheName->getFullName(mOtherParticipantID, other_avatar_name); + +		if(is_incoming_call) +		{ +			switch(new_state) +			{ +			case LLVoiceChannel::STATE_CALL_STARTED : +				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call"); +				break; +			case LLVoiceChannel::STATE_CONNECTED : +				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call"); +			default: +				break; +			} +		} +		else // outgoing call +		{ +			switch(new_state) +			{ +			case LLVoiceChannel::STATE_CALL_STARTED : +				LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call"); +				break; +			case LLVoiceChannel::STATE_CONNECTED : +				LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call"); +			default: +				break; +			} +		} + +		// Update speakers list when connected +		if (LLVoiceChannel::STATE_CONNECTED == new_state) +		{ +			mSpeakers->update(true); +		} +	} +	else  // group || ad-hoc calls +	{ + +	} +} +  LLIMModel::LLIMSession::~LLIMSession()  {  	delete mSpeakers; @@ -396,6 +451,19 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,  	return true;  } +bool LLIMModel::logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) +{ +	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) +	{ +		LLLogChat::saveHistory(session_name, from, from_id, utf8_text); +		return true; +	} +	else +	{ +		return false; +	} +} +  bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)  {  	if (gSavedPerAccountSettings.getBOOL("LogInstantMessages")) @@ -430,7 +498,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co  						   const std::string& utf8_text, bool log2file /* = true */) {   	LLIMSession* session = findIMSession(session_id); -	if (!session)  +	if (!session)  	{  		llwarns << "session " << session_id << "does not exist " << llendl;  		return false; @@ -1150,7 +1218,7 @@ BOOL LLOutgoingCallDialog::postBuild()  	childSetAction("Cancel", onCancel, this);  	// dock the dialog to the sys well, where other sys messages appear -	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), +	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),  					 this, getDockTongue(), LLDockControl::TOP,  					 boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1))); @@ -1227,7 +1295,7 @@ void LLIncomingCallDialog::onOpen(const LLSD& key)  	}  	// dock the dialog to the sys well, where other sys messages appear -	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(), +	setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),  									 this, getDockTongue(), LLDockControl::TOP,  									 boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));  } diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h index 62a54bc081..40e3a8fb69 100644 --- a/indra/newview/llimview.h +++ b/indra/newview/llimview.h @@ -61,6 +61,7 @@ public:  		void sessionInitReplyReceived(const LLUUID& new_session_id);  		void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time); +		void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);  		static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);  		LLUUID mSessionID; @@ -199,6 +200,11 @@ public:  	void testMessages(); +	/** +	 * Saves an IM message into a file +	 */ +	bool logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text); +  private:  	/** diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 941ccc227c..9caa863bd8 100644 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -77,12 +77,12 @@ std::string LLLogChat::timestamp(bool withdate)  		          +LLTrans::getString ("TimeMonth")+"]/["  				  +LLTrans::getString ("TimeDay")+"] ["  				  +LLTrans::getString ("TimeHour")+"]:[" -				  +LLTrans::getString ("TimeMin")+"] "; +				  +LLTrans::getString ("TimeMin")+"]";  	}  	else  	{  		timeStr = "[" + LLTrans::getString("TimeHour") + "]:[" -			      + LLTrans::getString ("TimeMin")+"] ";  +			      + LLTrans::getString ("TimeMin")+"]";  	}  	LLStringUtil::format (timeStr, substitution); diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 80a6cc343f..8f1dec1431 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -130,6 +130,21 @@ void    LLNearbyChat::applySavedVariables()  	}  } +std::string appendTime() +{ +	time_t utc_time; +	utc_time = time_corrected(); +	std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:[" +		+LLTrans::getString("TimeMin")+"] "; + +	LLSD substitution; + +	substitution["datetime"] = (S32) utc_time; +	LLStringUtil::format (timeStr, substitution); + +	return timeStr; +} +  void	LLNearbyChat::addMessage(const LLChat& chat)  {  	if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) @@ -150,11 +165,18 @@ void	LLNearbyChat::addMessage(const LLChat& chat)  			return;  		}  	} + +	bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");  	if (!chat.mMuted)  	{  		std::string message = chat.mText; -		std::string prefix = message.substr(0, 4); + + +		LLChat& tmp_chat = const_cast<LLChat&>(chat); + +		if(tmp_chat.mTimeStr.empty()) +			tmp_chat.mTimeStr = appendTime();  		if (chat.mChatStyle == CHAT_STYLE_IRC)  		{ @@ -173,7 +195,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)  				append_style_params.font.style = "ITALIC";  				LLChat add_chat=chat;  				add_chat.mText = chat.mFromName + " "; -				mChatHistory->appendMessage(add_chat, false, append_style_params); +				mChatHistory->appendMessage(add_chat, use_plain_text_chat_history, append_style_params);  			}  			message = message.substr(3); @@ -182,7 +204,7 @@ void	LLNearbyChat::addMessage(const LLChat& chat)  		}  		else  		{ -			mChatHistory->appendMessage(chat); +			mChatHistory->appendMessage(chat,use_plain_text_chat_history);  		}  	}  } @@ -206,13 +228,23 @@ bool	LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)  	return false;  } -void	LLNearbyChat::onOpen(const LLSD& key ) +void	LLNearbyChat::setVisible(BOOL visible)  { -	LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); -	if(chat_channel) +	if(visible)  	{ -		chat_channel->removeToastsFromChannel(); +		LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); +		if(chat_channel) +		{ +			chat_channel->removeToastsFromChannel(); +		}  	} + +	LLDockableFloater::setVisible(visible); +} + +void	LLNearbyChat::onOpen(const LLSD& key ) +{ +	LLDockableFloater::onOpen(key);  }  void LLNearbyChat::setRect	(const LLRect &rect) diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 561c2d3677..efcaf4263b 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -53,6 +53,8 @@ public:  	/*virtual*/ void	onOpen	(const LLSD& key); +	/*virtual*/ void	setVisible(BOOL visible); +  	virtual void setRect		(const LLRect &rect);  private: diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp index 74a75d0369..b0b6db682c 100644 --- a/indra/newview/llnearbychathandler.cpp +++ b/indra/newview/llnearbychathandler.cpp @@ -52,8 +52,6 @@ using namespace LLNotificationsUI;  LLToastPanelBase* createToastPanel()  {  	LLNearbyChatToastPanel* item = LLNearbyChatToastPanel::createInstance(); -	static S32 chat_item_width = 304; -	item->setWidth(chat_item_width);  	return item;  } @@ -169,6 +167,29 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)  	//look in pool. if there is any message  	if(mStopProcessing)  		return; + +	/* +    find last toast and check ID +	*/ + +	if(m_active_toasts.size()) +	{ +		LLUUID fromID = notification["from_id"].asUUID();		// agent id or object id +		LLToast* toast = m_active_toasts[0]; +		LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel()); + +		if(panel && panel->messageID() == fromID && panel->canAddText()) +		{ +			panel->addMessage(notification); +			toast->reshapeToPanel(); +			toast->resetTimer(); +	 +			arrangeToasts(); +			return; +		} +	} +	 +  	if(m_toast_pool.empty())  	{ diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp index 2e7f95660a..6889931956 100644 --- a/indra/newview/llnotificationgrouphandler.cpp +++ b/indra/newview/llnotificationgrouphandler.cpp @@ -88,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify)  	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")  	{ +		LLHandlerUtil::logGroupNoticeToIMGroup(notification); +  		LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);  		LLToast::Params p;  		p.notif_id = notification->getID(); diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h index 29664e1919..da8928321a 100644 --- a/indra/newview/llnotificationhandler.h +++ b/indra/newview/llnotificationhandler.h @@ -39,6 +39,7 @@  //#include "llnotificationsutil.h"  #include "llchannelmanager.h"  #include "llchat.h" +#include "llnotificationptr.h"  namespace LLNotificationsUI  { @@ -256,6 +257,33 @@ protected:  	void onRejectToast(LLUUID& id);  }; +class LLHandlerUtil +{ +public: +	/** +	 * Checks sufficient conditions to log notification message to IM session. +	 */ +	static bool canLogToIM(const LLNotificationPtr& notification); + +	/** +	 * Writes notification message to IM session. +	 */ +	static void logToIM(const EInstantMessage& session_type, +			const std::string& session_name, const std::string& from_name, +			const std::string& message, const LLUUID& session_owner_id, +			const LLUUID& from_id); + +	/** +	 * Writes notification message to IM  p2p session. +	 */ +	static void logToIMP2P(const LLNotificationPtr& notification); + +	/** +	 * Writes group notice notification message to IM  group session. +	 */ +	static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification); +}; +  }  #endif diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp new file mode 100644 index 0000000000..05da338513 --- /dev/null +++ b/indra/newview/llnotificationhandlerutil.cpp @@ -0,0 +1,129 @@ +/** + * @file llnotificationofferhandler.cpp + * @brief Provides set of utility methods for notifications processing. + * + * $LicenseInfo:firstyear=2000&license=viewergpl$ + * + * Copyright (c) 2000-2009, Linden Research, Inc. + * + * Second Life Viewer Source Code + * The source code in this file ("Source Code") is provided by Linden Lab + * to you under the terms of the GNU General Public License, version 2.0 + * ("GPL"), unless you have obtained a separate licensing agreement + * ("Other License"), formally executed by you and Linden Lab.  Terms of + * the GPL can be found in doc/GPL-license.txt in this distribution, or + * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * + * There are special exceptions to the terms and conditions of the GPL as + * it is applied to this Source Code. View the full text of the exception + * in the file doc/FLOSS-exception.txt in this software distribution, or + * online at + * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * + * By copying, modifying or distributing this software, you acknowledge + * that you have read and understood your obligations described above, + * and agree to abide by those obligations. + * + * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO + * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, + * COMPLETENESS OR PERFORMANCE. + * $/LicenseInfo$ + */ + + +#include "llviewerprecompiledheaders.h" // must be first include + +#include "llnotificationhandler.h" +#include "llnotifications.h" +#include "llimview.h" +#include "llagent.h" + +using namespace LLNotificationsUI; + +const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"), +		REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM( +				"ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER( +				"ObjectGiveItemUnknownUser"); + +// static +bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification) +{ +	return GRANTED_MODIFY_RIGHTS == notification->getName() +			|| REVOKED_MODIFY_RIGHTS == notification->getName(); +} + +// static +void LLHandlerUtil::logToIM(const EInstantMessage& session_type, +		const std::string& session_name, const std::string& from_name, +		const std::string& message, const LLUUID& session_owner_id, +		const LLUUID& from_id) +{ +	LLUUID session_id = LLIMMgr::computeSessionID(session_type, +			session_owner_id); +	LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession( +			session_id); +	if (session == NULL) +	{ +		LLIMModel::instance().logToFile(session_name, from_name, from_id, message); +	} +	else +	{ +		// store active session id +		const LLUUID & active_session_id = +				LLIMModel::instance().getActiveSessionID(); + +		// set searched session as active to avoid IM toast popup +		LLIMModel::instance().setActiveSessionID(session_id); + +		LLIMModel::instance().addMessage(session_id, from_name, from_id, +				message); + +		// restore active session id +		LLIMModel::instance().setActiveSessionID(active_session_id); +	} +} + +// static +void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification) +{ +	const std::string +			name = +					notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"] +							: notification->getSubstitutions()["[NAME]"]; + +	// don't create IM p2p session with objects, it's necessary condition to log +	if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName() +			!= OBJECT_GIVE_ITEM_UNKNOWN_USER) +	{ +		LLUUID from_id = notification->getPayload()["from_id"]; + +		logToIM(IM_NOTHING_SPECIAL, name, name, notification->getMessage(), +				from_id, from_id); +	} +} + +// static +void LLHandlerUtil::logGroupNoticeToIMGroup( +		const LLNotificationPtr& notification) +{ + +	const LLSD& payload = notification->getPayload(); +	LLGroupData groupData; +	if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData)) +	{ +		llwarns +						<< "Group notice for unkown group: " +								<< payload["group_id"].asUUID() << llendl; +	} + +	const std::string group_name = groupData.mName; +	const std::string sender_name = payload["sender_name"].asString(); + +	// we can't retrieve sender id from group notice system message, so try to lookup it from cache +	LLUUID sender_id; +	gCacheName->getUUID(sender_name, sender_id); + +	logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"], +			payload["group_id"], sender_id); +} + diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp index 45b5e88472..c179a2cf90 100644 --- a/indra/newview/llnotificationofferhandler.cpp +++ b/indra/newview/llnotificationofferhandler.cpp @@ -37,8 +37,6 @@  #include "lltoastnotifypanel.h"  #include "llviewercontrol.h"  #include "llviewerwindow.h" -#include "llimview.h" -#include "llimfloater.h"  #include "llnotificationmanager.h"  #include "llnotifications.h" @@ -92,27 +90,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)  	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")  	{ -		// add message to IM -		const std::string -				name = -						notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"] -								: notification->getSubstitutions()["[NAME]"]; - -		// don't create IM session with objects -		if (notification->getName() != "ObjectGiveItem" -				&& notification->getName() != "ObjectGiveItemUnknownUser") -		{ -			LLUUID from_id = notification->getPayload()["from_id"]; -			LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, -					from_id); -			if (!LLIMMgr::instance().hasSession(session_id)) -			{ -				session_id = LLIMMgr::instance().addSession(name, -						IM_NOTHING_SPECIAL, from_id); -			} -			LLIMMgr::instance().addMessage(session_id, LLUUID(), name, -					notification->getMessage()); -		} +		LLHandlerUtil::logToIMP2P(notification);  		LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification); diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp index 471c254bbc..c7261199e3 100644 --- a/indra/newview/llnotificationscripthandler.cpp +++ b/indra/newview/llnotificationscripthandler.cpp @@ -45,6 +45,7 @@ using namespace LLNotificationsUI;  static const std::string SCRIPT_DIALOG				("ScriptDialog");  static const std::string SCRIPT_DIALOG_GROUP		("ScriptDialogGroup"); +static const std::string SCRIPT_LOAD_URL			("LoadWebPage");  //--------------------------------------------------------------------------  LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id) @@ -95,7 +96,12 @@ bool LLScriptHandler::processNotification(const LLSD& notify)  	if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")  	{ -		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) +		if (LLHandlerUtil::canLogToIM(notification)) +		{ +			LLHandlerUtil::logToIMP2P(notification); +		} + +		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())  		{  			LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());  		} @@ -121,7 +127,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)  	}  	else if (notify["sigtype"].asString() == "delete")  	{ -		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName()) +		if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())  		{  			LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());  		} diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp index 6f753b6176..97c1e96175 100644 --- a/indra/newview/llpanelavatar.cpp +++ b/indra/newview/llpanelavatar.cpp @@ -48,6 +48,9 @@  #include "llscrollcontainer.h"  #include "llavatariconctrl.h"  #include "llweb.h" +#include "llfloaterworldmap.h" +#include "llfloaterreg.h" +#include "llnotificationsutil.h"  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  // Class LLDropTarget @@ -150,6 +153,8 @@ BOOL LLPanelAvatarNotes::postBuild()  	childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL);  	childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL);  	childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL); +	childSetCommitCallback("show_on_map_btn", (boost::bind( +				&LLPanelAvatarNotes::onMapButtonClick, this)), NULL);  	LLTextEditor* te = getChild<LLTextEditor>("notes_edit");  	te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this)); @@ -195,6 +200,46 @@ void LLPanelAvatarNotes::onCommitNotes()  	LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes);  } +void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification, +		const LLSD& response, S32 rights) +{ +	S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +	if (option == 0) +	{ +		LLAvatarPropertiesProcessor::getInstance()->sendFriendRights( +				getAvatarId(), rights); +	} +	else +	{ +		childSetValue("objects_check", +				childGetValue("objects_check").asBoolean() ? FALSE : TRUE); +	} +} + +void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights) +{ +	std::string first, last; +	LLSD args; +	if (gCacheName->getName(getAvatarId(), first, last)) +	{ +		args["FIRST_NAME"] = first; +		args["LAST_NAME"] = last; +	} + +	if (grant) +	{ +		LLNotificationsUtil::add("GrantModifyRights", args, LLSD(), +				boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this, +						_1, _2, rights)); +	} +	else +	{ +		LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(), +				boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this, +						_1, _2, rights)); +	} +} +  void LLPanelAvatarNotes::onCommitRights()  {  	S32 rights = 0; @@ -206,7 +251,14 @@ void LLPanelAvatarNotes::onCommitRights()  	if(childGetValue("objects_check").asBoolean())  		rights |= LLRelationship::GRANT_MODIFY_OBJECTS; -	LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights); +	const LLRelationship* buddy_relationship = +			LLAvatarTracker::instance().getBuddyInfo(getAvatarId()); +	bool allow_modify_objects = childGetValue("objects_check").asBoolean(); +	if (buddy_relationship->isRightGrantedTo( +			LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects) +	{ +		confirmModifyRights(allow_modify_objects, rights); +	}  }  void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type) @@ -311,6 +363,7 @@ void LLPanelProfileTab::onOpen(const LLSD& key)  	// Update data even if we are viewing same avatar profile as some data might been changed.  	setAvatarId(key.asUUID());  	updateData(); +	updateButtons();  }  void LLPanelProfileTab::scrollToTop() @@ -320,6 +373,22 @@ void LLPanelProfileTab::scrollToTop()  		scrollContainer->goToTop();  } +void LLPanelProfileTab::onMapButtonClick() +{ +	std::string name; +	gCacheName->getFullName(getAvatarId(), name); +	gFloaterWorldMap->trackAvatar(getAvatarId(), name); +	LLFloaterReg::showInstance("world_map"); +} + +void LLPanelProfileTab::updateButtons() +{ +	bool enable_map_btn = LLAvatarTracker::instance().isBuddyOnline(getAvatarId()) +					&& gAgent.isGodlike() || is_agent_mappable(getAvatarId()); + +	childSetEnabled("show_on_map_btn", enable_map_btn); +} +  //////////////////////////////////////////////////////////////////////////  //////////////////////////////////////////////////////////////////////////  ////////////////////////////////////////////////////////////////////////// @@ -338,6 +407,8 @@ BOOL LLPanelAvatarProfile::postBuild()  	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);  	LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;  	registrar.add("Profile.Pay",  boost::bind(&LLPanelAvatarProfile::pay, this)); diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h index 527e1c0d34..f54aeee4eb 100644 --- a/indra/newview/llpanelavatar.h +++ b/indra/newview/llpanelavatar.h @@ -106,6 +106,10 @@ protected:  	 */  	void scrollToTop(); +	virtual void onMapButtonClick(); + +	virtual void updateButtons(); +  private:  	LLUUID mAvatarId; @@ -256,6 +260,9 @@ protected:  	 */  	void fillRightsData(); +	void rightsConfirmationCallback(const LLSD& notification, +			const LLSD& response, S32 rights); +	void confirmModifyRights(bool grant, S32 rights);  	void onCommitRights();  	void onCommitNotes(); diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index da7922d657..b6c58808ae 100644 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -42,6 +42,7 @@  #include "lliconctrl.h"  #include "lllineeditor.h"  #include "llnamelistctrl.h" +#include "llnotifications.h"  #include "llnotificationsutil.h"  #include "llnotify.h"  #include "llpanelgrouproles.h" @@ -1101,10 +1102,33 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()  	mMembersList->deleteSelectedItems(); +	sendEjectNotifications(mGroupID, selected_members); +  	LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID,  									 selected_members);  } +void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members) +{ +	LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id); + +	if (group_data) +	{ +		for (std::vector<LLUUID>::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i) +		{ +			LLSD args; +			std::string name; +			 +			gCacheName->getFullName(*i, name); + +			args["AVATAR_NAME"] = name; +			args["GROUP_NAME"] = group_data->mName; +			 +			LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args)); +		} +	} +} +  void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,  												LLRoleMemberChangeType type)  { @@ -1544,9 +1568,6 @@ void LLPanelGroupMembersSubTab::updateMembers()  	mPendingMemberUpdate = FALSE;  	// Rebuild the members list. -	mMembersList->deleteAllItems(); - -	lldebugs << "LLPanelGroupMembersSubTab::updateMembers()" << llendl;  	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);  	if (!gdatap)  @@ -1563,7 +1584,12 @@ void LLPanelGroupMembersSubTab::updateMembers()  	{  		return;  	} -		 + +	//cleanup list only for first iretation +	if(mMemberProgress == gdatap->mMembers.begin()) +		mMembersList->deleteAllItems(); + +  	LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();  	S32 i = 0; diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index b6e2245e70..bb3c9096cf 100644 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -170,6 +170,7 @@ public:  	static void onEjectMembers(void*);  	void handleEjectMembers(); +	void sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members);  	static void onRoleCheck(LLUICtrl* check, void* user_data);  	void handleRoleCheck(const LLUUID& role_id, diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp index fa6d16cfb1..405c95fc22 100644 --- a/indra/newview/llpanelimcontrolpanel.cpp +++ b/indra/newview/llpanelimcontrolpanel.cpp @@ -32,6 +32,8 @@  #include "llviewerprecompiledheaders.h" +#include "llfloaterreg.h" +  #include "llpanelimcontrolpanel.h"  #include "llagent.h" @@ -58,7 +60,7 @@ void LLPanelChatControlPanel::onEndCallButtonClicked()  void LLPanelChatControlPanel::onOpenVoiceControlsClicked()  { -	// TODO: implement Voice Control Panel opening +	LLFloaterReg::showInstance("voice_controls");  }  void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state) @@ -120,6 +122,7 @@ LLPanelIMControlPanel::LLPanelIMControlPanel()  LLPanelIMControlPanel::~LLPanelIMControlPanel()  { +	LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);  }  BOOL LLPanelIMControlPanel::postBuild() @@ -169,7 +172,9 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  	LLIMModel& im_model = LLIMModel::instance(); +	LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);  	mAvatarID = im_model.getOtherParticipantID(session_id); +	LLAvatarTracker::instance().addParticularFriendObserver(mAvatarID, this);  	// Disable "Add friend" button for friends.  	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID)); @@ -198,6 +203,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)  	}  } +//virtual +void LLPanelIMControlPanel::changed(U32 mask) +{ +	childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID)); +} +  void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)  {  	if ( id == mAvatarID ) diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h index 7bfc432ef2..a590232a0b 100644 --- a/indra/newview/llpanelimcontrolpanel.h +++ b/indra/newview/llpanelimcontrolpanel.h @@ -35,6 +35,7 @@  #include "llpanel.h"  #include "llvoicechannel.h" +#include "llcallingcard.h"  class LLSpeakerMgr;  class LLAvatarList; @@ -66,7 +67,7 @@ private:  }; -class LLPanelIMControlPanel : public LLPanelChatControlPanel +class LLPanelIMControlPanel : public LLPanelChatControlPanel, LLFriendObserver  {  public:  	LLPanelIMControlPanel(); @@ -76,6 +77,9 @@ public:  	void setSessionId(const LLUUID& session_id); +	// LLFriendObserver trigger +	virtual void changed(U32 mask); +  protected:  	void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group); diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index e24fa14e1e..dafb970b30 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -730,13 +730,14 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const  	{  		return canSelectedBeModified(command_name);  	} -	else if ( "sort_by_date" == command_name) -	{ -		return  mSortByDate; -	}  	else if("create_pick" == command_name)  	{ -		return !LLAgentPicksInfo::getInstance()->isPickLimitReached(); +		std::set<LLUUID> selection; +		if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) ) +		{ +			return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() ); +		} +		return false;  	}  	else  	{ diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index bde34302ed..d2a17dbd97 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -226,6 +226,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,  	LLComboBox* combo = getChild<LLComboBox>("start_location_combo"); +	LLURLSimString::setString(gSavedSettings.getString("LoginLocation"));  	std::string sim_string = LLURLSimString::sInstance.mSimString;  	if (!sim_string.empty())  	{ @@ -893,12 +894,27 @@ void LLPanelLogin::onClickConnect(void *)  		LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");  		std::string combo_text = combo->getSimple(); -		if (first.empty() || last.empty()) +		bool has_first_and_last = !(first.empty() || last.empty()); +		bool has_location = false; + +		if(combo_text=="<Type region name>" || combo_text =="") +		{ +			// *NOTE: Mani - Location field is not always committed by this point! +			// This may be duplicate work, but better than not doing the work! +			LLURLSimString::sInstance.setString(""); +		} +		else  +		{ +			// *NOTE: Mani - Location field is not always committed by this point! +			LLURLSimString::sInstance.setString(combo_text); +			has_location = true; +		} + +		if(!has_first_and_last)  		{  			LLNotificationsUtil::add("MustHaveAccountToLogIn");  		} -		else if( (combo_text=="<Type region name>" || combo_text =="") -				&& LLURLSimString::sInstance.mSimString =="") +		else if(!has_location)  		{  			LLNotificationsUtil::add("StartRegionEmpty");  		} diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp index 5bb266a01d..b1e7dd3d50 100644 --- a/indra/newview/llpanelmediasettingsgeneral.cpp +++ b/indra/newview/llpanelmediasettingsgeneral.cpp @@ -392,19 +392,19 @@ void LLPanelMediaSettingsGeneral::preApply()  //  void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )  { -	fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue(); -	fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue(); -	fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue(); -	fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue(); -	fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex(); +	fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue(); +	fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue(); +	fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue(); +	fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue(); +	fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();  	//Don't fill in current URL: this is only supposed to get changed via navigate  	// fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue(); -	fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue(); +	fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();  	// Don't fill in the home URL if it is the special "Multiple Media" string!  	if (LLTrans::getString("Multiple Media") != mHomeURL->getValue()) -		fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue(); -	fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue(); -	fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue(); +		fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue(); +	fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue(); +	fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();  }  //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp index 94e137b0f4..7ec53ed57a 100644 --- a/indra/newview/llpanelmediasettingssecurity.cpp +++ b/indra/newview/llpanelmediasettingssecurity.cpp @@ -213,7 +213,7 @@ void LLPanelMediaSettingsSecurity::preApply()  //  void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )  { -    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue(); +    fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();      // iterate over white list and extract items      std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData(); diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp index e6b6ec64bd..6771bb4170 100644 --- a/indra/newview/llpanelpeople.cpp +++ b/indra/newview/llpanelpeople.cpp @@ -73,6 +73,8 @@ static const std::string FRIENDS_TAB_NAME	= "friends_panel";  static const std::string GROUP_TAB_NAME		= "groups_panel";  static const std::string RECENT_TAB_NAME	= "recent_panel"; +static const std::string COLLAPSED_BY_USER  = "collapsed_by_user"; +  /** Comparator for comparing avatar items by last interaction date */  class LLAvatarItemRecentComparator : public LLAvatarItemComparator  { @@ -467,7 +469,7 @@ LLPanelPeople::~LLPanelPeople()  } -void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list) +void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list)  {  	if(!avatar_list)  	{ @@ -477,6 +479,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva  	bool expanded = param.asBoolean(); +	setAccordionCollapsedByUser(ctrl, !expanded);  	if(!expanded)  	{  		avatar_list->resetSelection(); @@ -550,11 +553,11 @@ BOOL LLPanelPeople::postBuild()  	LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");  	accordion_tab->setDropDownStateChangedCallback( -		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mAllFriendList)); +		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mAllFriendList));  	accordion_tab = getChild<LLAccordionCtrlTab>("tab_online");  	accordion_tab->setDropDownStateChangedCallback( -		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList)); +		boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mOnlineFriendList));  	buttonSetAction("view_profile_btn",	boost::bind(&LLPanelPeople::onViewProfileButtonClicked,	this));  	buttonSetAction("group_info_btn",	boost::bind(&LLPanelPeople::onGroupInfoButtonClicked,	this)); @@ -760,7 +763,13 @@ void LLPanelPeople::updateButtons()  		LLPanel* cur_panel = mTabContainer->getCurrentPanel();  		if (cur_panel) +		{  			cur_panel->childSetEnabled("add_friend_btn", !is_friend); +			if (friends_tab_active) +			{ +				cur_panel->childSetEnabled("del_btn", multiple_selected); +			} +		}  	}  	buttonSetEnabled("teleport_btn",		friends_tab_active && item_selected && isFriendOnline(selected_uuids.front())); @@ -931,6 +940,9 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)  	mRecentList->setNameFilter(mFilterSubString);  	mGroupList->setNameFilter(mFilterSubString); +	setAccordionCollapsedByUser("tab_online", false); +	setAccordionCollapsedByUser("tab_all", false); +  	showFriendsAccordionsIfNeeded();  } @@ -1309,8 +1321,12 @@ void LLPanelPeople::showAccordion(const std::string name, bool show)  	tab->setVisible(show);  	if(show)  	{ -		// expand accordion -		tab->changeOpenClose(false); +		// don't expand accordion if it was collapsed by user +		if(!isAccordionCollapsedByUser(tab)) +		{ +			// expand accordion +			tab->changeOpenClose(false); +		}  	}  } @@ -1342,3 +1358,44 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param  	LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");  	accordion->arrange();  } + +void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed) +{ +	if(!acc_tab) +	{ +		llwarns << "Invalid parameter" << llendl; +		return; +	} + +	LLSD param = acc_tab->getValue(); +	param[COLLAPSED_BY_USER] = collapsed; +	acc_tab->setValue(param); +} + +void LLPanelPeople::setAccordionCollapsedByUser(const std::string& name, bool collapsed) +{ +	setAccordionCollapsedByUser(getChild<LLUICtrl>(name), collapsed); +} + +bool LLPanelPeople::isAccordionCollapsedByUser(LLUICtrl* acc_tab) +{ +	if(!acc_tab) +	{ +		llwarns << "Invalid parameter" << llendl; +		return false; +	} + +	LLSD param = acc_tab->getValue(); +	if(!param.has(COLLAPSED_BY_USER)) +	{ +		return false; +	} +	return param[COLLAPSED_BY_USER].asBoolean(); +} + +bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name) +{ +	return isAccordionCollapsedByUser(getChild<LLUICtrl>(name)); +} + +// EOF diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h index d9dd76f3ac..5ac5bcc1d7 100644 --- a/indra/newview/llpanelpeople.h +++ b/indra/newview/llpanelpeople.h @@ -127,7 +127,7 @@ private:  								const std::vector<LLUUID>& ids,  								void*); -	void					onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list); +	void					onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);  	void					showAccordion(const std::string name, bool show); @@ -135,6 +135,11 @@ private:  	void					onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param); +	void					setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); +	void					setAccordionCollapsedByUser(const std::string& name, bool collapsed); +	bool					isAccordionCollapsedByUser(LLUICtrl* acc_tab); +	bool					isAccordionCollapsedByUser(const std::string& name); +  	LLFilterEditor*			mFilterEditor;  	LLTabContainer*			mTabContainer;  	LLAvatarList*			mOnlineFriendList; diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index b17b6d6fe9..b21b1c64b1 100644 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -86,6 +86,9 @@ public:  	// parent panels failed to work (picks related code was in my profile panel)  	void setProfilePanel(LLPanelProfile* profile_panel); +protected: +	/*virtual*/void updateButtons(); +  private:  	void onClickDelete();  	void onClickTeleport(); @@ -125,7 +128,6 @@ private:  	bool callbackDeleteClassified(const LLSD& notification, const LLSD& response);  	bool callbackTeleport(const LLSD& notification, const LLSD& response); -	void updateButtons();  	virtual void onDoubleClickPickItem(LLUICtrl* item);  	virtual void onDoubleClickClassifiedItem(LLUICtrl* item); diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp index 71c1b0cbb9..e86123d565 100644 --- a/indra/newview/llpanelprimmediacontrols.cpp +++ b/indra/newview/llpanelprimmediacontrols.cpp @@ -66,10 +66,6 @@  glh::matrix4f glh_get_current_modelview();  glh::matrix4f glh_get_current_projection(); -const F32 ZOOM_NEAR_PADDING		= 1.0f; -const F32 ZOOM_MEDIUM_PADDING	= 1.15f; -const F32 ZOOM_FAR_PADDING		= 1.5f; -  // Warning: make sure these two match!  const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };  const int LLPanelPrimMediaControls::kNumZoomLevels = 2; @@ -86,7 +82,13 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :  	mUpdateSlider(true),  	mClearFaceOnFade(false),  	mCurrentRate(0.0), -	mMovieDuration(0.0) +	mMovieDuration(0.0), +	mTargetObjectID(LLUUID::null), +	mTargetObjectFace(0), +	mTargetImplID(LLUUID::null), +	mTargetObjectNormal(LLVector3::zero), +	mZoomObjectID(LLUUID::null), +	mZoomObjectFace(0)  {  	mCommitCallbackRegistrar.add("MediaCtrl.Close",		boost::bind(&LLPanelPrimMediaControls::onClickClose, this));  	mCommitCallbackRegistrar.add("MediaCtrl.Back",		boost::bind(&LLPanelPrimMediaControls::onClickBack, this)); @@ -152,6 +154,11 @@ BOOL LLPanelPrimMediaControls::postBuild()  	mRightBookend			= getChild<LLUICtrl>("right_bookend");  	mBackgroundImage		= LLUI::getUIImage(getString("control_background_image_name"));  	LLStringUtil::convertToF32(getString("skip_step"), mSkipStep); +	LLStringUtil::convertToS32(getString("min_width"), mMinWidth); +	LLStringUtil::convertToS32(getString("min_height"), mMinHeight); +	LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding); +	LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding); +	LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);  	// These are currently removed...but getChild creates a "dummy" widget.  	// This class handles them missing. @@ -257,9 +264,6 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()  void LLPanelPrimMediaControls::updateShape()  { -	const S32 MIN_HUD_WIDTH=400; -	const S32 MIN_HUD_HEIGHT=120; -  	LLViewerMediaImpl* media_impl = getTargetMediaImpl();  	LLViewerObject* objectp = getTargetObject(); @@ -279,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape()  	bool can_navigate = parcel->getMediaAllowNavigate();  	bool enabled = false; -	bool is_zoomed = (mCurrentZoom != ZOOM_NONE); +	bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);  	// There is no such thing as "has_focus" being different from normal controls set  	// anymore (as of user feedback from bri 10/09).  So we cheat here and force 'has_focus'  	// to 'true' (or, actually, we use a setting) @@ -309,7 +313,7 @@ void LLPanelPrimMediaControls::updateShape()  		mStopCtrl->setVisible(false);  		mHomeCtrl->setVisible(has_focus);  		mZoomCtrl->setVisible(!is_zoomed); -		mUnzoomCtrl->setVisible(has_focus && is_zoomed); +		mUnzoomCtrl->setVisible(is_zoomed);  		mOpenCtrl->setVisible(true);  		mMediaAddressCtrl->setVisible(has_focus && !mini_controls);  		mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); @@ -332,13 +336,12 @@ void LLPanelPrimMediaControls::updateShape()  		if(media_plugin && media_plugin->pluginSupportsMediaTime())  		{ -			mReloadCtrl->setEnabled(FALSE); -			mReloadCtrl->setVisible(FALSE); +			mReloadCtrl->setEnabled(false); +			mReloadCtrl->setVisible(false);  			mMediaStopCtrl->setVisible(has_focus); -			mHomeCtrl->setVisible(FALSE); -			// No nav controls -			mBackCtrl->setVisible(FALSE); -			mFwdCtrl->setEnabled(FALSE); +			mHomeCtrl->setVisible(has_focus); +			mBackCtrl->setVisible(false); +			mFwdCtrl->setVisible(false);  			mMediaAddressCtrl->setVisible(false);  			mMediaAddressCtrl->setEnabled(false);  			mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls); @@ -416,7 +419,6 @@ void LLPanelPrimMediaControls::updateShape()  					mPlayCtrl->setVisible(FALSE);  					mPauseCtrl->setEnabled(TRUE);  					mPauseCtrl->setVisible(has_focus); -					mMediaStopCtrl->setEnabled(TRUE);  					break;  				case LLPluginClassMediaOwner::MEDIA_PAUSED: @@ -425,7 +427,6 @@ void LLPanelPrimMediaControls::updateShape()  					mPauseCtrl->setVisible(FALSE);  					mPlayCtrl->setEnabled(TRUE);  					mPlayCtrl->setVisible(has_focus); -					mMediaStopCtrl->setEnabled(FALSE);  					break;  			}  		} @@ -508,12 +509,10 @@ void LLPanelPrimMediaControls::updateShape()  			{	  				mMediaProgressPanel->setVisible(true);  				mMediaProgressBar->setPercent(media_plugin->getProgressPercent()); -				gFocusMgr.setTopCtrl(mMediaProgressPanel);  			} -			else if (mMediaProgressPanel->getVisible()) +			else  			{  				mMediaProgressPanel->setVisible(false); -				gFocusMgr.setTopCtrl(NULL);  			}  		} @@ -599,12 +598,12 @@ void LLPanelPrimMediaControls::updateShape()  		}          LLCoordGL screen_min; -		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f); -		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f); +		screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f); +		screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f);  		LLCoordGL screen_max; -		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f); -		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f); +		screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f); +		screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f);  		// grow panel so that screenspace bounding box fits inside "media_region" element of HUD  		LLRect media_controls_rect; @@ -613,14 +612,15 @@ void LLPanelPrimMediaControls::updateShape()  		media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;  		media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;  		media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight; - -		LLRect old_hud_rect = media_controls_rect; +		  		// keep all parts of HUD on-screen  		media_controls_rect.intersectWith(getParent()->getLocalRect()); +		if (mCurrentZoom != ZOOM_NONE) +			media_controls_rect.mBottom -= mMediaControlsStack->getRect().getHeight() + mMediaProgressPanel->getRect().getHeight();  		// clamp to minimum size, keeping centered  		media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(), -			llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight())); +			llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));  		setShape(media_controls_rect, true); @@ -968,17 +968,17 @@ void LLPanelPrimMediaControls::updateZoom()  		}  	case ZOOM_FAR:  		{ -			zoom_padding = ZOOM_FAR_PADDING; +			zoom_padding = mZoomFarPadding;  			break;  		}  	case ZOOM_MEDIUM:  		{ -			zoom_padding = ZOOM_MEDIUM_PADDING; +			zoom_padding = mZoomMediumPadding;  			break;  		}  	case ZOOM_NEAR:  		{ -			zoom_padding = ZOOM_NEAR_PADDING; +			zoom_padding = mZoomNearPadding;  			break;  		}  	default: @@ -988,9 +988,16 @@ void LLPanelPrimMediaControls::updateZoom()  		}  	} -	if (zoom_padding > 0.0f)		 +	if (zoom_padding > 0.0f) +	{  		LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding); +	} +	 +	// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately +	mZoomObjectID = mTargetObjectID; +	mZoomObjectFace = mTargetObjectFace;  } +  void LLPanelPrimMediaControls::onScrollUp(void* user_data)  {  	LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data); diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h index accfb72a04..fe8f100abe 100644 --- a/indra/newview/llpanelprimmediacontrols.h +++ b/indra/newview/llpanelprimmediacontrols.h @@ -160,6 +160,11 @@ private:  	LLUICtrl *mRightBookend;  	LLUIImage* mBackgroundImage;  	F32 mSkipStep; +	S32 mMinWidth; +	S32 mMinHeight; +	F32 mZoomNearPadding; +	F32 mZoomMediumPadding; +	F32 mZoomFarPadding;  	LLUICtrl *mMediaPanelScroll;  	LLButton *mScrollUpCtrl; @@ -190,6 +195,9 @@ private:  	S32 mTargetObjectFace;  	LLUUID mTargetImplID;  	LLVector3 mTargetObjectNormal; +	 +	LLUUID mZoomObjectID; +	S32 mZoomObjectFace;  };  #endif // LL_PANELPRIMMEDIACONTROLS_H diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp index b82b994540..327048d4f3 100644 --- a/indra/newview/llpanelteleporthistory.cpp +++ b/indra/newview/llpanelteleporthistory.cpp @@ -52,6 +52,8 @@  // Used to limit time spent for items list update per frame.  static const U32 ADD_LIMIT = 50; +static const std::string COLLAPSED_BY_USER = "collapsed_by_user"; +  class LLTeleportHistoryFlatItem : public LLPanel  {  public: @@ -254,6 +256,10 @@ BOOL LLTeleportHistoryPanel::postBuild()  				LLAccordionCtrlTab* tab = (LLAccordionCtrlTab*)*iter;  				tab->setRightMouseDownCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionTabRightClick, this, _1, _2, _3, _4));  				tab->setDisplayChildren(false); +				tab->setDropDownStateChangedCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionExpand, this, _1, _2)); + +				// All accordion tabs are collapsed initially +				setAccordionCollapsedByUser(tab, true);  				mItemContainers.put(tab); @@ -270,10 +276,18 @@ BOOL LLTeleportHistoryPanel::postBuild()  		// Open first 2 accordion tabs  		if (mItemContainers.size() > 1) -			mItemContainers.get(mItemContainers.size() - 1)->setDisplayChildren(true); +		{ +			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1); +			tab->setDisplayChildren(true); +			setAccordionCollapsedByUser(tab, false); +		}  		if (mItemContainers.size() > 2) -			mItemContainers.get(mItemContainers.size() - 2)->setDisplayChildren(true); +		{ +			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 2); +			tab->setDisplayChildren(true); +			setAccordionCollapsedByUser(tab, false); +		}  	}  	getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this)); @@ -491,6 +505,18 @@ void LLTeleportHistoryPanel::refresh()  			LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);  			tab->setVisible(true); +			// Expand all accordion tabs when filtering +			if(!mFilterSubString.empty()) +			{ +				tab->setDisplayChildren(true); +			} +			// Restore each tab's expand state when not filtering +			else +			{ +				bool collapsed = isAccordionCollapsedByUser(tab); +				tab->setDisplayChildren(!collapsed); +			} +  			curr_flat_view = getFlatListViewFromTab(tab);  		} @@ -775,3 +801,26 @@ void LLTeleportHistoryPanel::onGearButtonClicked()  	LLMenuGL::showPopup(this, menu, menu_x, menu_y);  } +void LLTeleportHistoryPanel::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed) +{ +	LLSD param = acc_tab->getValue(); +	param[COLLAPSED_BY_USER] = collapsed; +	acc_tab->setValue(param); +} + +bool LLTeleportHistoryPanel::isAccordionCollapsedByUser(LLUICtrl* acc_tab) +{ +	LLSD param = acc_tab->getValue(); +	if(!param.has("acc_collapsed")) +	{ +		return false; +	} +	return param[COLLAPSED_BY_USER].asBoolean(); +} + +void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param) +{ +	bool expanded = param.asBoolean(); +	// Save accordion tab state to restore it in refresh() +	setAccordionCollapsedByUser(ctrl, !expanded); +} diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h index a31ff34cb6..f646fea355 100644 --- a/indra/newview/llpanelteleporthistory.h +++ b/indra/newview/llpanelteleporthistory.h @@ -98,6 +98,10 @@ private:  	LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *);  	void onGearButtonClicked(); +	void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed); +	bool isAccordionCollapsedByUser(LLUICtrl* acc_tab); +	void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param); +  	LLTeleportHistoryStorage*	mTeleportHistory;  	LLAccordionCtrl*		mHistoryAccordion; diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp index 4ee9cba69c..07a1214b4f 100644 --- a/indra/newview/llparticipantlist.cpp +++ b/indra/newview/llparticipantlist.cpp @@ -47,10 +47,11 @@  #if LL_MSVC  #pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally  #endif -LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list): +LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list,  bool use_context_menu/* = true*/):  	mSpeakerMgr(data_source),  	mAvatarList(avatar_list),  	mSortOrder(E_SORT_BY_NAME) +,	mParticipantListMenu(NULL)  {  	mSpeakerAddListener = new SpeakerAddListener(*this);  	mSpeakerRemoveListener = new SpeakerRemoveListener(*this); @@ -68,8 +69,15 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av      // Set onAvatarListDoubleClicked as default on_return action.  	mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList)); -	mParticipantListMenu = new LLParticipantListMenu(*this); -	mAvatarList->setContextMenu(mParticipantListMenu); +	if (use_context_menu) +	{ +		mParticipantListMenu = new LLParticipantListMenu(*this); +		mAvatarList->setContextMenu(mParticipantListMenu); +	} +	else +	{ +		mAvatarList->setContextMenu(NULL); +	}  	//Lets fill avatarList with existing speakers  	LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs(); @@ -79,12 +87,13 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av  	for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)  	{  		const LLPointer<LLSpeaker>& speakerp = *it; -		group_members.push_back(speakerp->mID); +		addAvatarIDExceptAgent(group_members, speakerp->mID);  		if ( speakerp->mIsModerator )  		{  			mModeratorList.insert(speakerp->mID);  		}  	} +	mAvatarList->setDirty(true);  	sort();  } @@ -183,7 +192,7 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co  		return true;  	} -	group_members.push_back(uu_id); +	addAvatarIDExceptAgent(group_members, uu_id);  	// Mark AvatarList as dirty one  	mAvatarList->setDirty();  	sort(); @@ -251,6 +260,15 @@ void LLParticipantList::sort()  	}  } +// static +void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id) +{ +	if (gAgent.getID() != avatar_id) +	{ +		existing_list.push_back(avatar_id); +	} +} +  //  // LLParticipantList::SpeakerAddListener  // diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h index 5e26c39fc8..460cf4b9ef 100644 --- a/indra/newview/llparticipantlist.h +++ b/indra/newview/llparticipantlist.h @@ -43,7 +43,7 @@ class LLParticipantList  {  	LOG_CLASS(LLParticipantList);  	public: -		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list); +		LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true);  		~LLParticipantList();  		void setSpeakingIndicatorsVisible(BOOL visible); @@ -132,6 +132,11 @@ class LLParticipantList  		void onAvatarListDoubleClicked(LLAvatarList* list);  		void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param); +		/** +		 * Adds specified avatar ID to the existing list if it is not Agent's ID +		 */ +		static void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id); +  		LLSpeakerMgr*		mSpeakerMgr;  		LLAvatarList*		mAvatarList; diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp index ee5fa46c9c..ee62d689b5 100644 --- a/indra/newview/llsidetray.cpp +++ b/indra/newview/llsidetray.cpp @@ -583,6 +583,17 @@ void LLSideTray::expandSideBar()  	mActiveTab->onOpen(key);  	reflectCollapseChange(); + + +	std::string name = mActiveTab->getName(); +	std::map<std::string,LLButton*>::const_iterator btn_it = +		mTabButtons.find(name); +	if (btn_it != mTabButtons.end()) +	{ +		LLButton* btn = btn_it->second; +		btn->setImageOverlay( mActiveTab->mImageSelected  ); +	} +  }  void LLSideTray::highlightFocused() diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp index 54f776ca6a..5edc4804ca 100644 --- a/indra/newview/llspeakbutton.cpp +++ b/indra/newview/llspeakbutton.cpp @@ -32,19 +32,14 @@  #include "llviewerprecompiledheaders.h" // must be first include -#include "llagent.h" -#include "llbottomtray.h" +#include "llbutton.h"  #include "llfloaterreg.h" -#include "llvoiceclient.h" -#include "llvoicecontrolpanel.h" -#include "lltransientfloatermgr.h" -#include "llavatariconctrl.h" -#include "llbutton.h" -#include "llpanel.h" -#include "lltextbox.h" +#include "llagent.h" +#include "llbottomtray.h" +#include "llcallfloater.h"  #include "lloutputmonitorctrl.h" -#include "llgroupmgr.h" +#include "lltransientfloatermgr.h"  #include "llspeakbutton.h" @@ -72,7 +67,6 @@ void LLSpeakButton::draw()  LLSpeakButton::LLSpeakButton(const Params& p)  : LLUICtrl(p) -, mPrivateCallPanel(NULL)  , mOutputMonitor(NULL)  , mSpeakBtn(NULL)  , mShowBtn(NULL) @@ -102,8 +96,8 @@ LLSpeakButton::LLSpeakButton(const Params& p)  	addChild(mShowBtn);  	LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn); -	mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this)); -	mShowBtn->setToggleState(FALSE); +// 	mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this)); +// 	mShowBtn->setToggleState(FALSE);  	static const S32 MONITOR_RIGHT_PAD = 2; @@ -175,42 +169,3 @@ void LLSpeakButton::onMouseUp_SpeakBtn()  	gVoiceClient->inputUserControlState(down);  } -void LLSpeakButton::onClick_ShowBtn() -{ -	if(!mShowBtn->getToggleState()) -	{ -		mPrivateCallPanel->onClickClose(mPrivateCallPanel); -		delete mPrivateCallPanel; -		mPrivateCallPanel = NULL; -		mShowBtn->setToggleState(FALSE); -		return; -	} - -	S32 x = mSpeakBtn->getRect().mLeft; -	S32 y = 0; - -	localPointToScreen(x, y, &x, &y); - -	mPrivateCallPanel = new LLVoiceControlPanel; -	getRootView()->addChild(mPrivateCallPanel); - -	y = LLBottomTray::getInstance()->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight(); - -	LLRect rect; -	rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight()); -	mPrivateCallPanel->setRect(rect); - - -	LLAvatarListItem* item = new LLAvatarListItem(); -	item->showLastInteractionTime(false); -	item->showInfoBtn(true); -	item->showSpeakingIndicator(true); -	item->reshape(mPrivateCallPanel->getRect().getWidth(), item->getRect().getHeight(), FALSE); - -	mPrivateCallPanel->addItem(item); -	mPrivateCallPanel->setVisible(TRUE); -	mPrivateCallPanel->setFrontmost(TRUE); - -	mShowBtn->setToggleState(TRUE); -} - diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h index 424ee5357a..6660b50240 100644 --- a/indra/newview/llspeakbutton.h +++ b/indra/newview/llspeakbutton.h @@ -36,7 +36,7 @@  #include "llinitparam.h"  #include "lluictrl.h" -class LLVoiceControlPanel; +class LLCallFloater;  class LLButton;  class LLOutputMonitorCtrl; @@ -86,12 +86,10 @@ protected:  	void onMouseDown_SpeakBtn();  	void onMouseUp_SpeakBtn(); -	void onClick_ShowBtn(); -  private:  	LLButton*	mSpeakBtn;  	LLButton*	mShowBtn; -	LLVoiceControlPanel* mPrivateCallPanel; +	LLHandle<LLFloater> mPrivateCallPanel;  	LLOutputMonitorCtrl* mOutputMonitor;  }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index e7fe85bdf0..db8bda008e 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -101,7 +101,6 @@  #include "llfeaturemanager.h"  #include "llfirstuse.h"  #include "llfloaterchat.h" -#include "llfloatergesture.h"  #include "llfloaterhud.h"  #include "llfloaterland.h"  #include "llfloaterpreference.h" @@ -299,23 +298,6 @@ namespace  	};  } -class LLGestureInventoryFetchObserver : public LLInventoryFetchObserver -{ -public: -	LLGestureInventoryFetchObserver() {} -	virtual void done() -	{ -		// we've downloaded all the items, so repaint the dialog -		LLFloaterGesture* floater = LLFloaterReg::findTypedInstance<LLFloaterGesture>("gestures"); -		if (floater) -		{ -			floater->refreshAll(); -		} -		gInventory.removeObserver(this); -		delete this; -	} -}; -  void update_texture_fetch()  {  	LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread @@ -1825,11 +1807,8 @@ bool idle_startup()  						item_ids.push_back(item_id);  					}  				} - -				LLGestureInventoryFetchObserver* fetch = new LLGestureInventoryFetchObserver(); -				fetch->fetchItems(item_ids); -				// deletes itself when done -				gInventory.addObserver(fetch); +				// no need to add gesture to inventory observer, it's already made in constructor  +				LLGestureManager::instance().fetchItems(item_ids);  			}  		}  		gDisplaySwapBuffers = TRUE; diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index dc22a243eb..4915720036 100644 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -42,6 +42,7 @@  #include "llfloaterbuycurrency.h"  #include "llfloaterchat.h"  #include "llfloaterlagmeter.h" +#include "llfloatervolumepulldown.h"  #include "llfloaterregioninfo.h"  #include "llfloaterscriptdebug.h"  #include "llhudicon.h" @@ -159,6 +160,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	mBtnVolume = getChild<LLButton>( "volume_btn" );  	mBtnVolume->setClickedCallback( onClickVolume, this ); +	mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));  	gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2)); @@ -203,7 +205,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)  	addChild(mSGPacketLoss);  	childSetActionTextbox("stat_btn", onClickStatGraph); -  }  LLStatusBar::~LLStatusBar() @@ -244,7 +245,6 @@ BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)  BOOL LLStatusBar::postBuild()  { -  	gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));  	return TRUE; @@ -506,6 +506,13 @@ static void onClickScriptDebug(void*)  	LLFloaterScriptDebug::show(LLUUID::null);  } +//static +void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl) +{ +	// show the master volume pull-down +	LLFloaterReg::showInstance("volume_pulldown"); +} +  static void onClickVolume(void* data)  {  	// toggle the master mute setting diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h index bdaacce981..f77cc1acb8 100644 --- a/indra/newview/llstatusbar.h +++ b/indra/newview/llstatusbar.h @@ -47,6 +47,7 @@ class LLUICtrl;  class LLUUID;  class LLFrameTimer;  class LLStatGraph; +class LLPanelVolumePulldown;  class LLStatusBar  :	public LLPanel @@ -92,8 +93,8 @@ private:  	void onVolumeChanged(const LLSD& newvalue); +	static void onMouseEnterVolume(LLUICtrl* ctrl);  	static void onClickStatGraph(void* data); -	  private:  	LLTextBox	*mTextHealth; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index aebc97ab7d..b5454e7298 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -38,6 +38,7 @@  #include "llviewerfloaterreg.h"  #include "llcompilequeue.h" +#include "llcallfloater.h"  #include "llfloaterabout.h"  #include "llfloateractivespeakers.h"  #include "llfloateranimpreview.h" @@ -105,6 +106,7 @@  #include "llfloateruipreview.h"  #include "llfloaterurldisplay.h"  #include "llfloatervoicedevicesettings.h" +#include "llfloatervolumepulldown.h"  #include "llfloaterwater.h"  #include "llfloaterwhitelistentry.h"  #include "llfloaterwindlight.h" @@ -174,7 +176,6 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);  	LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>); -	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);  	LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);  	LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);  	LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>); @@ -234,6 +235,7 @@ void LLViewerFloaterReg::registerFloaters()  	LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>);  	LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>); +	LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);  	LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);  	LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);  	LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>); @@ -247,7 +249,9 @@ 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("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);  	LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>); +	LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);  	LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);	  	LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);	 diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index fd74c9c2fc..f639c841e7 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -138,15 +138,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac  	}  	else  	{ -		if(mFocusedImplID.notNull()) -		{ -			if(mMediaControls.get()) -			{ -				// Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom. -				mMediaControls.get()->resetZoomLevel(false); -			} -		} -  		if(hasFocus())  		{  			gFocusMgr.setKeyboardFocus(NULL); diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h index 639585de55..fe0114d687 100644 --- a/indra/newview/llvoicechannel.h +++ b/indra/newview/llvoicechannel.h @@ -52,7 +52,7 @@ public:  		STATE_CONNECTED  	} EState; -	typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t; +	typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state)> state_changed_signal_t;  	// on current channel changed signal  	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t; @@ -78,7 +78,8 @@ public:  	virtual BOOL callStarted();  	const std::string& getSessionName() const { return mSessionName; } -	void setStateChangedCallback(state_changed_callback_t callback) { mStateChangedCallback = callback; } +	boost::signals2::connection setStateChangedCallback(const state_changed_signal_t::slot_type& callback) +	{ return mStateChangedCallback.connect(callback); }  	const LLUUID getSessionID() { return mSessionID; }  	EState getState() { return mState; } @@ -124,7 +125,7 @@ protected:  	static BOOL sSuspended;  private: -	state_changed_callback_t mStateChangedCallback; +	state_changed_signal_t mStateChangedCallback;  };  class LLVoiceChannelGroup : public LLVoiceChannel @@ -175,6 +176,9 @@ public:  	void setSessionHandle(const std::string& handle, const std::string &inURI); +	// returns TRUE if call is incoming and FALSE otherwise +	BOOL isIncomingCall() { return mReceivedCall; } +  protected:  	virtual void setState(EState state); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index d677634be6..7e1e7c940f 100644 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -63,6 +63,7 @@  #include "llparcel.h"  #include "llviewerparcelmgr.h"  #include "llfirstuse.h" +#include "lltrans.h"  #include "llviewerwindow.h"  #include "llviewercamera.h"  #include "llvoavatarself.h" @@ -1161,11 +1162,12 @@ LLVoiceClient::LLVoiceClient() :  	mVoiceEnabled(false),  	mWriteInProgress(false), -	mLipSyncEnabled(false), -	mAPIVersion("Unknown") +	mLipSyncEnabled(false)  {	  	gVoiceClient = this; +	mAPIVersion = LLTrans::getString("NotConnected"); +  #if LL_DARWIN || LL_LINUX || LL_SOLARIS  		// HACK: THIS DOES NOT BELONG HERE  		// When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us. diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml index a8ca80eab9..d53d2d896c 100644 --- a/indra/newview/skins/default/colors.xml +++ b/indra/newview/skins/default/colors.xml @@ -81,7 +81,7 @@  	<color       name="AgentChatColor" -     reference="LtGray" /> +     reference="White" />      <color       name="AlertBoxColor"       value="0.24 0.24 0.24 1" /> @@ -669,7 +669,7 @@       reference="LtGray" />      <color       name="UserChatColor" -     reference="LtGray" /> +     reference="White" />      <color       name="llOwnerSayChatColor"       reference="LtGray" /> @@ -684,5 +684,8 @@      <color       name="SysWellItemSelected"       value="0.3 0.3 0.3 1.0" /> +	<color +     name="ChatToastAgentNameColor" +     value="1.0 0.3 1.0 1.0" />  </colors> diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml index a2b6dec91c..d1fca8984d 100644 --- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		for ca. US$ [USD] +		for ca. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Henter data... @@ -63,6 +63,6 @@ og prøv igen.  	<button label="Annullér" name="cancel_btn" />  	<button label="Køb" name="buy_btn" />  	<string name="buy_currency"> -		Køb L$ [LINDENS] for ca. US$ [USD] +		Køb L$ [LINDENS] for ca. [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml index 05750a1782..56b7868c33 100644 --- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		für ca. [USD] US$ +		für ca. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Daten werden geladen... @@ -63,6 +63,6 @@ Kaufen Sie mehr.  	<button label="Kaufen" name="buy_btn" />  	<button label="Abbrechen" name="cancel_btn" />  	<text name="buy_currency"> -		[LINDENS] L$ für ca. [USD] US$ kaufen +		[LINDENS] L$ für ca. [LOCALAMOUNT] kaufen  	</text>  </floater> diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml index 69f9f6a2f8..d378b427f1 100644 --- a/indra/newview/skins/default/xui/en/floater_camera.xml +++ b/indra/newview/skins/default/xui/en/floater_camera.xml @@ -12,6 +12,7 @@   help_topic="camera_floater"   save_rect="true"   save_visibility="true" + single_instance="true"   width="150">      <floater.string       name="rotate_tooltip"> diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml new file mode 100644 index 0000000000..04696ca2e7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + can_resize="true" + height="300" + layout="topleft" + name="floater_voice_controls" + title="Voice Controls" + save_visibility="true" + single_instance="true" + width="282"> +    <string +     name="title_nearby"> +        NEARBY VOICE +    </string> +    <string +     name="title_group"> +        Group Call with [GROUP] +    </string> +    <string +     name="title_adhoc"> +        Conference Call +    </string> +    <string +     name="no_one_near"> +        No one near +    </string> +    <panel +     bevel_style="in" +     follows="left|right|top" +     height="62" +     layout="topleft" +     left="0" +     name="control_panel" +     width="282"> +        <panel +         height="18" +         follows="top|left|right" +         layout="topleft" +         left="10" +         name="my_panel" +         width="263"> +            <avatar_icon +             enabled="false" +             follows="left|top" +             height="18" +             default_icon_name="Generic_Person" +             layout="topleft" +             left="0" +             name="user_icon" +             top="0" +             width="18" /> +            <text +             follows="top|left|right" +             font="SansSerifSmallBold" +             height="16" +             layout="topleft" +             left_pad="10" +             name="user_text" +             text_color="white" +             top="4" +             use_ellipses="true"  +             value="Mya Avatar:" +             width="210" /> +            <output_monitor +             auto_update="true" +             draw_border="false" +             follows="right" +             height="16" +             layout="topleft" +             name="speaking_indicator" +             right="-1" +             top="2"  +             visible="true" +             width="20" /> +        </panel> +        <layout_stack +         bottom="10" +         clip="false" +         follows="left|right|top" +         height="24" +         layout="bottomleft" +         orientation="horizontal" +         width="262"> +            <layout_panel +             follows="left" +             layout="topleft" +             min_width="24" +             top="0" +             user_resize="false" +             width="24"> +                <icon +                 height="24" +                 image_name="Microphone_On" +                 layout="topleft" +                 name="Microphone_On" +                 top="0" +                 width="24" /> +            </layout_panel> +            <layout_panel +             layout="topleft" +             top="0" +             user_resize="false" +             width="258"> +                <slider_bar +                 control_name="AudioLevelMic" +                 follows="left|right|top" +                 height="24" +                 increment="0.05" +                 layout="topleft" +                 left="0" +                 max_val="2" +                 name="volume_slider_bar" +                 tool_tip="Master Volume" +                 top="0" +                 value="0.75" +                 width="258" /> +            </layout_panel> +        </layout_stack> +    </panel> +    <avatar_list +     follows="all" +     height="197" +     ignore_online_status="true" +     layout="topleft" +     left="0" +     multi_select="true" +     name="speakers_list" +     width="282" /> +</floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 6e178ad570..cb0614797a 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1172,6 +1172,13 @@ Eject [AVATAR_NAME] from your land?    <notification     icon="alertmodal.tga" +   name="EjectAvatarFromGroup" +   type="notify"> +You ejected [AVATAR_NAME] from group [GROUP_NAME] +  </notification> + +  <notification +   icon="alertmodal.tga"     name="AcquireErrorTooManyObjects"     type="alertmodal">  ACQUIRE ERROR: Too many objects selected. @@ -2375,15 +2382,15 @@ Please choose the male or female avatar. You can change your mind later.    <notification     icon="alertmodal.tga"     name="GrantedModifyRights" -   type="alertmodal"> -[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects. +   type="notify"> +[NAME] has given you permission to edit their objects.    </notification>    <notification     icon="alertmodal.tga"     name="RevokedModifyRights" -   type="alertmodal"> -Your privilege to modify [FIRST_NAME] [LAST_NAME]'s objects has been revoked +   type="notify"> +Your privilege to modify [NAME]'s objects has been revoked    </notification>    <notification @@ -5776,6 +5783,26 @@ Server Error: Media update or get failed.           yestext="OK"/>      </notification> +    <notification + icon="alertmodal.tga" + name="TextChatIsMutedByModerator" + type="alertmodal"> +Your text chat has been muted by moderator. +        <usetemplate +         name="okbutton" +         yestext="OK"/> +    </notification> + +    <notification + icon="alertmodal.tga" + name="VoiceIsMutedByModerator" + type="alertmodal"> +Your voice has been muted by moderator. +        <usetemplate +         name="okbutton" +         yestext="OK"/> +    </notification> +    <notification     icon="alertmodal.tga"     name="ConfirmClearTeleportHistory" diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml index 368ab17689..f5fce65c73 100644 --- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml @@ -48,7 +48,6 @@           visible="false"           width="100" />          <button -         enabled="false"           follows="all"           bottom="10"           height="20" 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 2eaa3a94ee..45f9d9c7b6 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 @@ -7,6 +7,18 @@   name="avatar_list_item"   top="0"   width="320"> +    <!--  +    Strings used to localize last interaction time. +    See last_interaction textbox below. +    --> +    <string name="FormatSeconds">[COUNT]s</string> +    <string name="FormatMinutes">[COUNT]m</string> +    <string name="FormatHours">[COUNT]h</string> +    <string name="FormatDays">[COUNT]d</string> +    <string name="FormatWeeks">[COUNT]w</string> +    <string name="FormatMonths">[COUNT]mon</string> +    <string name="FormatYears">[COUNT]y</string> +       <icon       follows="top|right|left"       height="24" diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml index da8006d545..ec3f7ea7c5 100644 --- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml +++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml @@ -72,7 +72,13 @@             left="0"             name="talk"             top="4" -          width="100" /> +          width="100"> +              <show_button> +                  <show_button.init_callback +                   function="Button.SetDockableFloaterToggle" +                   parameter="voice_controls" /> +              </show_button> +          </talk_button>          </layout_panel>          <icon              auto_resize="false" diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml index 2b29796f0a..34c6e02684 100644 --- a/indra/newview/skins/default/xui/en/panel_chat_item.xml +++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml @@ -2,70 +2,26 @@  <!-- All our XML is utf-8 encoded. -->  <panel    name="instant_message" -  width="300" +  width="315"    height="180"    follows="all"> -	<panel -	width="290" -	height="24" -	background_visible="true" -	background_opaque="false" -	bg_alpha_color="Black" -	left="5" -	name="msg_caption"> -             <avatar_icon -         follows="left" -         height="18" -         image_name="Generic_Person" -         layout="topleft" -         left="3" -         mouse_opaque="true" -         name="avatar_icon" -         top="3" -         width="18" /> -    	<text -                font.style="BOLD" -                height="12" -	    layout="topleft" -	    left_pad="5" -	    top="7" -		text_color="white" -		word_wrap="false" -		use_ellipses="true" -        	mouse_opaque="true" -		name="sender_name" -        	width="150"> -	      Jerry Knight -    	</text> -   <!-- 	<icon top="22" left="215" width="15" height="15" follows="top|right" -      		image_name="icn_voice-pvtfocus.tga" visible="false" name="msg_inspector" />--> -    	<!--<icon top="22" left="215" width="10" height="10" follows="top|right" -      		image_name="speaking_indicator.tga"	name="msg_icon"/>--> -	 <text -            font="SansSerifSmall" -         follows="right|top" -	 halign="right" -         height="13" -         layout="topleft" -         right="-10" -	 left="205" -	 mouse_opaque="true" -      name="msg_time" -        top="8" -         value="23:30" -         width="50" -	 word_wrap="true" /> -	</panel> +     <avatar_icon +        follows="left|top" +        height="18" +        image_name="Generic_Person" +        layout="topleft" +        left="3" +        mouse_opaque="true" +        name="avatar_icon" +        top="3" +        width="18" />  	<text_chat -      top="-35" -      left="10" -      right="-10" +      top="5" +      left="30"        height="120" -      follows="left|right|bottom"        text_color="white"        word_wrap="true"        mouse_opaque="true"        name="msg_text"> -      To be or not to be, that is the question. Tis a far far better thing I do than I have ever done. Tis a far far better place I go, than I have ever been.  	</text_chat>  </panel> diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml index 41b210557e..889f29fc53 100644 --- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml @@ -61,7 +61,6 @@           width="125"/>          <button -         enabled="false"           bottom="10"           follows="all"            height="20" diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml index 0a5812882d..0a3fd1699f 100644 --- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml +++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml @@ -76,7 +76,6 @@           visible="false"           width="100" />          <button -         enabled="false"           bottom="10"           height="20"           label="Voice Controls" diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml index 4b91dc6294..c52b0c83d0 100644 --- a/indra/newview/skins/default/xui/en/panel_landmarks.xml +++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml @@ -6,6 +6,7 @@     layout="topleft"      left="0"     width="380" +   help_topic="panel_landmarks"     border="true"     background_visible="true"     bg_alpha_color="DkGray2" diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml index e00f654750..89f1fe35ca 100644 --- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml +++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml @@ -221,12 +221,23 @@     width="50" />    <text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label"> -    X +	X    </text> -  <spinner bottom_delta="0" -	     decimal_digits="0" enabled="true" follows="left|top" height="16" -	     increment="1" initial_val="256" label="" label_width="0" -	     left_delta="20" max_val="2048" min_val="0" mouse_opaque="true" -	     name="height_pixels" width="50" /> +  <spinner  +	  bottom_delta="0" +	  decimal_digits="0" +	  enabled="true" +	  follows="left|top"  +	  height="16" +	  increment="1" +	  initial_val="256"  +	  label="" +	  label_width="0" +	  left_delta="20"  +	  max_val="2048"  +	  min_val="0" +	  mouse_opaque="true" +	  name="height_pixels" +	  width="50" />  </panel> 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 bf33b752d9..9702bd41c8 100644 --- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml @@ -153,7 +153,7 @@       layout="topleft"       left="0"       name="favorite" -     image_drag_indication="Arrow_Down" +     image_drag_indication="arrow_down.tga"       chevron_button_tool_tip="Show more of My Favorites"       bottom="62"       width="590" /> diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml index ca84c9147b..4f0d155876 100644 --- a/indra/newview/skins/default/xui/en/panel_picks.xml +++ b/indra/newview/skins/default/xui/en/panel_picks.xml @@ -27,6 +27,7 @@     There are no picks/classifieds here   </text>   <accordion +  fit_parent="true"     follows="all"    height="465"    layout="topleft" diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml index af4c01185a..8b86067b03 100644 --- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml +++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml @@ -9,6 +9,11 @@  	width="800">    <string name="control_background_image_name">Inspector_Background</string>    <string name="skip_step">0.2</string> +  <string name="min_width">400</string> +  <string name="min_height">120</string> +  <string name="zoom_near_padding">1.0</string> +  <string name="zoom_medium_padding">1.25</string> +  <string name="zoom_far_padding">1.5</string>    <panel  	  name="media_region"  	  bottom="125" @@ -20,7 +25,7 @@  	  name="media_controls"  	  follows="left|right"  	  animate="false" -	  height="32" +	  height="26"  	  layout="topleft"  	  left="0"  	  orientation="horizontal" @@ -235,18 +240,17 @@  		width="190"  		min_width="90">  	  <!-- -		  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN - -<combo_box -name="media_address_url" -allow_text_entry="true" -height="22" -layout="topleft" -max_chars="1024" -tool_tip = "Media URL" -<combo_box.commit_callback -function="MediaCtrl.CommitURL" /> -</combo_box> +	  RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN +	  <combo_box +		  name="media_address_url" +		  allow_text_entry="true" +		  height="22" +		  layout="topleft" +		  max_chars="1024" +		  tool_tip = "Media URL"> +		<combo_box.commit_callback +			function="MediaCtrl.CommitURL" /> +	  </combo_box>  	  -->  	  <line_editor   		  name="media_address_url" @@ -304,17 +308,17 @@ function="MediaCtrl.CommitURL" />  		user_resize="false"  		follows="left|right|top|bottom"  		layout="topleft" +		height="16"		  		min_width="100"  		width="200">  	  <slider_bar  		  name="media_play_slider"  		  follows="left|right|top" -		  height="22" +		  height="16"  		  increment="0.05"  		  initial_value="0.5"  		  layout="topleft"  		  tool_tip="Movie play progress" -		  top="8"  		  min_width="100"  		  width="200">  		<slider_bar.commit_callback @@ -619,7 +623,7 @@ function="MediaCtrl.CommitURL" />    </layout_stack>    <layout_stack  	  follows="left|right|bottom" -	  height="32" +	  height="20"  	  layout="topleft"  	  animate="false"  	  left="0" @@ -632,7 +636,7 @@ function="MediaCtrl.CommitURL" />  		user_resize="false" />  	<panel  		name="media_progress_indicator" -		height="22" +		height="20"  		layout="topleft"  		left="0"  		top="0" @@ -644,6 +648,7 @@ function="MediaCtrl.CommitURL" />  		  name="media_progress_bar"  		  color_bar="1 1 1 0.96"  		  follows="left|right|top" +		  top="5"  		  height="8"  		  layout="topleft"  		  left="0" diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml index e357301152..5dcee9e965 100644 --- a/indra/newview/skins/default/xui/en/panel_status_bar.xml +++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml @@ -80,6 +80,17 @@       name="volume_btn"       tool_tip="Global Volume Control"       width="16" /> +    <panel +     class="panel_volume_pulldown" +     follows="all" +     height="533" +     layout="topleft" +     left="0" +     name="volume_pulldown" +     top="5" +     visible="false" +     width="313" /> +      <text       enabled="true"       follows="right|bottom" diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml index 01204ba779..32fc9fce01 100644 --- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml +++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml @@ -1,5 +1,6 @@  <?xml version="1.0" encoding="utf-8" standalone="yes" ?>  <panel name="Teleport History" bottom="0" height="326" left="0" width="380" +     help_topic="panel_teleport_history"       border="true" follows="left|top|right|bottom">           <accordion       follows="left|top|right|bottom" diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 3c03f0a8cf..e47ec1ebda 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -267,6 +267,7 @@  	<string name="ChangePermissions">Change its permissions</string>  	<string name="TrackYourCamera">Track your camera</string>  	<string name="ControlYourCamera">Control your camera</string> +	<string name="NotConnected">Not Connected</string>  	<!-- Sim Access labels -->  	<string name="SIM_ACCESS_PG">PG</string> @@ -2263,22 +2264,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Attached">Attached</string>  <string name="Attached Earlobes">Attached Earlobes</string> -<string name="Back Bangs">Back Bangs</string> -<string name="Back Bangs Down">Back Bangs Down</string> -<string name="Back Bangs Up">Back Bangs Up</string> +  <string name="Back Fringe">Back Fringe</string> -<string name="Back Hair">Back Hair</string> -<string name="Back Hair Down">Back Hair Down</string> -<string name="Back Hair Up">Back Hair Up</string> +  <string name="Baggy">Baggy</string>  <string name="Bangs">Bangs</string> -<string name="Bangs Down">Bangs Down</string> -<string name="Bangs Up">Bangs Up</string> +  <string name="Beady Eyes">Beady Eyes</string>  <string name="Belly Size">Belly Size</string>  <string name="Big">Big</string>  <string name="Big Butt">Big Butt</string> -<string name="Big Eyeball">Big Eyeball</string> +  <string name="Big Hair Back">Big Hair: Back</string>  <string name="Big Hair Front">Big Hair: Front</string>  <string name="Big Hair Top">Big Hair: Top</string> @@ -2348,20 +2344,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Corner Down">Corner Down</string> -<string name="Corner Normal">Corner Normal</string> +  <string name="Corner Up">Corner Up</string>  <string name="Creased">Creased</string>  <string name="Crooked Nose">Crooked Nose</string> -<string name="Cropped Hair">Cropped Hair</string> +  <string name="Cuff Flare">Cuff Flare</string>  <string name="Dark">Dark</string>  <string name="Dark Green">Dark Green</string>  <string name="Darker">Darker</string>  <string name="Deep">Deep</string>  <string name="Default Heels">Default Heels</string> -<string name="Default Toe">Default Toe</string> +  <string name="Dense">Dense</string> -<string name="Dense hair">Dense hair</string> +  <string name="Double Chin">Double Chin</string>  <string name="Downturned">Downturned</string>  <string name="Duffle Bag">Duffle Bag</string> @@ -2377,7 +2373,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Eye Pop">Eye Pop</string>  <string name="Eye Size">Eye Size</string>  <string name="Eye Spacing">Eye Spacing</string> -<string name="Eyeball Size">Eyeball Size</string> +  <string name="Eyebrow Arc">Eyebrow Arc</string>  <string name="Eyebrow Density">Eyebrow Density</string> @@ -2388,27 +2384,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Eyelash Length">Eyelash Length</string>  <string name="Eyeliner">Eyeliner</string>  <string name="Eyeliner Color">Eyeliner Color</string> -<string name="Eyes Back">Eyes Back</string> +  <string name="Eyes Bugged">Eyes Bugged</string> -<string name="Eyes Forward">Eyes Forward</string> -<string name="Eyes Long Head">Eyes Long Head</string> + +  <string name="Eyes Shear Left Up">Eyes Shear Left Up</string>  <string name="Eyes Shear Right Up">Eyes Shear Right Up</string> -<string name="Eyes Short Head">Eyes Short Head</string> -<string name="Eyes Spread">Eyes Spread</string> -<string name="Eyes Sunken">Eyes Sunken</string> -<string name="Eyes Together">Eyes Together</string> + + + +  <string name="Face Shear">Face Shear</string>  <string name="Facial Definition">Facial Definition</string>  <string name="Far Set Eyes">Far Set Eyes</string> -<string name="Fat">Fat</string> -<string name="Fat Head">Fat Head</string> +  <string name="Fat Lips">Fat Lips</string> -<string name="Fat Lower">Fat Lower</string> -<string name="Fat Lower Lip">Fat Lower Lip</string> -<string name="Fat Torso">Fat Torso</string> -<string name="Fat Upper">Fat Upper</string> -<string name="Fat Upper Lip">Fat Upper Lip</string> +  <string name="Female">Female</string>  <string name="Fingerless">Fingerless</string>  <string name="Fingers">Fingers</string> @@ -2421,12 +2412,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Forehead Angle">Forehead Angle</string>  <string name="Forehead Heavy">Forehead Heavy</string>  <string name="Freckles">Freckles</string> -<string name="Front Bangs Down">Front Bangs Down</string> -<string name="Front Bangs Up">Front Bangs Up</string> +  <string name="Front Fringe">Front Fringe</string> -<string name="Front Hair">Front Hair</string> -<string name="Front Hair Down">Front Hair Down</string> -<string name="Front Hair Up">Front Hair Up</string> +  <string name="Full Back">Full Back</string>  <string name="Full Eyeliner">Full Eyeliner</string>  <string name="Full Front">Full Front</string> @@ -2525,7 +2513,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Long Ponytail">Long Ponytail</string>  <string name="Long Torso">Long Torso</string>  <string name="Long arms">Long arms</string> -<string name="Longcuffs">Longcuffs</string> +  <string name="Loose Pants">Loose Pants</string>  <string name="Loose Shirt">Loose Shirt</string> @@ -2585,7 +2573,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="No Blush">No Blush</string>  <string name="No Eyeliner">No Eyeliner</string>  <string name="No Eyeshadow">No Eyeshadow</string> -<string name="No Heels">No Heels</string> +  <string name="No Lipgloss">No Lipgloss</string>  <string name="No Lipstick">No Lipstick</string>  <string name="No Part">No Part</string> @@ -2606,7 +2594,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Nostril Division">Nostril Division</string>  <string name="Nostril Width">Nostril Width</string> -<string name="Old">Old</string> +  <string name="Opaque">Opaque</string>  <string name="Open">Open</string>  <string name="Open Back">Open Back</string> @@ -2643,7 +2631,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Platform Width">Platform Width</string>  <string name="Pointy">Pointy</string>  <string name="Pointy Heels">Pointy Heels</string> -<string name="Pointy Toe">Pointy Toe</string> +  <string name="Ponytail">Ponytail</string>  <string name="Poofy Skirt">Poofy Skirt</string>  <string name="Pop Left Eye">Pop Left Eye</string> @@ -2652,30 +2640,30 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Puffy Eyelids">Puffy Eyelids</string>  <string name="Rainbow Color">Rainbow Color</string>  <string name="Red Hair">Red Hair</string> -<string name="Red Skin">Red Skin</string> +  <string name="Regular">Regular</string> -<string name="Regular Muscles">Regular Muscles</string> +  <string name="Right Part">Right Part</string>  <string name="Rosy Complexion">Rosy Complexion</string>  <string name="Round">Round</string> -<string name="Round Forehead">Round Forehead</string> +  <string name="Ruddiness">Ruddiness</string>  <string name="Ruddy">Ruddy</string>  <string name="Rumpled Hair">Rumpled Hair</string>  <string name="Saddle Bags">Saddle Bags</string> -<string name="Saddlebags">Saddlebags</string> -<string name="Scrawny">Scrawny</string> + +  <string name="Scrawny Leg">Scrawny Leg</string>  <string name="Separate">Separate</string> -<string name="Shading">Shading</string> -<string name="Shadow hair">Shadow hair</string> + +  <string name="Shallow">Shallow</string>  <string name="Shear Back">Shear Back</string>  <string name="Shear Face">Shear Face</string>  <string name="Shear Front">Shear Front</string> -<string name="Shear Left">Shear Left</string> +  <string name="Shear Left Up">Shear Left Up</string> -<string name="Shear Right">Shear Right</string> +  <string name="Shear Right Up">Shear Right Up</string>  <string name="Sheared Back">Sheared Back</string>  <string name="Sheared Front">Sheared Front</string> @@ -2699,16 +2687,14 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Short Torso">Short Torso</string>  <string name="Short hips">Short hips</string>  <string name="Shoulders">Shoulders</string> -<string name="Side Bangs">Side Bangs</string> -<string name="Side Bangs Down">Side Bangs Down</string> -<string name="Side Bangs Up">Side Bangs Up</string> +  <string name="Side Fringe">Side Fringe</string>  <string name="Sideburns">Sideburns</string>  <string name="Sides Hair">Sides Hair</string>  <string name="Sides Hair Down">Sides Hair Down</string>  <string name="Sides Hair Up">Sides Hair Up</string> -<string name="Skinny">Skinny</string> +  <string name="Skinny Neck">Skinny Neck</string>  <string name="Skirt Fit">Skirt Fit</string>  <string name="Skirt Length">Skirt Length</string> @@ -2729,7 +2715,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Smooth Hair">Smooth Hair</string>  <string name="Socks Length">Socks Length</string> -<string name="Some">Some</string> +  <string name="Soulpatch">Soulpatch</string>  <string name="Sparse">Sparse</string> @@ -2737,24 +2723,21 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Square">Square</string>  <string name="Square Toe">Square Toe</string>  <string name="Squash Head">Squash Head</string> -<string name="Squash/Stretch Head">Squash/Stretch Head</string> +  <string name="Stretch Head">Stretch Head</string>  <string name="Sunken">Sunken</string>  <string name="Sunken Chest">Sunken Chest</string>  <string name="Sunken Eyes">Sunken Eyes</string>  <string name="Sweep Back">Sweep Back</string>  <string name="Sweep Forward">Sweep Forward</string> -<string name="Swept Back">Swept Back</string> -<string name="Swept Back Hair">Swept Back Hair</string> -<string name="Swept Forward">Swept Forward</string> -<string name="Swept Forward Hair">Swept Forward Hair</string> +  <string name="Tall">Tall</string>  <string name="Taper Back">Taper Back</string>  <string name="Taper Front">Taper Front</string>  <string name="Thick Heels">Thick Heels</string>  <string name="Thick Neck">Thick Neck</string>  <string name="Thick Toe">Thick Toe</string> -<string name="Thickness">Thickness</string> +  <string name="Thin">Thin</string>  <string name="Thin Eyebrows">Thin Eyebrows</string>  <string name="Thin Lips">Thin Lips</string> @@ -2765,8 +2748,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].  <string name="Tight Shirt">Tight Shirt</string>  <string name="Tight Skirt">Tight Skirt</string>  <string name="Tight Sleeves">Tight Sleeves</string> -<string name="Tilt Left">Tilt Left</string> -<string name="Tilt Right">Tilt Right</string> +  <string name="Toe Shape">Toe Shape</string>  <string name="Toe Thickness">Toe Thickness</string>  <string name="Torso Length">Torso Length</string> diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml index af542acbce..eb25493adc 100644 --- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" width="138" left_delta="68"> -		L$  por, aprox., [USD] US$ +		por, aprox., [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Obteniendo los datos... @@ -63,6 +63,6 @@ Aumente la cantidad a comprar.  	<button label="Cancelar" name="cancel_btn"/>  	<button label="Comprar" name="buy_btn"/>  	<string name="buy_currency"> -		Compre [LINDENS] L$ por, aprox., [USD] US$ +		Compre [LINDENS] L$ por, aprox., [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml index 4417006fc6..a4ad14294e 100644 --- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml +++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml @@ -114,12 +114,13 @@ La longueur maximale est de [MAX_LENGTH] secondes.  	</text>  	<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>  	<check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/> -	<spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> -	<spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> -	<text name="hand_label" width="110"> -		Mouvement de main +	<spinner label="Début (%)" label_width="65" name="loop_in_point" tool_tip="Définit le moment de l'animation où la boucle repart." width="105"/> +	<spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l'animation où la boucle finit."/> +	<text name="hand_label"> +		Mouvement de +main  	</text> -	<combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation" width="124"> +	<combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l'animation">  		<combo_box.item label="Doigts écartés" name="Spread"/>  		<combo_box.item label="Détendues" name="Relaxed"/>  		<combo_box.item label="Pointer (les deux)" name="PointBoth"/> @@ -137,7 +138,7 @@ La longueur maximale est de [MAX_LENGTH] secondes.  	<text name="emote_label">  		Expression  	</text> -	<combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation." width="124"> +	<combo_box label="" name="emote_combo" tool_tip="Contrôle l'expression du visage au cours de l'animation.">  		<combo_box.item label="None]" name="[None]"/>  		<combo_box.item label="Aaaaah" name="Aaaaah"/>  		<combo_box.item label="Effrayé" name="Afraid"/> @@ -159,27 +160,25 @@ La longueur maximale est de [MAX_LENGTH] secondes.  		<combo_box.item label="Clin d'œil" name="Wink"/>  		<combo_box.item label="Soucis" name="Worry"/>  	</combo_box> -	<text name="preview_label" width="110"> -		Prévisualiser pendant +	<text name="preview_label"> +		Prévisualiser +pendant  	</text> -	<combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124"> +	<combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">  		<combo_box.item label="Debout" name="Standing"/>  		<combo_box.item label="En train de marcher" name="Walking"/>  		<combo_box.item label="Assis" name="Sitting"/>  		<combo_box.item label="En train de voler" name="Flying"/>  	</combo_box> -	<spinner label="Transition  -début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> -	<spinner label="Transition  -fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." width="125"/> -	<button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/> +	<spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l'animation s'intègre au mouvement."/> +	<spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l'animation disparaît du mouvement." /> +	<button label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>  	<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>  	<slider label="" name="playback_slider"/>  	<text name="bad_animation_text">  		Impossible de lire le fichier d'animation. -Nous recommandons les fichiers BVH extraits de -Poser 4. +Nous recommandons les fichiers BVH extraits de Poser 4.  	</text>  	<button label="Annuler" name="cancel_btn"/>  	<button label="Charger ([AMOUNT] L$)" name="ok_btn"/> diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml index 9112d30be2..603b7587b4 100644 --- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" width="138" left_delta="68"> -		L$  pour environ [USD] US$ +		pour environ [LOCALAMOUNT]  	</text>  	<text name="getting_data" width="138">  		Obtention des données... @@ -64,6 +64,6 @@ Veuillez saisir un montant plus élevé.  	<button label="Acheter" name="buy_btn"/>  	<button label="Annuler" name="cancel_btn"/>  	<string name="buy_currency"> -		Acheter [LINDENS] L$ pour environ [USD] US$ +		Acheter [LINDENS] L$ pour environ [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml index 1f76202dee..ddb868b04a 100644 --- a/indra/newview/skins/default/xui/fr/floater_world_map.xml +++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml @@ -1,71 +1,68 @@  <?xml version="1.0" encoding="utf-8" standalone="yes"?>  <floater name="worldmap" title="CARTE DU MONDE"> -	<tab_container name="maptab" width="955"> -		<panel label="Objets" name="objects_mapview" width="953"/> -		<panel label="Terrain" name="terrain_mapview" width="953"/> -	</tab_container> -	<icon left="973" name="self"/> +	<panel name="objects_mapview" width="542"/> +	<icon name="self" left="-270"/>  	<text name="you_label">  		Vous  	</text> -	<icon left="1033" name="home"/> +	<icon name="home"/>  	<text name="home_label">  		Domicile  	</text> -	<icon left="973" name="square2"/> +	<icon name="square2" left="-270"/>  	<text name="auction_label">  		Terrain aux enchères  	</text> -	<icon left="1105" name="square"/> +	<icon name="square" left_delta="130"/>  	<text name="land_for_sale_label">  		Terrain à vendre  	</text> -	<button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/> -	<icon left="977" name="person"/> +	<button left="-120" width="108" label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/> +	<icon left="-262" name="person"/>  	<check_box label="Résident" name="people_chk"/> -	<icon left="973" name="infohub"/> +	<icon left="-266" name="infohub"/>  	<check_box label="Infohub" name="infohub_chk"/> -	<icon left="973" name="telehub"/> +	<icon left="-266" name="telehub"/>  	<check_box label="Téléhub" name="telehubchk"/> -	<icon left="973" name="landforsale"/> +	<icon left="-266" name="landforsale"/>  	<check_box label="Terrain à vendre" name="land_for_sale_chk"/> -	<text name="events_label" left="1099"> +	<text name="events_label" left="-144">  		Événements :  	</text> -	<icon left="1121" name="event"/> +	<icon left="-132" name="event"/>  	<check_box label="PG" name="event_chk"/> -	<icon left="1121" name="events_mature_icon"/> +	<icon left="-132" name="events_mature_icon"/>  	<check_box label="Mature" name="event_mature_chk"/> -	<icon left="1121" name="events_adult_icon"/> +	<icon left="-132" name="events_adult_icon"/>  	<check_box label="Adult" name="event_adult_chk"/> -	<icon left="973" name="avatar_icon"/> +	<icon left="-270" name="avatar_icon"/>  	<combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">  		<combo_box.item name="item1" label="Amis connectés" />  	</combo_box> -	<icon left="973" name="landmark_icon"/> +	<icon left="-270" name="landmark_icon"/>  	<combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">  		<combo_box.item name="item1" label="Repères" />  	</combo_box> -	<icon left="973" name="location_icon"/> +	<icon left="-270" name="location_icon"/>  	<line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d'une région" width="155"/>  	<button label="Rechercher" label_selected=">" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/> -	<text left="973" name="search_label"> +	<text left="-270" name="search_label">  		Résultats de la recherche :  	</text> -	<scroll_list left="973" name="search_results" width="252"> +	<scroll_list left="-270" name="search_results" width="252">  		<column label="" name="icon"/>  		<column label="" name="sim_name"/>  	</scroll_list> -	<text left="973" name="location_label"> +	<text left="-270" name="location_label">  		Emplacement :  	</text> -	<spinner left="1078" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/> +	<spinner left_delta="100" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>  	<spinner name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>  	<spinner name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>  	<button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l'endroit sélectionné"/>  	<button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l'endroit sélectionné" width="165"/>  	<button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>  	<button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l'emplacement de votre avatar" width="165"/> -	<button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l'emplacement actuel comme SLurl pour l'utiliser sur le Web." width="262"/> +	<button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l'emplacement actuel comme SLurl pour l'utiliser sur le Web." />  	<slider label="Zoom" left="-270" name="zoom slider"/>  </floater> diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml index 6b881683f1..a22850bc4b 100644 --- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		L$  per circa [USD]US$ +		per circa [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Dati in ricezione... @@ -64,6 +64,6 @@ Devi aumentare l'importo da acquistare.  	<button label="Cancella" name="cancel_btn"/>  	<button label="Acquista" name="buy_btn"/>  	<string name="buy_currency"> -		acquistare [LINDENS] L$ per circa [USD] US$ +		acquistare [LINDENS]L$ per circa [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml index 9d5aea612b..35516301fc 100644 --- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		約US$ [USD] +		約[LOCALAMOUNT]  	</text>  	<text name="getting_data" left_delta="3">  		データを取得しています... @@ -63,6 +63,6 @@  	<button label="購入" name="buy_btn" />  	<button label="取り消し" name="cancel_btn" />  	<text name="buy_currency"> -		約US$ [USD]でL$ [LINDENS]を購入 +		約[LOCALAMOUNT]でL$ [LINDENS]を購入  	</text>  </floater> diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml index b6fc743abe..6ee5cc5341 100644 --- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" left_delta="80"> -		voor ong. US$ [USD] +		voor ong. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Data ophalen… @@ -63,6 +63,6 @@ Verhoog de hoeveelheid die gekocht moet worden.  	<button label="Annuleren" name="cancel_btn"/>  	<button label="Kopen" name="buy_btn"/>  	<string name="buy_currency"> -		Koop L$ [LINDENS] voor ong. US$ [USD] +		Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml index b0b8935433..5e59482883 100755 --- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est"> -		L$ za [USD]US$ +		za [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Otrzymywanie danych... @@ -64,6 +64,6 @@ Proszę zwiększyć ilość.  	<button label="Anuluj" name="cancel_btn" />  	<button label="Kup" name="buy_btn" />  	<string name="buy_currency"> -		Kup [LINDENS]L$ za [USD]US$ +		Kup [LINDENS]L$ za [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml index ceeb070c4e..aac8438fdc 100644 --- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml +++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml @@ -29,7 +29,7 @@  		1234  	</line_editor>  	<text name="currency_est" left_delta="72"> -		por aproxim. US$ [USD] +		por aproxim. [LOCALAMOUNT]  	</text>  	<text name="getting_data">  		Obtendo dados... @@ -63,6 +63,6 @@ Aumente a quantidade de compra.  	<button label="Fechar" name="cancel_btn"/>  	<button label="Adquirir" name="buy_btn"/>  	<string name="buy_currency"> -		Comprar L$ [LINDENS] por aproximadamente US$ [USD] +		Comprar L$ [LINDENS] por aproxim. [LOCALAMOUNT]  	</string>  </floater> diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 4193343d64..4133315480 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -278,10 +278,12 @@ class WindowsManifest(ViewerManifest):              # Vivox runtimes              self.path("SLVoice.exe") -            self.path("alut.dll")              self.path("vivoxsdk.dll")              self.path("ortp.dll") -            self.path("wrap_oal.dll") +            self.path("libsndfile-1.dll") +            self.path("zlib1.dll") +            self.path("vivoxplatform.dll") +            self.path("vivoxoal.dll")              # For google-perftools tcmalloc allocator.              try: @@ -537,10 +539,11 @@ class DarwinManifest(ViewerManifest):                  self.path("zh-Hans.lproj")                  # SLVoice and vivox lols -                self.path("vivox-runtime/universal-darwin/libalut.dylib", "libalut.dylib") -                self.path("vivox-runtime/universal-darwin/libopenal.dylib", "libopenal.dylib") +                self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib") +                self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib")                  self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")                  self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib") +                self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib")                  self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")                  libdir = "../../libraries/universal-darwin/lib_release" @@ -839,7 +842,10 @@ class Linux_i686Manifest(LinuxManifest):                      self.end_prefix()              if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):                      self.path("libortp.so") +                    self.path("libsndfile.so.1") +                    self.path("libvivoxoal.so.1")                      self.path("libvivoxsdk.so") +                    self.path("libvivoxplatform.so")                      self.end_prefix("lib")  class Linux_x86_64Manifest(LinuxManifest):  | 
