Automated merge with file:///Users/oz/Work/viewer-vs2010
commit
85ccab2d81
8
.hgtags
8
.hgtags
|
|
@ -71,3 +71,11 @@ b723921b5c711bd24dbe77dc76ef488b544dac78 2.5.0-release
|
|||
b723921b5c711bd24dbe77dc76ef488b544dac78 DRTVWR-31_2.5.0-release
|
||||
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
|
||||
63a6aedfce785a6c760377bf685b2dae616797d2 2.5.1-start
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d 2.5.1-release
|
||||
4dede9ae1ec74d41f6887719f6f1de7340d8578d DRTVWR-37_2.5.1-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 DRTVWR-38_2.5.2-release
|
||||
b53a0576eec80614d7767ed72b40ed67aeff27c9 2.5.2-release
|
||||
92e58e51776a4f8c29069b1a62ff21454d2085f0 2.6.0-start
|
||||
f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
|
||||
f1827b441e05bf37c68e2c15ebc6d09e9b03f527 2.6.0-start
|
||||
4e9eec6a347f89b2b3f295beb72f1cf7837dff66 2.6.0-start
|
||||
|
|
|
|||
75
BuildParams
75
BuildParams
|
|
@ -48,6 +48,12 @@ viewer-beta.login_channel = "Second Life Beta Viewer"
|
|||
viewer-beta.build_debug_release_separately = true
|
||||
viewer-beta.build_viewer_update_version_manager = true
|
||||
|
||||
viewer-pre-beta.viewer_channel = "Second Life Beta Viewer"
|
||||
viewer-pre-beta.login_channel = "Second Life Beta Viewer"
|
||||
viewer-pre-beta.build_debug_release_separately = true
|
||||
viewer-pre-beta.build_viewer_update_version_manager = true
|
||||
|
||||
|
||||
# ========================================
|
||||
# Viewer Release
|
||||
# ========================================
|
||||
|
|
@ -57,14 +63,11 @@ viewer-release.build_debug_release_separately = true
|
|||
viewer-release.build_viewer_update_version_manager = true
|
||||
viewer-release.release-viewer.jira = DRTVWR-13
|
||||
|
||||
# ========================================
|
||||
# aimee
|
||||
# ========================================
|
||||
|
||||
viewer-development-import.build_debug_release_separately = true
|
||||
viewer-development-fixes.build_debug_release_separately = true
|
||||
viewer-development-tweaks.build_debug_release_separately = true
|
||||
|
||||
viewer-pre-release.viewer_channel = "Second Life Release"
|
||||
viewer-pre-release.login_channel = "Second Life Release"
|
||||
viewer-pre-release.build_debug_release_separately = true
|
||||
viewer-pre-release.build_viewer_update_version_manager = true
|
||||
#viewer-pre-release.release-viewer.jira = DRTVWR-13
|
||||
# =======================================
|
||||
# brad
|
||||
# ========================================
|
||||
|
|
@ -152,55 +155,7 @@ media.build_viewer_update_version_manager = false
|
|||
# oz
|
||||
# ================
|
||||
|
||||
oz_viewer-review1_coverity.coverity_product = viewer
|
||||
|
||||
oz_viewer-review1.build_Linux = true
|
||||
oz_viewer-review1_debug.build_Linux = false
|
||||
oz_viewer-review1_coverity.build_Linux = false
|
||||
|
||||
oz_viewer-review1.build_Darwin = true
|
||||
oz_viewer-review1_debug.build_Darwin = false
|
||||
oz_viewer-review1_coverity.build_Darwin = false
|
||||
|
||||
oz_viewer-review1.build_CYGWIN = true
|
||||
oz_viewer-review1.build_CYGWIN_Debug = false
|
||||
oz_viewer-review1.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review1.build_CYGWIN_Release = true
|
||||
oz_viewer-review1_debug.build_CYGWIN_Debug = true
|
||||
oz_viewer-review1_debug.build_CYGWIN_RelWithDebInfo = true
|
||||
oz_viewer-review1_debug.build_CYGWIN_Release = false
|
||||
oz_viewer-review1_coverity.build_coverity = true
|
||||
oz_viewer-review1_coverity.build_CYGWIN_Debug = false
|
||||
oz_viewer-review1_coverity.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review1_coverity.build_CYGWIN_Release = false
|
||||
|
||||
oz_viewer-review2_coverity.coverity_product = viewer
|
||||
|
||||
oz_viewer-review2.build_Linux = true
|
||||
oz_viewer-review2_debug.build_Linux = false
|
||||
oz_viewer-review2_coverity.build_Linux = false
|
||||
|
||||
oz_viewer-review2.build_Darwin = true
|
||||
oz_viewer-review2_debug.build_Darwin = false
|
||||
oz_viewer-review2_coverity.build_Darwin = false
|
||||
|
||||
oz_viewer-review2.build_CYGWIN = true
|
||||
oz_viewer-review2.build_CYGWIN_Debug = false
|
||||
oz_viewer-review2.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review2.build_CYGWIN_Release = true
|
||||
oz_viewer-review2_debug.build_CYGWIN_Debug = true
|
||||
oz_viewer-review2_debug.build_CYGWIN_RelWithDebInfo = true
|
||||
oz_viewer-review2_debug.build_CYGWIN_Release = false
|
||||
oz_viewer-review2_coverity.build_coverity = true
|
||||
oz_viewer-review2_coverity.build_CYGWIN_Debug = false
|
||||
oz_viewer-review2_coverity.build_CYGWIN_RelWithDebInfo = false
|
||||
oz_viewer-review2_coverity.build_CYGWIN_Release = false
|
||||
|
||||
# ========================================
|
||||
# tofu
|
||||
# ========================================
|
||||
|
||||
tofu_viewer-development-staging.email = tofu.linden@lindenlab.com
|
||||
viewer-devreview.build_debug_release_separately = true
|
||||
|
||||
# ========================================
|
||||
# enus
|
||||
|
|
@ -237,7 +192,11 @@ viewer-asset-delivery-metrics.build_server_tests = false
|
|||
#==============================================================================
|
||||
# autobuild viewers
|
||||
#==============================================================================
|
||||
viewer-autobuild.build_link_parallel = false
|
||||
viewer-autobuild2010.build_debug_release_separately = true
|
||||
viewer-autobuild2010.viewer_channel = "Project Viewer - VS2010"
|
||||
viewer-autobuild2010.login_channel = "Project Viewer - VS2010"
|
||||
viewer-autobuild2010.viewer_grid = agni
|
||||
viewer-autobuild2010.build_link_parallel = false
|
||||
|
||||
#========================================
|
||||
# VS2010
|
||||
|
|
|
|||
882
autobuild.xml
882
autobuild.xml
File diff suppressed because it is too large
Load Diff
42
build.sh
42
build.sh
|
|
@ -119,26 +119,41 @@ fi
|
|||
# First three parts only, $revision will be appended automatically.
|
||||
build_viewer_update_version_manager_version=`python scripts/get_version.py --viewer-version | sed 's/\.[0-9]*$//'`
|
||||
|
||||
export autobuild_dir="$here/../../../autobuild/bin/"
|
||||
if [ -d "$autobuild_dir" ]
|
||||
if [ -z "$AUTOBUILD" ]
|
||||
then
|
||||
export AUTOBUILD="$autobuild_dir"autobuild
|
||||
if [ -x "$AUTOBUILD" ]
|
||||
export autobuild_dir="$here/../../../autobuild/bin/"
|
||||
if [ -d "$autobuild_dir" ]
|
||||
then
|
||||
# *HACK - bash doesn't know how to pass real pathnames to native windows python
|
||||
case "$arch" in
|
||||
CYGWIN) AUTOBUILD=$(cygpath -u $AUTOBUILD.cmd) ;;
|
||||
esac
|
||||
export AUTOBUILD="$autobuild_dir"autobuild
|
||||
if [ -x "$AUTOBUILD" ]
|
||||
then
|
||||
# *HACK - bash doesn't know how to pass real pathnames to native windows python
|
||||
case "$arch" in
|
||||
CYGWIN) AUTOBUILD=$(cygpath -u $AUTOBUILD.cmd) ;;
|
||||
esac
|
||||
else
|
||||
record_failure "Not executable: $AUTOBUILD"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
record_failure "Not executable: $AUTOBUILD"
|
||||
record_failure "Not found: $autobuild_dir"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
record_failure "Not found: $autobuild_dir"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# load autbuild provided shell functions and variables
|
||||
# Merov: going back to the previous code that passes even if it fails catching a failure
|
||||
# TODO: use the correct code here under and fix the llbase import in python code
|
||||
#if "$AUTOBUILD" source_environment > source_environment
|
||||
#then
|
||||
# . source_environment
|
||||
#else
|
||||
# dump environment variables for debugging
|
||||
# env|sort
|
||||
# record_failure "autobuild source_environment failed"
|
||||
# cat source_environment >&3
|
||||
# exit 1
|
||||
#fi
|
||||
eval "$("$AUTOBUILD" source_environment)"
|
||||
|
||||
# dump environment variables for debugging
|
||||
|
|
@ -166,7 +181,7 @@ do
|
|||
rm -rf "$build_dir"
|
||||
mkdir -p "$build_dir"
|
||||
mkdir -p "$build_dir/tmp"
|
||||
export TMP="$build_dir/tmp"
|
||||
#export TMP="$build_dir/tmp"
|
||||
if pre_build "$variant" "$build_dir" >> "$build_log" 2>&1
|
||||
then
|
||||
if $build_link_parallel
|
||||
|
|
@ -233,6 +248,7 @@ then
|
|||
succeeded=$build_coverity
|
||||
else
|
||||
upload_item installer "$package" binary/octet-stream
|
||||
upload_item quicklink "$package" binary/octet-stream
|
||||
|
||||
# Upload crash reporter files.
|
||||
case "$last_built_variant" in
|
||||
|
|
|
|||
|
|
@ -84,10 +84,12 @@ Aleric Inglewood
|
|||
VWR-24315
|
||||
VWR-24317
|
||||
VWR-24320
|
||||
VWR-24321
|
||||
VWR-24321
|
||||
VWR-24337
|
||||
VWR-24354
|
||||
VWR-24366
|
||||
VWR-24519
|
||||
VWR-24520
|
||||
SNOW-84
|
||||
SNOW-477
|
||||
SNOW-744
|
||||
|
|
@ -156,6 +158,7 @@ Ann Congrejo
|
|||
CT-193
|
||||
Ardy Lay
|
||||
VWR-19499
|
||||
VWR-24917
|
||||
Argent Stonecutter
|
||||
VWR-68
|
||||
Armin Weatherwax
|
||||
|
|
@ -236,6 +239,7 @@ Coaldust Numbers
|
|||
VWR-1095
|
||||
Cron Stardust
|
||||
VWR-10579
|
||||
VWR-25120
|
||||
Cypren Christenson
|
||||
STORM-417
|
||||
Dale Glass
|
||||
|
|
@ -402,8 +406,17 @@ Jonathan Yap
|
|||
STORM-977
|
||||
STORM-979
|
||||
STORM-980
|
||||
STORM-1040
|
||||
VWR-17801
|
||||
VWR-24347
|
||||
STORM-975
|
||||
STORM-990
|
||||
STORM-844
|
||||
STORM-643
|
||||
STORM-1020
|
||||
STORM-1064
|
||||
STORM-960
|
||||
STORM-953
|
||||
Kage Pixel
|
||||
VWR-11
|
||||
Ken March
|
||||
|
|
@ -420,6 +433,7 @@ Kitty Barnett
|
|||
STORM-288
|
||||
STORM-799
|
||||
STORM-800
|
||||
STORM-1001
|
||||
VWR-24217
|
||||
Kunnis Basiat
|
||||
VWR-82
|
||||
|
|
@ -826,11 +840,14 @@ Whoops Babii
|
|||
Wilton Lundquist
|
||||
VWR-7682
|
||||
WolfPup Lowenhar
|
||||
OPEN-1
|
||||
OPEN-37
|
||||
SNOW-622
|
||||
SNOW-772
|
||||
STORM-102
|
||||
STORM-103
|
||||
STORM-143
|
||||
STORM-236
|
||||
STORM-255
|
||||
STORM-256
|
||||
STORM-288
|
||||
|
|
|
|||
|
|
@ -1,26 +1,39 @@
|
|||
# -*- cmake -*-
|
||||
|
||||
set(FMOD ON CACHE BOOL "Use FMOD sound library.")
|
||||
# FMOD can be set when launching the make using the argument -DFMOD:BOOL=ON
|
||||
# When building using proprietary binaries though (i.e. having access to LL private servers),
|
||||
# we always build with FMOD.
|
||||
# Open source devs should use the -DFMOD:BOOL=ON then if they want to build with FMOD, whether
|
||||
# they are using STANDALONE or not.
|
||||
if (INSTALL_PROPRIETARY)
|
||||
set(FMOD ON CACHE BOOL "Use FMOD sound library.")
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
if (FMOD)
|
||||
if (STANDALONE)
|
||||
# In that case, we use the version of the library installed on the system
|
||||
set(FMOD_FIND_REQUIRED ON)
|
||||
include(FindFMOD)
|
||||
else (STANDALONE)
|
||||
if (INSTALL_PROPRIETARY)
|
||||
include(Prebuilt)
|
||||
use_prebuilt_binary(fmod)
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
if (WINDOWS)
|
||||
set(FMOD_LIBRARY fmod)
|
||||
elseif (DARWIN)
|
||||
set(FMOD_LIBRARY fmod)
|
||||
elseif (LINUX)
|
||||
set(FMOD_LIBRARY fmod-3.75)
|
||||
endif (WINDOWS)
|
||||
|
||||
SET(FMOD_LIBRARIES ${FMOD_LIBRARY})
|
||||
set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
|
||||
if (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
|
||||
# If the path have been specified in the arguments, use that
|
||||
set(FMOD_LIBRARIES ${FMOD_LIBRARY})
|
||||
MESSAGE(STATUS "Using FMOD path: ${FMOD_LIBRARIES}, ${FMOD_INCLUDE_DIR}")
|
||||
else (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
|
||||
# If not, we're going to try to get the package listed in autobuild.xml
|
||||
# Note: if you're not using INSTALL_PROPRIETARY, the package URL should be local (file:/// URL)
|
||||
# as accessing the private LL location will fail if you don't have the credential
|
||||
include(Prebuilt)
|
||||
use_prebuilt_binary(fmod)
|
||||
if (WINDOWS)
|
||||
set(FMOD_LIBRARY fmod)
|
||||
elseif (DARWIN)
|
||||
set(FMOD_LIBRARY fmod)
|
||||
elseif (LINUX)
|
||||
set(FMOD_LIBRARY fmod-3.75)
|
||||
endif (WINDOWS)
|
||||
set(FMOD_LIBRARIES ${FMOD_LIBRARY})
|
||||
set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include)
|
||||
endif (FMOD_LIBRARY AND FMOD_INCLUDE_DIR)
|
||||
endif (STANDALONE)
|
||||
endif (FMOD)
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
|
||||
FIND_PATH(FMOD_INCLUDE_DIR fmod.h PATH_SUFFIXES fmod)
|
||||
|
||||
SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmod-3.75)
|
||||
SET(FMOD_NAMES ${FMOD_NAMES} fmod fmodvc fmodex fmod-3.75)
|
||||
FIND_LIBRARY(FMOD_LIBRARY
|
||||
NAMES ${FMOD_NAMES}
|
||||
PATH_SUFFIXES fmod
|
||||
|
|
|
|||
|
|
@ -22,9 +22,9 @@ if (PKG_CONFIG_FOUND)
|
|||
else (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
|
||||
set(_PACKAGE_ARGS libllqtwebkit)
|
||||
endif (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION)
|
||||
if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_LESS "2.8")
|
||||
if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}" VERSION_LESS "2.8.2")
|
||||
# As virtually nobody will have a pkg-config file for this, do this check always quiet.
|
||||
# Unfortunately cmake 2.8 or higher is required for pkg_check_modules to have a 'QUIET'.
|
||||
# Unfortunately cmake 2.8.2 or higher is required for pkg_check_modules to have a 'QUIET'.
|
||||
set(_PACKAGE_ARGS ${_PACKAGE_ARGS} QUIET)
|
||||
endif ()
|
||||
pkg_check_modules(LLQTWEBKIT ${_PACKAGE_ARGS})
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ else (STANDALONE)
|
|||
debug json_vc100debug_libmt.lib
|
||||
optimized json_vc100_libmt)
|
||||
elseif (DARWIN)
|
||||
set(JSONCPP_LIBRARIES libjson_linux-gcc-4.0.1_libmt.a)
|
||||
set(JSONCPP_LIBRARIES libjson_darwin_libmt.a)
|
||||
elseif (LINUX)
|
||||
set(JSONCPP_LIBRARIES libjson_linux-gcc-4.1.3_libmt.a)
|
||||
endif (WINDOWS)
|
||||
|
|
|
|||
|
|
@ -1,13 +1,14 @@
|
|||
# -*- cmake -*-
|
||||
include(Prebuilt)
|
||||
|
||||
# USE_KDU can be set when launching cmake as an option using the argument -DUSE_KDU:BOOL=ON
|
||||
# When building using proprietary binaries though (i.e. having access to LL private servers), we always build with KDU
|
||||
if (INSTALL_PROPRIETARY AND NOT STANDALONE)
|
||||
set(USE_KDU ON)
|
||||
endif (INSTALL_PROPRIETARY AND NOT STANDALONE)
|
||||
# When building using proprietary binaries though (i.e. having access to LL private servers),
|
||||
# we always build with KDU
|
||||
if (INSTALL_PROPRIETARY)
|
||||
set(USE_KDU ON CACHE BOOL "Use Kakadu library.")
|
||||
endif (INSTALL_PROPRIETARY)
|
||||
|
||||
if (USE_KDU)
|
||||
include(Prebuilt)
|
||||
use_prebuilt_binary(kdu)
|
||||
if (WINDOWS)
|
||||
set(KDU_LIBRARY kdu.lib)
|
||||
|
|
|
|||
|
|
@ -11,38 +11,21 @@ macro (use_prebuilt_binary _binary)
|
|||
if(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
|
||||
if(INSTALL_PROPRIETARY)
|
||||
include(FindSCP)
|
||||
if(DEBUG_PREBUILT)
|
||||
message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
|
||||
--install-dir=${AUTOBUILD_INSTALL_DIR}
|
||||
#--scp="${SCP_EXECUTABLE}"
|
||||
--skip-license-check
|
||||
${_binary} ")
|
||||
endif(DEBUG_PREBUILT)
|
||||
execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
|
||||
install
|
||||
--install-dir=${AUTOBUILD_INSTALL_DIR}
|
||||
#--scp="${SCP_EXECUTABLE}"
|
||||
--skip-license-check
|
||||
${_binary}
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
RESULT_VARIABLE ${_binary}_installed
|
||||
)
|
||||
else(INSTALL_PROPRIETARY)
|
||||
if(DEBUG_PREBUILT)
|
||||
message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
|
||||
--install-dir=${AUTOBUILD_INSTALL_DIR}
|
||||
--skip-license-check
|
||||
${_binary} ")
|
||||
endif(DEBUG_PREBUILT)
|
||||
execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
|
||||
install
|
||||
--install-dir=${AUTOBUILD_INSTALL_DIR}
|
||||
--skip-license-check
|
||||
${_binary}
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
RESULT_VARIABLE ${_binary}_installed
|
||||
)
|
||||
endif(INSTALL_PROPRIETARY)
|
||||
if(DEBUG_PREBUILT)
|
||||
message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install
|
||||
--install-dir=${AUTOBUILD_INSTALL_DIR}
|
||||
--skip-license-check
|
||||
${_binary} ")
|
||||
endif(DEBUG_PREBUILT)
|
||||
execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}"
|
||||
install
|
||||
--install-dir=${AUTOBUILD_INSTALL_DIR}
|
||||
--skip-license-check
|
||||
${_binary}
|
||||
WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
|
||||
RESULT_VARIABLE ${_binary}_installed
|
||||
)
|
||||
file(WRITE ${CMAKE_BINARY_DIR}/temp/${_binary}_installed "${${_binary}_installed}")
|
||||
else(${CMAKE_BINARY_DIR}/temp/sentinel_installed IS_NEWER_THAN ${CMAKE_BINARY_DIR}/temp/${_binary}_installed)
|
||||
set(${_binary}_installed 0)
|
||||
|
|
|
|||
|
|
@ -88,9 +88,16 @@ bool translate_init(std::string comma_delim_path_list,
|
|||
std::vector<std::string> paths;
|
||||
LLStringUtil::getTokens(comma_delim_path_list, paths, ","); // split over ','
|
||||
|
||||
for(std::vector<std::string>::iterator it = paths.begin(), end_it = paths.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
(*it) = gDirUtilp->findSkinnedFilename(*it, base_xml_name);
|
||||
}
|
||||
|
||||
// suck the translation xml files into memory
|
||||
LLXMLNodePtr root;
|
||||
bool success = LLXMLNode::getLayeredXMLNode(base_xml_name, root, paths);
|
||||
bool success = LLXMLNode::getLayeredXMLNode(root, paths);
|
||||
if (!success)
|
||||
{
|
||||
// couldn't load string table XML
|
||||
|
|
|
|||
|
|
@ -90,14 +90,16 @@ void LLAvatarName::fromLLSD(const LLSD& sd)
|
|||
std::string LLAvatarName::getCompleteName() const
|
||||
{
|
||||
std::string name;
|
||||
if (!mUsername.empty())
|
||||
if (mUsername.empty() || mIsDisplayNameDefault)
|
||||
// If the display name feature is off
|
||||
// OR this particular display name is defaulted (i.e. based on user name),
|
||||
// then display only the easier to read instance of the person's name.
|
||||
{
|
||||
name = mDisplayName + " (" + mUsername + ")";
|
||||
name = mDisplayName;
|
||||
}
|
||||
else
|
||||
{
|
||||
// ...display names are off, legacy name is in mDisplayName
|
||||
name = mDisplayName;
|
||||
name = mDisplayName + " (" + mUsername + ")";
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ int LLProcessLauncher::launch(void)
|
|||
char *args2 = new char[args.size() + 1];
|
||||
strcpy(args2, args.c_str());
|
||||
|
||||
if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo ) )
|
||||
if( ! CreateProcessA( NULL, args2, NULL, NULL, FALSE, 0, NULL, mWorkingDir.c_str(), &sinfo, &pinfo ) )
|
||||
{
|
||||
// TODO: do better than returning the OS-specific error code on failure...
|
||||
result = GetLastError();
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@
|
|||
#define LL_LLVERSIONVIEWER_H
|
||||
|
||||
const S32 LL_VERSION_MAJOR = 2;
|
||||
const S32 LL_VERSION_MINOR = 5;
|
||||
const S32 LL_VERSION_MINOR = 6;
|
||||
const S32 LL_VERSION_PATCH = 1;
|
||||
const S32 LL_VERSION_BUILD = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,7 @@ static const std::string PARCEL_CATEGORY_STRING[LLParcel::C_COUNT] =
|
|||
"shopping",
|
||||
"stage",
|
||||
"other",
|
||||
"rental"
|
||||
};
|
||||
static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
|
||||
{
|
||||
|
|
@ -89,6 +90,7 @@ static const std::string PARCEL_CATEGORY_UI_STRING[LLParcel::C_COUNT + 1] =
|
|||
"Shopping",
|
||||
"Stage",
|
||||
"Other",
|
||||
"Rental",
|
||||
"Any", // valid string for parcel searches
|
||||
};
|
||||
|
||||
|
|
@ -188,8 +190,6 @@ void LLParcel::init(const LLUUID &owner_id,
|
|||
mMediaID.setNull();
|
||||
mMediaAutoScale = 0;
|
||||
mMediaLoop = TRUE;
|
||||
mObscureMedia = 1;
|
||||
mObscureMusic = 1;
|
||||
mMediaWidth = 0;
|
||||
mMediaHeight = 0;
|
||||
setMediaCurrentURL(LLStringUtil::null);
|
||||
|
|
@ -685,8 +685,8 @@ void LLParcel::packMessage(LLSD& msg)
|
|||
msg["auto_scale"] = getMediaAutoScale();
|
||||
msg["media_loop"] = getMediaLoop();
|
||||
msg["media_current_url"] = getMediaCurrentURL();
|
||||
msg["obscure_media"] = getObscureMedia();
|
||||
msg["obscure_music"] = getObscureMusic();
|
||||
msg["obscure_media"] = false; // OBSOLETE - no longer used
|
||||
msg["obscure_music"] = false; // OBSOLETE - no longer used
|
||||
msg["media_id"] = getMediaID();
|
||||
msg["media_allow_navigate"] = getMediaAllowNavigate();
|
||||
msg["media_prevent_camera_zoom"] = getMediaPreventCameraZoom();
|
||||
|
|
@ -750,16 +750,13 @@ void LLParcel::unpackMessage(LLMessageSystem* msg)
|
|||
msg->getS32("MediaData", "MediaWidth", mMediaWidth);
|
||||
msg->getS32("MediaData", "MediaHeight", mMediaHeight);
|
||||
msg->getU8 ( "MediaData", "MediaLoop", mMediaLoop );
|
||||
msg->getU8 ( "MediaData", "ObscureMedia", mObscureMedia );
|
||||
msg->getU8 ( "MediaData", "ObscureMusic", mObscureMusic );
|
||||
// the ObscureMedia and ObscureMusic flags previously set here are no longer used
|
||||
}
|
||||
else
|
||||
{
|
||||
setMediaType(std::string("video/vnd.secondlife.qt.legacy"));
|
||||
setMediaDesc(std::string("No Description available without Server Upgrade"));
|
||||
mMediaLoop = true;
|
||||
mObscureMedia = true;
|
||||
mObscureMusic = true;
|
||||
}
|
||||
|
||||
if(msg->getNumberOfBlocks("MediaLinkSharing") > 0)
|
||||
|
|
@ -1225,8 +1222,6 @@ void LLParcel::clearParcel()
|
|||
setMediaDesc(LLStringUtil::null);
|
||||
setMediaAutoScale(0);
|
||||
setMediaLoop(TRUE);
|
||||
mObscureMedia = 1;
|
||||
mObscureMusic = 1;
|
||||
mMediaWidth = 0;
|
||||
mMediaHeight = 0;
|
||||
setMediaCurrentURL(LLStringUtil::null);
|
||||
|
|
|
|||
|
|
@ -165,6 +165,7 @@ public:
|
|||
C_SHOPPING,
|
||||
C_STAGE,
|
||||
C_OTHER,
|
||||
C_RENTAL,
|
||||
C_COUNT,
|
||||
C_ANY = -1 // only useful in queries
|
||||
};
|
||||
|
|
@ -238,8 +239,6 @@ public:
|
|||
void setMediaID(const LLUUID& id) { mMediaID = id; }
|
||||
void setMediaAutoScale ( U8 flagIn ) { mMediaAutoScale = flagIn; }
|
||||
void setMediaLoop (U8 loop) { mMediaLoop = loop; }
|
||||
void setObscureMedia( U8 flagIn ) { mObscureMedia = flagIn; }
|
||||
void setObscureMusic( U8 flagIn ) { mObscureMusic = flagIn; }
|
||||
void setMediaWidth(S32 width);
|
||||
void setMediaHeight(S32 height);
|
||||
void setMediaCurrentURL(const std::string& url);
|
||||
|
|
@ -346,8 +345,6 @@ public:
|
|||
U8 getMediaAutoScale() const { return mMediaAutoScale; }
|
||||
U8 getMediaLoop() const { return mMediaLoop; }
|
||||
const std::string& getMediaCurrentURL() const { return mMediaCurrentURL; }
|
||||
U8 getObscureMedia() const { return mObscureMedia; }
|
||||
U8 getObscureMusic() const { return mObscureMusic; }
|
||||
U8 getMediaURLFilterEnable() const { return mMediaURLFilterEnable; }
|
||||
LLSD getMediaURLFilterList() const { return mMediaURLFilterList; }
|
||||
U8 getMediaAllowNavigate() const { return mMediaAllowNavigate; }
|
||||
|
|
@ -636,8 +633,6 @@ protected:
|
|||
U8 mMediaAutoScale;
|
||||
U8 mMediaLoop;
|
||||
std::string mMediaCurrentURL;
|
||||
U8 mObscureMedia;
|
||||
U8 mObscureMusic;
|
||||
LLUUID mMediaID;
|
||||
U8 mMediaURLFilterEnable;
|
||||
LLSD mMediaURLFilterList;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,11 @@
|
|||
#pragma warning(disable: 4702)
|
||||
#endif
|
||||
|
||||
#if LL_WINDOWS
|
||||
// disable unreachable code warnings caused by usage of skip.
|
||||
#pragma warning(disable: 4702)
|
||||
#endif
|
||||
|
||||
namespace tut
|
||||
{
|
||||
struct m3math_test
|
||||
|
|
|
|||
|
|
@ -156,6 +156,8 @@ F32 dist_vec(const LLVector3 &a, const LLVector3 &b); // Returns distance betwe
|
|||
F32 dist_vec_squared(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b
|
||||
F32 dist_vec_squared2D(const LLVector3 &a, const LLVector3 &b);// Returns distance squared between a and b ignoring Z component
|
||||
LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b
|
||||
LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b); // Returns vector a projected on vector b (same as projected_vec)
|
||||
LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b); // Returns component of vector a not parallel to vector b (same as projected_vec)
|
||||
LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u); // Returns a vector that is a linear interpolation between a and b
|
||||
|
||||
inline LLVector3::LLVector3(void)
|
||||
|
|
@ -490,6 +492,17 @@ inline LLVector3 projected_vec(const LLVector3 &a, const LLVector3 &b)
|
|||
return project_axis * (a * project_axis);
|
||||
}
|
||||
|
||||
inline LLVector3 parallel_component(const LLVector3 &a, const LLVector3 &b)
|
||||
{
|
||||
return projected_vec(a, b);
|
||||
}
|
||||
|
||||
inline LLVector3 orthogonal_component(const LLVector3 &a, const LLVector3 &b)
|
||||
{
|
||||
return a - projected_vec(a, b);
|
||||
}
|
||||
|
||||
|
||||
inline LLVector3 lerp(const LLVector3 &a, const LLVector3 &b, F32 u)
|
||||
{
|
||||
return LLVector3(
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ include(LLVFS)
|
|||
include(LLAddBuildTest)
|
||||
include(Python)
|
||||
include(Tut)
|
||||
include(Python)
|
||||
|
||||
include_directories (${CMAKE_CURRENT_SOURCE_DIR})
|
||||
|
||||
|
|
|
|||
|
|
@ -160,6 +160,7 @@ void LLPluginProcessParent::errorState(void)
|
|||
void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_dir, const std::string &plugin_filename, bool debug)
|
||||
{
|
||||
mProcess.setExecutable(launcher_filename);
|
||||
mProcess.setWorkingDirectory(plugin_dir);
|
||||
mPluginFile = plugin_filename;
|
||||
mPluginDir = plugin_dir;
|
||||
mCPUUsage = 0.0f;
|
||||
|
|
|
|||
|
|
@ -423,24 +423,10 @@ S32 LLTextureEntry::setBumpShinyFullbright(U8 bump)
|
|||
|
||||
S32 LLTextureEntry::setMediaTexGen(U8 media)
|
||||
{
|
||||
if (mMediaFlags != media)
|
||||
{
|
||||
mMediaFlags = media;
|
||||
|
||||
// Special code for media handling
|
||||
if( hasMedia() && mMediaEntry == NULL)
|
||||
{
|
||||
mMediaEntry = new LLMediaEntry;
|
||||
}
|
||||
else if ( ! hasMedia() && mMediaEntry != NULL)
|
||||
{
|
||||
delete mMediaEntry;
|
||||
mMediaEntry = NULL;
|
||||
}
|
||||
|
||||
return TEM_CHANGE_MEDIA;
|
||||
}
|
||||
return TEM_CHANGE_NONE;
|
||||
S32 result = TEM_CHANGE_NONE;
|
||||
result |= setTexGen(media & TEM_TEX_GEN_MASK);
|
||||
result |= setMediaFlags(media & TEM_MEDIA_MASK);
|
||||
return result;
|
||||
}
|
||||
|
||||
S32 LLTextureEntry::setBumpmap(U8 bump)
|
||||
|
|
|
|||
|
|
@ -310,7 +310,18 @@ void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
|
|||
//static
|
||||
void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
|
||||
{
|
||||
sEnableVBOs = use_vbo;
|
||||
sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject ;
|
||||
if(sEnableVBOs)
|
||||
{
|
||||
//llassert_always(glBindBufferARB) ; //double check the extention for VBO is loaded.
|
||||
|
||||
llinfos << "VBO is enabled." << llendl ;
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "VBO is disabled." << llendl ;
|
||||
}
|
||||
|
||||
sDisableVBOMapping = sEnableVBOs && no_vbo_mapping ;
|
||||
LLGLNamePool::registerPool(&sDynamicVBOPool);
|
||||
LLGLNamePool::registerPool(&sDynamicIBOPool);
|
||||
|
|
|
|||
|
|
@ -316,7 +316,7 @@ void LLComboBox::setValue(const LLSD& value)
|
|||
LLScrollListItem* item = mList->getFirstSelected();
|
||||
if (item)
|
||||
{
|
||||
setLabel(getSelectedItemLabel());
|
||||
updateLabel();
|
||||
}
|
||||
mLastSelectedIndex = mList->getFirstSelectedIndex();
|
||||
}
|
||||
|
|
@ -384,6 +384,23 @@ void LLComboBox::setLabel(const LLStringExplicit& name)
|
|||
}
|
||||
}
|
||||
|
||||
void LLComboBox::updateLabel()
|
||||
{
|
||||
// Update the combo editor with the selected
|
||||
// item label.
|
||||
if (mTextEntry)
|
||||
{
|
||||
mTextEntry->setText(getSelectedItemLabel());
|
||||
mTextEntry->setTentative(FALSE);
|
||||
}
|
||||
|
||||
// If combo box doesn't allow text entry update
|
||||
// the combo button label.
|
||||
if (!mAllowTextEntry)
|
||||
{
|
||||
mButton->setLabel(getSelectedItemLabel());
|
||||
}
|
||||
}
|
||||
|
||||
BOOL LLComboBox::remove(const std::string& name)
|
||||
{
|
||||
|
|
@ -701,13 +718,13 @@ void LLComboBox::onItemSelected(const LLSD& data)
|
|||
mLastSelectedIndex = getCurrentIndex();
|
||||
if (mLastSelectedIndex != -1)
|
||||
{
|
||||
setLabel(getSelectedItemLabel());
|
||||
updateLabel();
|
||||
|
||||
if (mAllowTextEntry)
|
||||
{
|
||||
gFocusMgr.setKeyboardFocus(mTextEntry);
|
||||
mTextEntry->selectAll();
|
||||
}
|
||||
{
|
||||
gFocusMgr.setKeyboardFocus(mTextEntry);
|
||||
mTextEntry->selectAll();
|
||||
}
|
||||
}
|
||||
// hiding the list reasserts the old value stored in the text editor/dropdown button
|
||||
hideList();
|
||||
|
|
|
|||
|
|
@ -148,6 +148,9 @@ public:
|
|||
// This is probably a UI abuse.
|
||||
void setLabel(const LLStringExplicit& name);
|
||||
|
||||
// Updates the combobox label to match the selected list item.
|
||||
void updateLabel();
|
||||
|
||||
BOOL remove(const std::string& name); // remove item "name", return TRUE if found and removed
|
||||
|
||||
BOOL setCurrentByIndex( S32 index );
|
||||
|
|
|
|||
|
|
@ -160,8 +160,10 @@ bool LLDockControl::isDockVisible()
|
|||
case TOP:
|
||||
{
|
||||
// check is dock inside parent rect
|
||||
// assume that parent for all dockable flaoters
|
||||
// is the root view
|
||||
LLRect dockParentRect =
|
||||
mDockWidget->getParent()->calcScreenRect();
|
||||
mDockWidget->getRootView()->calcScreenRect();
|
||||
if (dockRect.mRight <= dockParentRect.mLeft
|
||||
|| dockRect.mLeft >= dockParentRect.mRight)
|
||||
{
|
||||
|
|
@ -297,7 +299,7 @@ void LLDockControl::moveDockable()
|
|||
break;
|
||||
}
|
||||
|
||||
S32 max_available_height = rootRect.getHeight() - mDockTongueY - mDockTongue->getHeight();
|
||||
S32 max_available_height = rootRect.getHeight() - (rootRect.mBottom - mDockTongueY) - mDockTongue->getHeight();
|
||||
|
||||
// A floater should be shrunk so it doesn't cover a part of its docking tongue and
|
||||
// there is a space between a dockable floater and a control to which it is docked.
|
||||
|
|
|
|||
|
|
@ -2590,9 +2590,13 @@ void LLFloaterView::draw()
|
|||
|
||||
LLRect LLFloaterView::getSnapRect() const
|
||||
{
|
||||
LLRect snap_rect = getRect();
|
||||
snap_rect.mBottom += mSnapOffsetBottom;
|
||||
snap_rect.mRight -= mSnapOffsetRight;
|
||||
LLRect snap_rect = getLocalRect();
|
||||
|
||||
LLView* snap_view = mSnapView.get();
|
||||
if (snap_view)
|
||||
{
|
||||
snap_view->localRectToOtherView(snap_view->getLocalRect(), &snap_rect, this);
|
||||
}
|
||||
|
||||
return snap_rect;
|
||||
}
|
||||
|
|
@ -2865,7 +2869,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
|
|||
// close callback
|
||||
if (p.close_callback.isProvided())
|
||||
{
|
||||
mCloseSignal.connect(initCommitCallback(p.close_callback));
|
||||
setCloseCallback(initCommitCallback(p.close_callback));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2875,6 +2879,11 @@ boost::signals2::connection LLFloater::setMinimizeCallback( const commit_signal_
|
|||
return mMinimizeSignal->connect(cb);
|
||||
}
|
||||
|
||||
boost::signals2::connection LLFloater::setCloseCallback( const commit_signal_t::slot_type& cb )
|
||||
{
|
||||
return mCloseSignal.connect(cb);
|
||||
}
|
||||
|
||||
LLFastTimer::DeclareTimer POST_BUILD("Floater Post Build");
|
||||
|
||||
bool LLFloater::initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node)
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@ public:
|
|||
bool buildFromFile(const std::string &filename, LLXMLNodePtr output_node = NULL);
|
||||
|
||||
boost::signals2::connection setMinimizeCallback( const commit_signal_t::slot_type& cb );
|
||||
boost::signals2::connection setCloseCallback( const commit_signal_t::slot_type& cb );
|
||||
|
||||
void initFromParams(const LLFloater::Params& p);
|
||||
bool initFloaterXML(LLXMLNodePtr node, LLView *parent, const std::string& filename, LLXMLNodePtr output_node = NULL);
|
||||
|
|
@ -495,10 +496,10 @@ public:
|
|||
// value is not defined.
|
||||
S32 getZOrder(LLFloater* child);
|
||||
|
||||
void setSnapOffsetBottom(S32 offset) { mSnapOffsetBottom = offset; }
|
||||
void setSnapOffsetRight(S32 offset) { mSnapOffsetRight = offset; }
|
||||
void setFloaterSnapView(LLHandle<LLView> snap_view) {mSnapView = snap_view; }
|
||||
|
||||
private:
|
||||
LLHandle<LLView> mSnapView;
|
||||
BOOL mFocusCycleMode;
|
||||
S32 mSnapOffsetBottom;
|
||||
S32 mSnapOffsetRight;
|
||||
|
|
|
|||
|
|
@ -563,7 +563,7 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
|
|||
}
|
||||
|
||||
// update resize bars with new limits
|
||||
LLResizeBar* last_resize_bar = NULL;
|
||||
LLLayoutPanel* last_resizeable_panel = NULL;
|
||||
for (panel_it = mPanels.begin(); panel_it != mPanels.end(); ++panel_it)
|
||||
{
|
||||
LLPanel* panelp = (*panel_it);
|
||||
|
|
@ -585,17 +585,17 @@ void LLLayoutStack::updateLayout(BOOL force_resize)
|
|||
BOOL resize_bar_enabled = panelp->getVisible() && (*panel_it)->mUserResize;
|
||||
(*panel_it)->mResizeBar->setVisible(resize_bar_enabled);
|
||||
|
||||
if (resize_bar_enabled)
|
||||
if ((*panel_it)->mUserResize || (*panel_it)->mAutoResize)
|
||||
{
|
||||
last_resize_bar = (*panel_it)->mResizeBar;
|
||||
last_resizeable_panel = (*panel_it);
|
||||
}
|
||||
}
|
||||
|
||||
// hide last resize bar as there is nothing past it
|
||||
// resize bars need to be in between two resizable panels
|
||||
if (last_resize_bar)
|
||||
if (last_resizeable_panel)
|
||||
{
|
||||
last_resize_bar->setVisible(FALSE);
|
||||
last_resizeable_panel->mResizeBar->setVisible(FALSE);
|
||||
}
|
||||
|
||||
// not enough room to fit existing contents
|
||||
|
|
|
|||
|
|
@ -1195,16 +1195,18 @@ bool LLNotifications::uniqueFilter(LLNotificationPtr pNotif)
|
|||
|
||||
bool LLNotifications::uniqueHandler(const LLSD& payload)
|
||||
{
|
||||
std::string cmd = payload["sigtype"];
|
||||
|
||||
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
|
||||
if (pNotif && pNotif->hasUniquenessConstraints())
|
||||
{
|
||||
if (payload["sigtype"].asString() == "add")
|
||||
if (cmd == "add")
|
||||
{
|
||||
// not a duplicate according to uniqueness criteria, so we keep it
|
||||
// and store it for future uniqueness checks
|
||||
mUniqueNotifications.insert(std::make_pair(pNotif->getName(), pNotif));
|
||||
}
|
||||
else if (payload["sigtype"].asString() == "delete")
|
||||
else if (cmd == "delete")
|
||||
{
|
||||
mUniqueNotifications.erase(pNotif->getName());
|
||||
}
|
||||
|
|
@ -1217,12 +1219,16 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
|
|||
{
|
||||
LLNotificationPtr pNotif = LLNotifications::instance().find(payload["id"].asUUID());
|
||||
|
||||
if (!pNotif || !pNotif->hasUniquenessConstraints())
|
||||
std::string cmd = payload["sigtype"];
|
||||
|
||||
if (!pNotif || cmd != "add")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// checks against existing unique notifications
|
||||
// Update the existing unique notification with the data from this particular instance...
|
||||
// This guarantees that duplicate notifications will be collapsed to the one
|
||||
// most recently triggered
|
||||
for (LLNotificationMap::iterator existing_it = mUniqueNotifications.find(pNotif->getName());
|
||||
existing_it != mUniqueNotifications.end();
|
||||
++existing_it)
|
||||
|
|
@ -1235,7 +1241,7 @@ bool LLNotifications::failedUniquenessTest(const LLSD& payload)
|
|||
// of this unique notification and update it
|
||||
existing_notification->updateFrom(pNotif);
|
||||
// then delete the new one
|
||||
pNotif->cancel();
|
||||
cancel(pNotif);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1300,26 +1306,14 @@ void LLNotifications::createDefaultChannels()
|
|||
// usage LLStopWhenHandled combiner in LLStandardSignal
|
||||
LLNotifications::instance().getChannel("Unique")->
|
||||
connectAtFrontChanged(boost::bind(&LLNotifications::uniqueHandler, this, _1));
|
||||
// failedUniquenessTest slot isn't necessary
|
||||
// LLNotifications::instance().getChannel("Unique")->
|
||||
// connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
|
||||
LLNotifications::instance().getChannel("Unique")->
|
||||
connectFailedFilter(boost::bind(&LLNotifications::failedUniquenessTest, this, _1));
|
||||
LLNotifications::instance().getChannel("Ignore")->
|
||||
connectFailedFilter(&handleIgnoredNotification);
|
||||
LLNotifications::instance().getChannel("VisibilityRules")->
|
||||
connectFailedFilter(&visibilityRuleMached);
|
||||
}
|
||||
|
||||
bool LLNotifications::addTemplate(const std::string &name,
|
||||
LLNotificationTemplatePtr theTemplate)
|
||||
{
|
||||
if (mTemplates.count(name))
|
||||
{
|
||||
llwarns << "LLNotifications -- attempted to add template '" << name << "' twice." << llendl;
|
||||
return false;
|
||||
}
|
||||
mTemplates[name] = theTemplate;
|
||||
return true;
|
||||
}
|
||||
|
||||
LLNotificationTemplatePtr LLNotifications::getTemplate(const std::string& name)
|
||||
{
|
||||
|
|
@ -1416,27 +1410,45 @@ void replaceFormText(LLNotificationForm::Params& form, const std::string& patter
|
|||
}
|
||||
}
|
||||
|
||||
void addPathIfExists(const std::string& new_path, std::vector<std::string>& paths)
|
||||
{
|
||||
if (gDirUtilp->fileExists(new_path))
|
||||
{
|
||||
paths.push_back(new_path);
|
||||
}
|
||||
}
|
||||
|
||||
bool LLNotifications::loadTemplates()
|
||||
{
|
||||
const std::string xml_filename = "notifications.xml";
|
||||
std::string full_filename = gDirUtilp->findSkinnedFilename(LLUI::getXUIPaths().front(), xml_filename);
|
||||
std::vector<std::string> search_paths;
|
||||
|
||||
std::string skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
|
||||
std::string localized_skin_relative_path = gDirUtilp->getDirDelimiter() + LLUI::getLocalizedSkinPath() + gDirUtilp->getDirDelimiter() + "notifications.xml";
|
||||
|
||||
addPathIfExists(gDirUtilp->getDefaultSkinDir() + skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getDefaultSkinDir() + localized_skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getSkinDir() + skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getSkinDir() + localized_skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getUserSkinDir() + skin_relative_path, search_paths);
|
||||
addPathIfExists(gDirUtilp->getUserSkinDir() + localized_skin_relative_path, search_paths);
|
||||
|
||||
std::string base_filename = search_paths.front();
|
||||
LLXMLNodePtr root;
|
||||
BOOL success = LLUICtrlFactory::getLayeredXMLNode(xml_filename, root);
|
||||
BOOL success = LLXMLNode::getLayeredXMLNode(root, search_paths);
|
||||
|
||||
if (!success || root.isNull() || !root->hasName( "notifications" ))
|
||||
{
|
||||
llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
|
||||
llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLNotificationTemplate::Notifications params;
|
||||
LLXUIParser parser;
|
||||
parser.readXUI(root, params, full_filename);
|
||||
parser.readXUI(root, params, base_filename);
|
||||
|
||||
if(!params.validateBlock())
|
||||
{
|
||||
llerrs << "Problem reading UI Notifications file: " << full_filename << llendl;
|
||||
llerrs << "Problem reading UI Notifications file: " << base_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -1483,7 +1495,7 @@ bool LLNotifications::loadTemplates()
|
|||
replaceFormText(it->form_ref.form, "$ignoretext", it->form_ref.form_template.ignore_text);
|
||||
}
|
||||
}
|
||||
addTemplate(it->name, LLNotificationTemplatePtr(new LLNotificationTemplate(*it)));
|
||||
mTemplates[it->name] = LLNotificationTemplatePtr(new LLNotificationTemplate(*it));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
@ -1578,7 +1590,7 @@ void LLNotifications::add(const LLNotificationPtr pNotif)
|
|||
|
||||
void LLNotifications::cancel(LLNotificationPtr pNotif)
|
||||
{
|
||||
if (pNotif == NULL) return;
|
||||
if (pNotif == NULL || pNotif->isCancelled()) return;
|
||||
|
||||
LLNotificationSet::iterator it=mItems.find(pNotif);
|
||||
if (it == mItems.end())
|
||||
|
|
@ -1680,7 +1692,6 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
|
||||
{
|
||||
// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
|
||||
|
||||
lldebugs
|
||||
<< "notification \"" << n->getName() << "\" "
|
||||
<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
|
||||
|
|
@ -1728,7 +1739,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
// Response property is empty. Cancel this notification.
|
||||
lldebugs << "cancelling notification " << n->getName() << llendl;
|
||||
|
||||
n->cancel();
|
||||
cancel(n);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -863,10 +863,11 @@ class LLNotifications :
|
|||
|
||||
friend class LLSingleton<LLNotifications>;
|
||||
public:
|
||||
// load notification descriptions from file;
|
||||
// OK to call more than once because it will reload
|
||||
bool loadTemplates();
|
||||
|
||||
// load all notification descriptions from file
|
||||
// calling more than once will overwrite existing templates
|
||||
// but never delete a template
|
||||
bool loadTemplates();
|
||||
|
||||
// load visibility rules from file;
|
||||
// OK to call more than once because it will reload
|
||||
bool loadVisibilityRules();
|
||||
|
|
@ -950,8 +951,6 @@ private:
|
|||
LLNotificationChannelPtr pHistoryChannel;
|
||||
LLNotificationChannelPtr pExpirationChannel;
|
||||
|
||||
// put your template in
|
||||
bool addTemplate(const std::string& name, LLNotificationTemplatePtr theTemplate);
|
||||
TemplateMap mTemplates;
|
||||
|
||||
VisibilityRuleList mVisibilityRules;
|
||||
|
|
|
|||
|
|
@ -346,7 +346,7 @@ void LLRadioGroup::setValue( const LLSD& value )
|
|||
}
|
||||
else
|
||||
{
|
||||
llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
|
||||
setSelectedIndex(-1, TRUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -152,7 +152,27 @@ static LLFastTimer::DeclareTimer FTM_XML_PARSE("XML Reading/Parsing");
|
|||
bool LLUICtrlFactory::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root)
|
||||
{
|
||||
LLFastTimer timer(FTM_XML_PARSE);
|
||||
return LLXMLNode::getLayeredXMLNode(xui_filename, root, LLUI::getXUIPaths());
|
||||
|
||||
std::vector<std::string> paths;
|
||||
std::string path = gDirUtilp->findSkinnedFilename(LLUI::getSkinPath(), xui_filename);
|
||||
if (!path.empty())
|
||||
{
|
||||
paths.push_back(path);
|
||||
}
|
||||
|
||||
std::string localize_path = gDirUtilp->findSkinnedFilename(LLUI::getLocalizedSkinPath(), xui_filename);
|
||||
if (!localize_path.empty() && localize_path != path)
|
||||
{
|
||||
paths.push_back(localize_path);
|
||||
}
|
||||
|
||||
if (paths.empty())
|
||||
{
|
||||
// sometimes whole path is passed in as filename
|
||||
paths.push_back(xui_filename);
|
||||
}
|
||||
|
||||
return LLXMLNode::getLayeredXMLNode(root, paths);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -214,7 +234,7 @@ LLView *LLUICtrlFactory::createFromXML(LLXMLNodePtr node, LLView* parent, const
|
|||
|
||||
std::string LLUICtrlFactory::getCurFileName()
|
||||
{
|
||||
return mFileNames.empty() ? "" : gDirUtilp->getWorkingDir() + gDirUtilp->getDirDelimiter() + mFileNames.back();
|
||||
return mFileNames.empty() ? "" : mFileNames.back();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -338,7 +338,7 @@ void LLView::removeChild(LLView* child)
|
|||
}
|
||||
else
|
||||
{
|
||||
llerrs << "LLView::removeChild called with non-child" << llendl;
|
||||
llwarns << child->getName() << "is not a child of " << getName() << llendl;
|
||||
}
|
||||
updateBoundingRect();
|
||||
}
|
||||
|
|
@ -1958,7 +1958,7 @@ void LLView::centerWithin(const LLRect& bounds)
|
|||
translate( left - getRect().mLeft, bottom - getRect().mBottom );
|
||||
}
|
||||
|
||||
BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const
|
||||
BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const
|
||||
{
|
||||
const LLView* cur_view = this;
|
||||
const LLView* root_view = NULL;
|
||||
|
|
@ -2001,7 +2001,7 @@ BOOL LLView::localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LL
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const
|
||||
BOOL LLView::localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const
|
||||
{
|
||||
LLRect cur_rect = local;
|
||||
const LLView* cur_view = this;
|
||||
|
|
|
|||
|
|
@ -406,8 +406,8 @@ public:
|
|||
BOOL blockMouseEvent(S32 x, S32 y) const;
|
||||
|
||||
// See LLMouseHandler virtuals for screenPointToLocal and localPointToScreen
|
||||
BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, LLView* other_view) const;
|
||||
BOOL localRectToOtherView( const LLRect& local, LLRect* other, LLView* other_view ) const;
|
||||
BOOL localPointToOtherView( S32 x, S32 y, S32 *other_x, S32 *other_y, const LLView* other_view) const;
|
||||
BOOL localRectToOtherView( const LLRect& local, LLRect* other, const LLView* other_view ) const;
|
||||
void screenRectToLocal( const LLRect& screen, LLRect* local ) const;
|
||||
void localRectToScreen( const LLRect& local, LLRect* screen ) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -149,7 +149,11 @@ const std::string LLDir::findFile(const std::string& filename, const std::vector
|
|||
{
|
||||
if (!search_path_iter->empty())
|
||||
{
|
||||
std::string filename_and_path = (*search_path_iter) + getDirDelimiter() + filename;
|
||||
std::string filename_and_path = (*search_path_iter);
|
||||
if (!filename.empty())
|
||||
{
|
||||
filename_and_path += getDirDelimiter() + filename;
|
||||
}
|
||||
if (fileExists(filename_and_path))
|
||||
{
|
||||
return filename_and_path;
|
||||
|
|
|
|||
|
|
@ -835,7 +835,7 @@ U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only
|
|||
return num_saved;
|
||||
}
|
||||
|
||||
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values)
|
||||
U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_values, bool save_values)
|
||||
{
|
||||
std::string name;
|
||||
LLSD settings;
|
||||
|
|
@ -908,8 +908,7 @@ U32 LLControlGroup::loadFromFile(const std::string& filename, bool set_default_v
|
|||
}
|
||||
else if(existing_control->isPersisted())
|
||||
{
|
||||
|
||||
existing_control->setValue(control_map["Value"]);
|
||||
existing_control->setValue(control_map["Value"], save_values);
|
||||
}
|
||||
// *NOTE: If not persisted and not setting defaults,
|
||||
// the value should not get loaded.
|
||||
|
|
|
|||
|
|
@ -289,7 +289,7 @@ public:
|
|||
// as the given type.
|
||||
U32 loadFromFileLegacy(const std::string& filename, BOOL require_declaration = TRUE, eControlType declare_as = TYPE_STRING);
|
||||
U32 saveToFile(const std::string& filename, BOOL nondefault_only);
|
||||
U32 loadFromFile(const std::string& filename, bool default_values = false);
|
||||
U32 loadFromFile(const std::string& filename, bool default_values = false, bool save_values = true);
|
||||
void resetToDefaults();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -859,23 +859,21 @@ BOOL LLXMLNode::isFullyDefault()
|
|||
}
|
||||
|
||||
// static
|
||||
bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
|
||||
bool LLXMLNode::getLayeredXMLNode(LLXMLNodePtr& root,
|
||||
const std::vector<std::string>& paths)
|
||||
{
|
||||
std::string full_filename = gDirUtilp->findSkinnedFilename(paths.front(), xui_filename);
|
||||
if (full_filename.empty())
|
||||
if (paths.empty()) return false;
|
||||
|
||||
std::string filename = paths.front();
|
||||
if (filename.empty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!LLXMLNode::parseFile(full_filename, root, NULL))
|
||||
|
||||
if (!LLXMLNode::parseFile(filename, root, NULL))
|
||||
{
|
||||
// try filename as passed in since sometimes we load an xml file from a user-supplied path
|
||||
if (!LLXMLNode::parseFile(xui_filename, root, NULL))
|
||||
{
|
||||
llwarns << "Problem reading UI description file: " << xui_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
llwarns << "Problem reading UI description file: " << filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
LLXMLNodePtr updateRoot;
|
||||
|
|
@ -887,7 +885,7 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
|
|||
std::string nodeName;
|
||||
std::string updateName;
|
||||
|
||||
std::string layer_filename = gDirUtilp->findSkinnedFilename((*itor), xui_filename);
|
||||
std::string layer_filename = *itor;
|
||||
if(layer_filename.empty())
|
||||
{
|
||||
// no localized version of this file, that's ok, keep looking
|
||||
|
|
@ -896,7 +894,7 @@ bool LLXMLNode::getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr&
|
|||
|
||||
if (!LLXMLNode::parseFile(layer_filename, updateRoot, NULL))
|
||||
{
|
||||
llwarns << "Problem reading localized UI description file: " << (*itor) + gDirUtilp->getDirDelimiter() + xui_filename << llendl;
|
||||
llwarns << "Problem reading localized UI description file: " << layer_filename << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -149,8 +149,7 @@ public:
|
|||
LLXMLNodePtr& update_node);
|
||||
static LLXMLNodePtr replaceNode(LLXMLNodePtr node, LLXMLNodePtr replacement_node);
|
||||
|
||||
static bool getLayeredXMLNode(const std::string &xui_filename, LLXMLNodePtr& root,
|
||||
const std::vector<std::string>& paths);
|
||||
static bool getLayeredXMLNode(LLXMLNodePtr& root, const std::vector<std::string>& paths);
|
||||
|
||||
|
||||
// Write standard XML file header:
|
||||
|
|
|
|||
|
|
@ -255,3 +255,8 @@ std::string LLTrans::getCountString(const std::string& language, const std::stri
|
|||
std::string key = llformat("%s%s", xml_desc.c_str(), form);
|
||||
return getString(key, args);
|
||||
}
|
||||
|
||||
void LLTrans::setDefaultArg(const std::string& name, const std::string& value)
|
||||
{
|
||||
sDefaultArgs[name] = value;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -110,6 +110,8 @@ public:
|
|||
return sDefaultArgs;
|
||||
}
|
||||
|
||||
static void setDefaultArg(const std::string& name, const std::string& value);
|
||||
|
||||
// insert default args into an arg list
|
||||
static void getArgs(LLStringUtil::format_map_t& args)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ project(mac_updater)
|
|||
include(00-Common)
|
||||
include(OpenSSL)
|
||||
include(CURL)
|
||||
include(CARes)
|
||||
include(LLCommon)
|
||||
include(LLVFS)
|
||||
include(Linking)
|
||||
|
|
@ -12,6 +13,8 @@ include(Linking)
|
|||
include_directories(
|
||||
${LLCOMMON_INCLUDE_DIRS}
|
||||
${LLVFS_INCLUDE_DIRS}
|
||||
${CURL_INCLUDE_DIRS}
|
||||
${CARES_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
set(mac_updater_SOURCE_FILES
|
||||
|
|
@ -53,6 +56,7 @@ target_link_libraries(mac-updater
|
|||
${OPENSSL_LIBRARIES}
|
||||
${CRYPTO_LIBRARIES}
|
||||
${CURL_LIBRARIES}
|
||||
${CARES_LIBRARIES}
|
||||
${LLCOMMON_LIBRARIES}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -3,6 +3,12 @@
|
|||
project(winmm_shim)
|
||||
|
||||
### winmm_shim
|
||||
# *HACK - override msvcrt implementation (intialized on 00-Common) to be
|
||||
# statically linked for winmm.dll this relies on vc taking the last flag on
|
||||
# the command line
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
|
||||
|
||||
set(winmm_shim_SOURCE_FILES
|
||||
forwarding_api.cpp
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ include_directories(
|
|||
${LLAUDIO_INCLUDE_DIRS}
|
||||
${LLCHARACTER_INCLUDE_DIRS}
|
||||
${LLCOMMON_INCLUDE_DIRS}
|
||||
${FMOD_INCLUDE_DIR}
|
||||
${LLIMAGE_INCLUDE_DIRS}
|
||||
${LLKDU_INCLUDE_DIRS}
|
||||
${LLINVENTORY_INCLUDE_DIRS}
|
||||
|
|
@ -246,6 +247,7 @@ set(viewer_SOURCE_FILES
|
|||
llhudeffectlookat.cpp
|
||||
llhudeffectpointat.cpp
|
||||
llhudeffecttrail.cpp
|
||||
llhudeffectblob.cpp
|
||||
llhudicon.cpp
|
||||
llhudmanager.cpp
|
||||
llhudnametag.cpp
|
||||
|
|
@ -786,6 +788,7 @@ set(viewer_HEADER_FILES
|
|||
llhudeffectlookat.h
|
||||
llhudeffectpointat.h
|
||||
llhudeffecttrail.h
|
||||
llhudeffectblob.h
|
||||
llhudicon.h
|
||||
llhudmanager.h
|
||||
llhudnametag.h
|
||||
|
|
@ -1296,22 +1299,20 @@ endif (WINDOWS)
|
|||
set(viewer_XUI_FILES
|
||||
skins/default/colors.xml
|
||||
skins/default/textures/textures.xml
|
||||
skins/minimal/colors.xml
|
||||
skins/minimal/textures/textures.xml
|
||||
|
||||
|
||||
|
||||
)
|
||||
file(GLOB DEFAULT_XUI_FILE_GLOB_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/*.xml)
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/*.xml)
|
||||
list(APPEND viewer_XUI_FILES ${DEFAULT_XUI_FILE_GLOB_LIST})
|
||||
|
||||
file(GLOB DEFAULT_WIDGET_FILE_GLOB_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/default/xui/en/widgets/*.xml)
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/*/xui/en/widgets/*.xml)
|
||||
list(APPEND viewer_XUI_FILES ${DEFAULT_WIDGET_FILE_GLOB_LIST})
|
||||
|
||||
file(GLOB SILVER_XUI_FILE_GLOB_LIST
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/*.xml)
|
||||
list(APPEND viewer_XUI_FILES ${SILVER_XUI_FILE_GLOB_LIST})
|
||||
|
||||
# Cannot append empty lists in CMake, wait until we have files here.
|
||||
#file(GLOB SILVER_WIDGET_FILE_GLOB_LIST
|
||||
# ${CMAKE_CURRENT_SOURCE_DIR}/skins/silver/xui/en-us/widgets/*.xml)
|
||||
|
|
@ -1341,6 +1342,7 @@ set(viewer_APPSETTINGS_FILES
|
|||
app_settings/settings_crash_behavior.xml
|
||||
app_settings/settings_files.xml
|
||||
app_settings/settings_per_account.xml
|
||||
app_settings/settings_minimal.xml
|
||||
app_settings/std_bump.ini
|
||||
app_settings/trees.xml
|
||||
app_settings/ultra_graphics.xml
|
||||
|
|
|
|||
|
|
@ -3895,3 +3895,22 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
|
|||
e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
|
||||
glmQ1A==
|
||||
-----END CERTIFICATE-----
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
|
||||
UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
|
||||
dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
|
||||
MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
|
||||
dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
|
||||
AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
|
||||
BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
|
||||
cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
|
||||
AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
|
||||
MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
|
||||
aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
|
||||
ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
|
||||
IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
|
||||
MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
|
||||
A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
|
||||
7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
|
||||
1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
|
||||
-----END CERTIFICATE-----
|
||||
|
|
|
|||
|
|
@ -261,6 +261,24 @@
|
|||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
<key>sessionsettings</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
<string>Specify the filename of a configuration file that contains temporary per-session configuration overrides.</string>
|
||||
<key>count</key>
|
||||
<integer>1</integer>
|
||||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
<key>usersessionsettings</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
<string>Specify the filename of a configuration file that contains temporary per-session configuration user overrides.</string>
|
||||
<key>count</key>
|
||||
<integer>1</integer>
|
||||
<!-- Special case. Mapped to settings procedurally. -->
|
||||
</map>
|
||||
|
||||
<key>login</key>
|
||||
<map>
|
||||
<key>desc</key>
|
||||
|
|
|
|||
|
|
@ -617,7 +617,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://interest.secondlife.com/viewer/avatar</string>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>AvatarBakedTextureUploadTimeout</key>
|
||||
<map>
|
||||
|
|
@ -2566,7 +2566,7 @@
|
|||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://www.secondlife.com</string>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>DisableCameraConstraints</key>
|
||||
<map>
|
||||
|
|
@ -2810,6 +2810,17 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DoubleClickShowWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable double-click to show world map from mini map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>DragAndDropToolTipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -3888,6 +3899,17 @@
|
|||
<key>Value</key>
|
||||
<string>https://my.secondlife.com/[AGENT_NAME]</string>
|
||||
</map>
|
||||
<key>WebProfileNonProductionURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL for Web Profiles on Non-Production grids</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>https://my-demo.secondlife.com/[AGENT_NAME]</string>
|
||||
</map>
|
||||
<key>HighResSnapshot</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -11484,7 +11506,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<integer>3.0</integer>
|
||||
<integer>3</integer>
|
||||
</map>
|
||||
<key>InterpolationPhaseOut</key>
|
||||
<map>
|
||||
|
|
@ -11495,7 +11517,7 @@
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<integer>1.0</integer>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>VerboseLogs</key>
|
||||
<map>
|
||||
|
|
@ -12344,17 +12366,6 @@
|
|||
<key>Value</key>
|
||||
<real>1200.0</real>
|
||||
</map>
|
||||
<key>AvatarPickerHintTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Number of seconds to wait before telling resident about avatar picker.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>600.0</real>
|
||||
</map>
|
||||
<key>SidePanelHintTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -12377,5 +12388,203 @@
|
|||
<key>Value</key>
|
||||
<string>name</string>
|
||||
</map>
|
||||
<key>SessionSettingsFile</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Settings that are a applied per session (not saved).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>UserSessionSettingsFile</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>User settings that are a applied per session (not saved).</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string />
|
||||
</map>
|
||||
<key>OpenSidePanelsInFloaters</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If true, will always open side panel contents in a floater.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>AvatarInspectorTooltipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Seconds before displaying avatar inspector tooltip</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.35</real>
|
||||
</map>
|
||||
<key>ObjectInspectorTooltipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Seconds before displaying object inspector tooltip</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.35</real>
|
||||
</map>
|
||||
<key>SLURLTeleportDirectly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableClassifieds</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable creation of new classified ads from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableGroupInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable viewing and editing of group info from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnablePicks</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable editing of picks from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable opening world map from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableAvatarPay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable paying other avatars from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableVoiceCall</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable voice calls from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableAvatarShare</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable sharing from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>SearchFromAddressBar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Can enter search queries into navigation address bar</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>LogInventoryDecline</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Log in system chat whenever an inventory offer is declined</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>UseHTTPInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow use of http inventory transfers instead of UDP</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ClickToWalk</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Click in world to walk to location</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowOfferedInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
|
|||
|
|
@ -1,148 +1,64 @@
|
|||
<llsd>
|
||||
<map>
|
||||
<key>Locations</key>
|
||||
<map>
|
||||
<!--
|
||||
The Locations LLSD block specifies the usage pattern of
|
||||
the settings file types
|
||||
Each location is represented by a LLSD containing the following values:
|
||||
PathIndex = hard coded path indicies.
|
||||
Files = map of files to load
|
||||
Each file can have:
|
||||
Requirement = level of necessity for loading.
|
||||
0 ( or Req. no key) = do not load
|
||||
1 = required, fail if not found
|
||||
NameFromSetting = Use the given setting to specify the name. Not valid for
|
||||
"Default"
|
||||
-->
|
||||
<key>Comment</key>
|
||||
<string>List location from which to load files, and the rules about loading those files.</string>
|
||||
<key>Persist</key>
|
||||
<integer>0</integer>
|
||||
<key>Type</key>
|
||||
<string>LLSD</string>
|
||||
<key>Value</key>
|
||||
<map>
|
||||
<key>Default</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>2</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Global</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>PerAccount</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_per_account.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>CrashSettings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_crash_behavior.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>Warnings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>ignorable_dialogs.xml</string>
|
||||
<key>Requirement</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>User</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>1</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Global</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>ClientSettingsFile</string>
|
||||
</map>
|
||||
<key>CrashSettings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_crash_behavior.xml</string>
|
||||
</map>
|
||||
<key>Warnings</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>ignorable_dialogs.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>WarningSettingsFile</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>Account</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>3</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>PerAccount</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>settings_per_account.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>PerAccountSettingsFile</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>DefaultSkin</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>17</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Skinning</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>colors.xml</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>CurrentSkin</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>10</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Skinning</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>colors.xml</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
<key>UserSkin</key>
|
||||
<map>
|
||||
<key>PathIndex</key>
|
||||
<integer>14</integer>
|
||||
<key>Files</key>
|
||||
<map>
|
||||
<key>Skinning</key>
|
||||
<map>
|
||||
<key>Name</key>
|
||||
<string>colors.xml</string>
|
||||
<key>NameFromSetting</key>
|
||||
<string>SkinningSettingsFile</string>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
<settings_files>
|
||||
<group name="Default"
|
||||
path_index="2">
|
||||
<file name="Global"
|
||||
file_name="settings.xml"
|
||||
required="true"/>
|
||||
<file name="PerAccount"
|
||||
file_name="settings_per_account.xml"
|
||||
required="true"/>
|
||||
<file name="CrashSettings"
|
||||
file_name="settings_crash_behavior.xml"
|
||||
required="true"/>
|
||||
<file name="Warnings"
|
||||
file_name="ignorable_dialogs.xml"
|
||||
required="true"/>
|
||||
</group>
|
||||
<group name="User"
|
||||
path_index="1">
|
||||
<file name="Global"
|
||||
file_name="settings.xml"
|
||||
file_name_setting="ClientSettingsFile"/>
|
||||
<file name="CrashSettings"
|
||||
file_name="settings_crash_behavior"/>
|
||||
<file name="Warnings"
|
||||
file_name="ignorable_dialogs.xml"
|
||||
file_name_setting="WarningSettingsFile"/>
|
||||
</group>
|
||||
<group name="Account"
|
||||
path_index="3">
|
||||
<file name="PerAccount"
|
||||
file_name="settings_per_account.xml"
|
||||
file_name_setting="PerAccountSettingsFile"/>
|
||||
</group>
|
||||
<group name="Session"
|
||||
path_index="2">
|
||||
<file name="Global"
|
||||
file_name="session.xml"
|
||||
file_name_setting="SessionSettingsFile"
|
||||
persistent="false"/>
|
||||
</group>
|
||||
<group name="UserSession"
|
||||
path_index="1">
|
||||
<file name="Global"
|
||||
file_name="session.xml"
|
||||
file_name_setting="UserSessionSettingsFile"
|
||||
persistent="false"/>
|
||||
</group>
|
||||
<group name="DefaultSkin"
|
||||
path_index="17">
|
||||
<file name="Skinning"
|
||||
file_name="colors.xml"/>
|
||||
</group>
|
||||
<group name="CurrentSkin"
|
||||
path_index="10">
|
||||
<file name="Skinning"
|
||||
file_name="colors.xml"/>
|
||||
</group>
|
||||
<group name="UserSkin"
|
||||
path_index="14">
|
||||
<file name="Skinning"
|
||||
file_name="colors.xml"
|
||||
file_name_setting="SkinningSettingsFile"/>
|
||||
</group>
|
||||
</settings_files>
|
||||
|
|
@ -0,0 +1,406 @@
|
|||
<llsd>
|
||||
<map>
|
||||
<key>ChannelBottomPanelMargin</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Space from a lower toast to the Bottom Tray</string>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>2</integer>
|
||||
</map>
|
||||
<key>ClickActionBuyEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable click to buy actions in tool pie menu</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ClickActionPayEnabled</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable click to pay actions in tool pie menu</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableGrab</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use Ctrl+mouse to grab and manipulate objects</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableMouselook</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow first person perspective and mouse control of camera</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableVoiceChat</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable talking to other residents with a microphone</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>HelpURLFormat</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>URL pattern for help page; arguments will be encoded; see llviewerhelp.cpp:buildHelpURL for arguments</string>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/howto/index.html?topic=[TOPIC]</string>
|
||||
</map>
|
||||
<key>PreferredMaturity</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>21</integer>
|
||||
</map>
|
||||
<key>RenderTrackerBeacon</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Display tracking arrow and beacon to target avatar, teleport destination</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowScriptErrors</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show script errors</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ShowScriptErrorsLocation</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show script error in chat or window</string>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>SkinCurrent</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>The currently selected skin.</string>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>minimal</string>
|
||||
</map>
|
||||
<key>UseExternalBrowser</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Use default browser when opening web pages instead of in-world browser.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceCallsRejectAll</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Silently reject all incoming voice calls.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>VoiceDisableMic</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Completely disable the ability to open the mic.</string>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ScriptsCanShowUI</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow LSL calls (such as LLMapDestination) to spawn viewer UI</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ChatFontSize</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Size of chat text in chat console (0 = small, 1 = big, 2 = extra large)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AvatarPickerHintTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Number of seconds to wait before telling resident about avatar picker.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.0</real>
|
||||
</map>
|
||||
<key>RenderShowGroupTitleAll</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show group titles in name labels</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>OpenSidePanelsInFloaters</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>If true, will always open side panel contents in a floater.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>AvatarInspectorTooltipDelay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Seconds before displaying avatar inspector tooltip</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.1</real>
|
||||
</map>
|
||||
<key>AFKTimeout</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>
|
||||
Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
|
||||
Valid values are: 0, 120, 300, 600, 1800
|
||||
</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>S32</string>
|
||||
<key>Value</key>
|
||||
<real>0</real>
|
||||
</map>
|
||||
<key>SLURLTeleportDirectly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Clicking on a slurl will teleport you directly instead of opening places panel</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>EnableClassifieds</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable creation of new classified ads</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableGroupInfo</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable viewing and editing of group info.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnablePicks</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable editing of picks</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable opening world map from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableAvatarPay</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable paying other avatars from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableVoiceCall</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable voice calls from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableAvatarShare</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable sharing from web link</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DoubleClickShowWorldMap</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable double-click to show world map from mini map</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>EnableGroupChatPopups</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Enable Incoming Group Chat Popups</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>SearchFromAddressBar</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Can enter search queries into navigation address bar</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>DestinationGuideURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Destination guide contents</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/guide.html</string>
|
||||
</map>
|
||||
<key>AvatarPickerURL</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Avatar picker contents</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string>http://common-flash-secondlife-com.s3.amazonaws.com/viewer/v2.6/damballah/avatars.html</string>
|
||||
</map>
|
||||
<key>LogInventoryDecline</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Log in system chat whenever an inventory offer is declined</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>UseHTTPInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Allow use of http inventory transfers instead of UDP</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>ClickToWalk</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Click in world to walk to location</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ShowOfferedInventory</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Show inventory window with last inventory offer selected when receiving inventory from other users.</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
</map>
|
||||
</llsd>
|
||||
|
|
@ -2979,6 +2979,9 @@ public:
|
|||
gAgent.setGenderChosen(TRUE);
|
||||
}
|
||||
|
||||
// release avatar picker keyboard focus
|
||||
gFocusMgr.setKeyboardFocus( NULL );
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/**
|
||||
* @file llappviewer.cpp
|
||||
* @brief The LLAppViewer class definitions
|
||||
*
|
||||
|
|
@ -337,6 +337,46 @@ void init_default_trans_args()
|
|||
const char *VFS_DATA_FILE_BASE = "data.db2.x.";
|
||||
const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
|
||||
|
||||
|
||||
struct SettingsFile : public LLInitParam::Block<SettingsFile>
|
||||
{
|
||||
Mandatory<std::string> name;
|
||||
Optional<std::string> file_name;
|
||||
Optional<bool> required,
|
||||
persistent;
|
||||
Optional<std::string> file_name_setting;
|
||||
|
||||
SettingsFile()
|
||||
: name("name"),
|
||||
file_name("file_name"),
|
||||
required("required", false),
|
||||
persistent("persistent", true),
|
||||
file_name_setting("file_name_setting")
|
||||
{}
|
||||
};
|
||||
|
||||
struct SettingsGroup : public LLInitParam::Block<SettingsGroup>
|
||||
{
|
||||
Mandatory<std::string> name;
|
||||
Mandatory<S32> path_index;
|
||||
Multiple<SettingsFile> files;
|
||||
|
||||
SettingsGroup()
|
||||
: name("name"),
|
||||
path_index("path_index"),
|
||||
files("file")
|
||||
{}
|
||||
};
|
||||
|
||||
struct SettingsFiles : public LLInitParam::Block<SettingsFiles>
|
||||
{
|
||||
Multiple<SettingsGroup> groups;
|
||||
|
||||
SettingsFiles()
|
||||
: groups("group")
|
||||
{}
|
||||
};
|
||||
|
||||
static std::string gWindowTitle;
|
||||
|
||||
LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
|
||||
|
|
@ -594,7 +634,8 @@ LLAppViewer::LLAppViewer() :
|
|||
mRandomizeFramerate(LLCachedControl<bool>(gSavedSettings,"Randomize Framerate", FALSE)),
|
||||
mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
|
||||
mFastTimerLogThread(NULL),
|
||||
mUpdater(new LLUpdaterService())
|
||||
mUpdater(new LLUpdaterService()),
|
||||
mSettingsLocationList(NULL)
|
||||
{
|
||||
if(NULL != sInstance)
|
||||
{
|
||||
|
|
@ -610,6 +651,8 @@ LLAppViewer::LLAppViewer() :
|
|||
|
||||
LLAppViewer::~LLAppViewer()
|
||||
{
|
||||
delete mSettingsLocationList;
|
||||
|
||||
LLLoginInstance::instance().setUpdaterService(0);
|
||||
|
||||
destroyMainloopTimeout();
|
||||
|
|
@ -1677,8 +1720,8 @@ bool LLAppViewer::cleanup()
|
|||
|
||||
// Delete workers first
|
||||
// shotdown all worker threads before deleting them in case of co-dependencies
|
||||
sTextureCache->shutdown();
|
||||
sTextureFetch->shutdown();
|
||||
sTextureCache->shutdown();
|
||||
sImageDecodeThread->shutdown();
|
||||
|
||||
sTextureFetch->shutDownTextureCacheThread() ;
|
||||
|
|
@ -1879,85 +1922,80 @@ bool LLAppViewer::initLogging()
|
|||
bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
|
||||
bool set_defaults)
|
||||
{
|
||||
// Find and vet the location key.
|
||||
if(!mSettingsLocationList.has(location_key))
|
||||
if (!mSettingsLocationList)
|
||||
{
|
||||
llerrs << "Requested unknown location: " << location_key << llendl;
|
||||
return false;
|
||||
llerrs << "Invalid settings location list" << llendl;
|
||||
}
|
||||
|
||||
LLSD location = mSettingsLocationList.get(location_key);
|
||||
LLControlGroup* global_settings = LLControlGroup::getInstance(sGlobalSettingsName);
|
||||
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
// skip settings groups that aren't the one we requested
|
||||
if (it->name() != location_key) continue;
|
||||
|
||||
if(!location.has("PathIndex"))
|
||||
{
|
||||
llerrs << "Settings location is missing PathIndex value. Settings cannot be loaded." << llendl;
|
||||
return false;
|
||||
}
|
||||
ELLPath path_index = (ELLPath)(location.get("PathIndex").asInteger());
|
||||
if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
|
||||
{
|
||||
llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
|
||||
return false;
|
||||
}
|
||||
ELLPath path_index = (ELLPath)it->path_index();
|
||||
if(path_index <= LL_PATH_NONE || path_index >= LL_PATH_LAST)
|
||||
{
|
||||
llerrs << "Out of range path index in app_settings/settings_files.xml" << llendl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// Iterate through the locations list of files.
|
||||
LLSD files = location.get("Files");
|
||||
for(LLSD::map_iterator itr = files.beginMap(); itr != files.endMap(); ++itr)
|
||||
{
|
||||
std::string settings_group = (*itr).first;
|
||||
llinfos << "Attempting to load settings for the group " << settings_group
|
||||
LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
|
||||
for (file_it = it->files.begin(), end_file_it = it->files.end();
|
||||
file_it != end_file_it;
|
||||
++file_it)
|
||||
{
|
||||
llinfos << "Attempting to load settings for the group " << file_it->name()
|
||||
<< " - from location " << location_key << llendl;
|
||||
|
||||
if(!LLControlGroup::getInstance(settings_group))
|
||||
{
|
||||
llwarns << "No matching settings group for name " << settings_group << llendl;
|
||||
continue;
|
||||
}
|
||||
|
||||
LLSD file = (*itr).second;
|
||||
|
||||
std::string full_settings_path;
|
||||
if(file.has("NameFromSetting"))
|
||||
{
|
||||
std::string custom_name_setting = file.get("NameFromSetting");
|
||||
// *NOTE: Regardless of the group currently being lodaed,
|
||||
// this setting is always read from the Global settings.
|
||||
if(LLControlGroup::getInstance(sGlobalSettingsName)->controlExists(custom_name_setting))
|
||||
LLControlGroup* settings_group = LLControlGroup::getInstance(file_it->name);
|
||||
if(!settings_group)
|
||||
{
|
||||
std::string file_name =
|
||||
LLControlGroup::getInstance(sGlobalSettingsName)->getString(custom_name_setting);
|
||||
full_settings_path = file_name;
|
||||
llwarns << "No matching settings group for name " << file_it->name() << llendl;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(full_settings_path.empty())
|
||||
{
|
||||
std::string file_name = file.get("Name");
|
||||
full_settings_path = gDirUtilp->getExpandedFilename(path_index, file_name);
|
||||
}
|
||||
std::string full_settings_path;
|
||||
|
||||
int requirement = 0;
|
||||
if(file.has("Requirement"))
|
||||
{
|
||||
requirement = file.get("Requirement").asInteger();
|
||||
}
|
||||
|
||||
if(!LLControlGroup::getInstance(settings_group)->loadFromFile(full_settings_path, set_defaults))
|
||||
{
|
||||
if(requirement == 1)
|
||||
if (file_it->file_name_setting.isProvided()
|
||||
&& global_settings->controlExists(file_it->file_name_setting))
|
||||
{
|
||||
llwarns << "Error: Cannot load required settings file from: "
|
||||
<< full_settings_path << llendl;
|
||||
return false;
|
||||
// try to find filename stored in file_name_setting control
|
||||
full_settings_path = global_settings->getString(file_it->file_name_setting);
|
||||
if (!gDirUtilp->fileExists(full_settings_path))
|
||||
{
|
||||
// search in default path
|
||||
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, full_settings_path);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
|
||||
// by default, use specified file name
|
||||
full_settings_path = gDirUtilp->getExpandedFilename((ELLPath)path_index, file_it->file_name());
|
||||
}
|
||||
|
||||
if(settings_group->loadFromFile(full_settings_path, set_defaults, file_it->persistent))
|
||||
{ // success!
|
||||
llinfos << "Loaded settings file " << full_settings_path << llendl;
|
||||
}
|
||||
else
|
||||
{ // failed to load
|
||||
if(file_it->required)
|
||||
{
|
||||
llerrs << "Error: Cannot load required settings file from: " << full_settings_path << llendl;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// only complain if we actually have a filename at this point
|
||||
if (!full_settings_path.empty())
|
||||
{
|
||||
llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
llinfos << "Loaded settings file " << full_settings_path << llendl;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1967,18 +2005,25 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
|
|||
std::string LLAppViewer::getSettingsFilename(const std::string& location_key,
|
||||
const std::string& file)
|
||||
{
|
||||
if(mSettingsLocationList.has(location_key))
|
||||
for(LLInitParam::ParamIterator<SettingsGroup>::const_iterator it = mSettingsLocationList->groups.begin(), end_it = mSettingsLocationList->groups.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
LLSD location = mSettingsLocationList.get(location_key);
|
||||
if(location.has("Files"))
|
||||
if (it->name() == location_key)
|
||||
{
|
||||
LLSD files = location.get("Files");
|
||||
if(files.has(file) && files[file].has("Name"))
|
||||
LLInitParam::ParamIterator<SettingsFile>::const_iterator file_it, end_file_it;
|
||||
for (file_it = it->files.begin(), end_file_it = it->files.end();
|
||||
file_it != end_file_it;
|
||||
++file_it)
|
||||
{
|
||||
return files.get(file).get("Name").asString();
|
||||
if (file_it->name() == file)
|
||||
{
|
||||
return file_it->file_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::string();
|
||||
}
|
||||
|
||||
|
|
@ -1991,14 +2036,29 @@ bool LLAppViewer::initConfiguration()
|
|||
{
|
||||
//Load settings files list
|
||||
std::string settings_file_list = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "settings_files.xml");
|
||||
LLControlGroup settings_control("SettingsFiles");
|
||||
llinfos << "Loading settings file list " << settings_file_list << llendl;
|
||||
if (0 == settings_control.loadFromFile(settings_file_list))
|
||||
//LLControlGroup settings_control("SettingsFiles");
|
||||
//llinfos << "Loading settings file list " << settings_file_list << llendl;
|
||||
//if (0 == settings_control.loadFromFile(settings_file_list))
|
||||
//{
|
||||
// llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
|
||||
//}
|
||||
|
||||
LLXMLNodePtr root;
|
||||
BOOL success = LLXMLNode::parseFile(settings_file_list, root, NULL);
|
||||
if (!success)
|
||||
{
|
||||
llerrs << "Cannot load default configuration file " << settings_file_list << llendl;
|
||||
}
|
||||
|
||||
mSettingsLocationList = settings_control.getLLSD("Locations");
|
||||
mSettingsLocationList = new SettingsFiles();
|
||||
|
||||
LLXUIParser parser;
|
||||
parser.readXUI(root, *mSettingsLocationList, settings_file_list);
|
||||
|
||||
if (!mSettingsLocationList->validateBlock())
|
||||
{
|
||||
llerrs << "Invalid settings file list " << settings_file_list << llendl;
|
||||
}
|
||||
|
||||
// The settings and command line parsing have a fragile
|
||||
// order-of-operation:
|
||||
|
|
@ -2107,6 +2167,31 @@ bool LLAppViewer::initConfiguration()
|
|||
|
||||
// - load overrides from user_settings
|
||||
loadSettingsFromDirectory("User");
|
||||
|
||||
if (gSavedSettings.getBOOL("FirstRunThisInstall"))
|
||||
{
|
||||
gSavedSettings.setString("SessionSettingsFile", "settings_minimal.xml");
|
||||
}
|
||||
|
||||
if (clp.hasOption("sessionsettings"))
|
||||
{
|
||||
std::string session_settings_filename = clp.getOption("sessionsettings")[0];
|
||||
gSavedSettings.setString("SessionSettingsFile", session_settings_filename);
|
||||
llinfos << "Using session settings filename: "
|
||||
<< session_settings_filename << llendl;
|
||||
}
|
||||
loadSettingsFromDirectory("Session");
|
||||
|
||||
if (clp.hasOption("usersessionsettings"))
|
||||
{
|
||||
std::string user_session_settings_filename = clp.getOption("usersessionsettings")[0];
|
||||
gSavedSettings.setString("UserSessionSettingsFile", user_session_settings_filename);
|
||||
llinfos << "Using user session settings filename: "
|
||||
<< user_session_settings_filename << llendl;
|
||||
|
||||
}
|
||||
loadSettingsFromDirectory("UserSession");
|
||||
|
||||
// - apply command line settings
|
||||
clp.notify();
|
||||
|
||||
|
|
@ -3226,6 +3311,20 @@ static bool finish_quit(const LLSD& notification, const LLSD& response)
|
|||
}
|
||||
static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_quit);
|
||||
|
||||
static bool switch_standard_skin_and_quit(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
|
||||
if (option == 0)
|
||||
{
|
||||
gSavedSettings.setString("SessionSettingsFile", "");
|
||||
LLAppViewer::instance()->requestQuit();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static LLNotificationFunctorRegistration standard_skin_quit_reg("SwitchToStandardSkinAndQuit", switch_standard_skin_and_quit);
|
||||
|
||||
void LLAppViewer::userQuit()
|
||||
{
|
||||
if (gDisconnected || gViewerWindow->getProgressView()->getVisible())
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ private:
|
|||
bool mQuitRequested; // User wants to quit, may have modified documents open.
|
||||
bool mLogoutRequestSent; // Disconnect message sent to simulator, no longer safe to send messages to the sim.
|
||||
S32 mYieldTime;
|
||||
LLSD mSettingsLocationList;
|
||||
struct SettingsFiles* mSettingsLocationList;
|
||||
|
||||
LLWatchdogTimeout* mMainloopTimeout;
|
||||
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "llfloatergroups.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfloaterpay.h"
|
||||
#include "llfloaterwebcontent.h"
|
||||
#include "llfloaterworldmap.h"
|
||||
#include "llgiveinventory.h"
|
||||
#include "llinventorybridge.h"
|
||||
|
|
@ -315,7 +316,7 @@ void LLAvatarActions::showProfile(const LLUUID& id)
|
|||
std::string agent_name = LLCacheName::buildUsername(full_name);
|
||||
llinfos << "opening web profile for " << agent_name << llendl;
|
||||
std::string url = getProfileURL(agent_name);
|
||||
LLWeb::loadWebURLInternal(url);
|
||||
LLWeb::loadWebURLInternal(url, "", id.asString());
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -336,6 +337,24 @@ void LLAvatarActions::showProfile(const LLUUID& id)
|
|||
}
|
||||
}
|
||||
|
||||
//static
|
||||
bool LLAvatarActions::profileVisible(const LLUUID& id)
|
||||
{
|
||||
LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString()));
|
||||
return browser && browser->isShown();
|
||||
}
|
||||
|
||||
|
||||
//static
|
||||
void LLAvatarActions::hideProfile(const LLUUID& id)
|
||||
{
|
||||
LLFloaterWebContent *browser = dynamic_cast<LLFloaterWebContent*> (LLFloaterReg::findInstance("web_content", id.asString()));
|
||||
if (browser)
|
||||
{
|
||||
browser->closeFloater();
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLAvatarActions::showOnMap(const LLUUID& id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -93,6 +93,8 @@ public:
|
|||
* Show avatar profile.
|
||||
*/
|
||||
static void showProfile(const LLUUID& id);
|
||||
static void hideProfile(const LLUUID& id);
|
||||
static bool profileVisible(const LLUUID& id);
|
||||
|
||||
/**
|
||||
* Show avatar on world map.
|
||||
|
|
|
|||
|
|
@ -38,12 +38,15 @@
|
|||
#include "lltexteditor.h"
|
||||
|
||||
// newview includes
|
||||
#include "llagent.h"
|
||||
#include "llagentcamera.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llchiclet.h"
|
||||
#include "llfloatercamera.h"
|
||||
#include "llhints.h"
|
||||
#include "llimfloater.h" // for LLIMFloater
|
||||
#include "llnearbychatbar.h"
|
||||
#include "llsidetray.h"
|
||||
#include "llspeakbutton.h"
|
||||
#include "llsplitbutton.h"
|
||||
#include "llsyswellwindow.h"
|
||||
|
|
@ -67,10 +70,11 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
|
|||
{
|
||||
if (mCanDrag)
|
||||
{
|
||||
S32 screenX, screenY;
|
||||
localPointToScreen(x, y, &screenX, &screenY);
|
||||
// pass hover to bottomtray
|
||||
LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
|
||||
// pass hover to bottomtray
|
||||
S32 screenX, screenY;
|
||||
localPointToScreen(x, y, &screenX, &screenY);
|
||||
LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
|
|
@ -200,6 +204,7 @@ LLBottomTray::LLBottomTray(const LLSD&)
|
|||
mSpeakBtn(NULL),
|
||||
mNearbyChatBar(NULL),
|
||||
mChatBarContainer(NULL),
|
||||
mNearbyCharResizeHandlePanel(NULL),
|
||||
mToolbarStack(NULL),
|
||||
mMovementButton(NULL),
|
||||
mResizeState(RS_NORESIZE),
|
||||
|
|
@ -416,10 +421,6 @@ void LLBottomTray::setVisible(BOOL visible)
|
|||
{
|
||||
LLPanel::setVisible(visible);
|
||||
}
|
||||
if(visible)
|
||||
gFloaterView->setSnapOffsetBottom(getRect().getHeight());
|
||||
else
|
||||
gFloaterView->setSnapOffsetBottom(0);
|
||||
}
|
||||
|
||||
S32 LLBottomTray::notifyParent(const LLSD& info)
|
||||
|
|
@ -505,6 +506,23 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
|
|||
setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
|
||||
}
|
||||
|
||||
void LLBottomTray::showSpeakButton(bool visible)
|
||||
{
|
||||
// Show/hide the button
|
||||
setTrayButtonVisible(RS_BUTTON_SPEAK, visible);
|
||||
|
||||
// and adjust other panels according to the occupied/freed space.
|
||||
const S32 panel_width = mSpeakPanel->getRect().getWidth();
|
||||
if (visible)
|
||||
{
|
||||
processWidthDecreased(-panel_width);
|
||||
}
|
||||
else
|
||||
{
|
||||
processWidthIncreased(panel_width);
|
||||
}
|
||||
}
|
||||
|
||||
void LLBottomTray::toggleMovementControls()
|
||||
{
|
||||
if (mMovementButton)
|
||||
|
|
@ -533,6 +551,7 @@ BOOL LLBottomTray::postBuild()
|
|||
LLHints::registerHintTarget("chat_bar", mNearbyChatBar->LLView::getHandle());
|
||||
|
||||
mChatBarContainer = getChild<LLLayoutPanel>("chat_bar_layout_panel");
|
||||
mNearbyCharResizeHandlePanel = getChild<LLPanel>("chat_bar_resize_handle_panel");
|
||||
|
||||
mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
|
||||
mMovementButton = getChild<LLButton>("movement_btn");
|
||||
|
|
@ -651,12 +670,20 @@ void LLBottomTray::onDraggableButtonHover(S32 x, S32 y)
|
|||
gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Reset cursor in case you move your mouse from the drag handle to a button.
|
||||
getWindow()->setCursor(UI_CURSOR_ARROW);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y)
|
||||
{
|
||||
// Draggable area lasts from the nearby chat input resize handle
|
||||
// to the chiclet area (exlusively).
|
||||
bool result = getRect().pointInRect(x, y);
|
||||
result = result && mNearbyChatBar->calcScreenRect().mRight < x;
|
||||
result = result && mNearbyCharResizeHandlePanel->calcScreenRect().mRight < x;
|
||||
result = result && mChicletPanel->calcScreenRect().mRight > x;
|
||||
return result;
|
||||
}
|
||||
|
|
@ -667,10 +694,7 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
|
|||
// (and according to future possible changes in the way button order is saved between sessions).
|
||||
state_object_map_t::const_iterator it = mStateProcessedObjectMap.begin();
|
||||
state_object_map_t::const_iterator it_end = mStateProcessedObjectMap.end();
|
||||
// Speak button is currently the only draggable button not in mStateProcessedObjectMap,
|
||||
// so if dragged_state is not found in that map, it should be RS_BUTTON_SPEAK. Change this code if any other
|
||||
// exclusions from mStateProcessedObjectMap will become draggable.
|
||||
EResizeState dragged_state = RS_BUTTON_SPEAK;
|
||||
EResizeState dragged_state = RS_NORESIZE;
|
||||
EResizeState landing_state = RS_NORESIZE;
|
||||
bool landing_state_found = false;
|
||||
// Find states for dragged item and landing tab
|
||||
|
|
@ -686,7 +710,17 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
|
|||
landing_state_found = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (dragged_state == RS_NORESIZE)
|
||||
{
|
||||
llwarns << "Cannot determine what button is being dragged" << llendl;
|
||||
llassert(dragged_state != RS_NORESIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
lldebugs << "Will place " << resizeStateToString(dragged_state)
|
||||
<< " before " << resizeStateToString(landing_state) << llendl;
|
||||
|
||||
// Update order of buttons according to drag'n'drop
|
||||
mButtonsOrder.erase(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), dragged_state));
|
||||
if (!landing_state_found && mLandingTab == getChild<LLPanel>(PANEL_CHICLET_NAME))
|
||||
|
|
@ -695,9 +729,10 @@ void LLBottomTray::updateButtonsOrdersAfterDnD()
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!landing_state_found) landing_state = RS_BUTTON_SPEAK;
|
||||
if (!landing_state_found) landing_state = RS_BUTTON_SPEAK; // just a random fallback
|
||||
mButtonsOrder.insert(std::find(mButtonsOrder.begin(), mButtonsOrder.end(), landing_state), dragged_state);
|
||||
}
|
||||
|
||||
// Synchronize button process order with their order
|
||||
resize_state_vec_t::const_iterator it1 = mButtonsOrder.begin();
|
||||
const resize_state_vec_t::const_iterator it_end1 = mButtonsOrder.end();
|
||||
|
|
@ -774,11 +809,12 @@ void LLBottomTray::loadButtonsOrder()
|
|||
// placing panels in layout stack according to button order which we loaded in previous for
|
||||
for (resize_state_vec_t::const_reverse_iterator it = mButtonsOrder.rbegin(); it != it_end; ++it, ++i)
|
||||
{
|
||||
LLPanel* panel_to_move = *it == RS_BUTTON_SPEAK ? mSpeakPanel : mStateProcessedObjectMap[*it];
|
||||
LLPanel* panel_to_move = getButtonPanel(*it);
|
||||
mToolbarStack->movePanel(panel_to_move, NULL, true); // prepend
|
||||
}
|
||||
// Nearbychat is not stored in order settings file, but it must be the first of the panels, so moving it
|
||||
// manually here
|
||||
// (along with its drag handle) manually here.
|
||||
mToolbarStack->movePanel(getChild<LLLayoutPanel>("chat_bar_resize_handle_panel"), NULL, true);
|
||||
mToolbarStack->movePanel(mChatBarContainer, NULL, true);
|
||||
}
|
||||
|
||||
|
|
@ -812,6 +848,24 @@ void LLBottomTray::draw()
|
|||
LLRect rect = mLandingTab->calcScreenRect();
|
||||
mImageDragIndication->draw(rect.mLeft - w/2, rect.getHeight(), w, h);
|
||||
}
|
||||
getChild<LLButton>("show_profile_btn")->setToggleState(LLAvatarActions::profileVisible(gAgent.getID()));
|
||||
|
||||
LLPanel* panel = LLSideTray::getInstance()->getPanel("panel_people");
|
||||
if (panel && panel->isInVisibleChain())
|
||||
{
|
||||
getChild<LLButton>("show_people_button")->setToggleState(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
getChild<LLButton>("show_people_button")->setToggleState(false);
|
||||
}
|
||||
|
||||
LLFloater* help_browser = (LLFloaterReg::findInstance("help_browser"));
|
||||
bool help_floater_visible = (help_browser && help_browser->isInVisibleChain());
|
||||
|
||||
getChild<LLButton>("show_help_btn")->setToggleState(help_floater_visible);
|
||||
|
||||
|
||||
}
|
||||
|
||||
bool LLBottomTray::onContextMenuItemEnabled(const LLSD& userdata)
|
||||
|
|
@ -1178,9 +1232,8 @@ void LLBottomTray::processShowButtons(S32& available_width)
|
|||
bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width)
|
||||
{
|
||||
lldebugs << "Trying to show object type: " << shown_object_type << llendl;
|
||||
llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
|
||||
|
||||
LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
|
||||
LLPanel* panel = getButtonPanel(shown_object_type);
|
||||
if (NULL == panel)
|
||||
{
|
||||
lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
|
||||
|
|
@ -1226,9 +1279,7 @@ void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_wi
|
|||
void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width)
|
||||
{
|
||||
lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
|
||||
llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
|
||||
|
||||
LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
|
||||
LLPanel* panel = getButtonPanel(processed_object_type);
|
||||
if (NULL == panel)
|
||||
{
|
||||
lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
|
||||
|
|
@ -1273,7 +1324,6 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
|
|||
// then shrink Speak button
|
||||
if (required_width < 0)
|
||||
{
|
||||
|
||||
S32 panel_min_width = 0;
|
||||
std::string panel_name = mSpeakPanel->getName();
|
||||
bool success = mToolbarStack->getPanelMinSize(panel_name, &panel_min_width);
|
||||
|
|
@ -1309,8 +1359,7 @@ void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_
|
|||
|
||||
void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width)
|
||||
{
|
||||
llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
|
||||
LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
|
||||
LLPanel* panel = getButtonPanel(processed_object_type);
|
||||
if (NULL == panel)
|
||||
{
|
||||
lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
|
||||
|
|
@ -1411,8 +1460,7 @@ void LLBottomTray::processExtendButtons(S32& available_width)
|
|||
|
||||
void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width)
|
||||
{
|
||||
llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
|
||||
LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
|
||||
LLPanel* panel = getButtonPanel(processed_object_type);
|
||||
if (NULL == panel)
|
||||
{
|
||||
lldebugs << "There is no object to process for type: " << processed_object_type << llendl;
|
||||
|
|
@ -1480,6 +1528,7 @@ bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
|
|||
void LLBottomTray::initResizeStateContainers()
|
||||
{
|
||||
// init map with objects should be processed for each type
|
||||
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLPanel>("speak_panel")));
|
||||
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
|
||||
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
|
||||
mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
|
||||
|
|
@ -1512,22 +1561,22 @@ void LLBottomTray::initResizeStateContainers()
|
|||
{
|
||||
const EResizeState button_type = *it;
|
||||
// is there an appropriate object?
|
||||
llassert(mStateProcessedObjectMap.count(button_type) > 0);
|
||||
if (0 == mStateProcessedObjectMap.count(button_type)) continue;
|
||||
LLPanel* button_panel = getButtonPanel(button_type);
|
||||
if (!button_panel) continue;
|
||||
|
||||
// set default width for it.
|
||||
mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth();
|
||||
mObjectDefaultWidthMap[button_type] = button_panel->getRect().getWidth();
|
||||
}
|
||||
|
||||
// ... and add Speak button because it also can be shrunk.
|
||||
mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
|
||||
|
||||
}
|
||||
|
||||
// this method must be called before restoring of the chat entry field on startup
|
||||
// because it resets chatbar's width according to resize logic.
|
||||
void LLBottomTray::initButtonsVisibility()
|
||||
{
|
||||
setVisibleAndFitWidths(RS_BUTTON_SPEAK, gSavedSettings.getBOOL("EnableVoiceChat"));
|
||||
setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
|
||||
setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
|
||||
setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
|
||||
|
|
@ -1540,6 +1589,7 @@ void LLBottomTray::initButtonsVisibility()
|
|||
|
||||
void LLBottomTray::setButtonsControlsAndListeners()
|
||||
{
|
||||
gSavedSettings.getControl("EnableVoiceChat")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SPEAK, _2));
|
||||
gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
|
||||
gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
|
||||
gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
|
||||
|
|
@ -1568,8 +1618,7 @@ bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, cons
|
|||
|
||||
void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
|
||||
{
|
||||
llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
|
||||
LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
|
||||
LLPanel* panel = getButtonPanel(shown_object_type);
|
||||
if (NULL == panel)
|
||||
{
|
||||
lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
|
||||
|
|
@ -1592,7 +1641,15 @@ void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type
|
|||
|
||||
bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
|
||||
{
|
||||
LLPanel* cur_panel = mStateProcessedObjectMap[object_type];
|
||||
// The Speak button is treated specially: if voice is enabled,
|
||||
// the button should be displayed no matter how much space we've got.
|
||||
if (object_type == RS_BUTTON_SPEAK)
|
||||
{
|
||||
showSpeakButton(visible);
|
||||
return true;
|
||||
}
|
||||
|
||||
LLPanel* cur_panel = getButtonPanel(object_type);
|
||||
if (NULL == cur_panel)
|
||||
{
|
||||
lldebugs << "There is no object to process for state: " << object_type << llendl;
|
||||
|
|
@ -1637,7 +1694,7 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
|
|||
|
||||
for (; it != it_end; ++it)
|
||||
{
|
||||
LLPanel * cur_panel = mStateProcessedObjectMap[*it];
|
||||
LLPanel* cur_panel = getButtonPanel(*it);
|
||||
sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel);
|
||||
sum_of_curr_widths += get_curr_width(cur_panel);
|
||||
}
|
||||
|
|
@ -1695,6 +1752,19 @@ bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible
|
|||
return is_set;
|
||||
}
|
||||
|
||||
LLPanel* LLBottomTray::getButtonPanel(EResizeState button_type)
|
||||
{
|
||||
// Don't use the operator[] because it inserts a NULL value if the key is not found.
|
||||
if (mStateProcessedObjectMap.count(button_type) == 0)
|
||||
{
|
||||
llwarns << "Cannot find a panel for " << resizeStateToString(button_type) << llendl;
|
||||
llassert(mStateProcessedObjectMap.count(button_type) == 1);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return mStateProcessedObjectMap[button_type];
|
||||
}
|
||||
|
||||
void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
|
||||
{
|
||||
llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );
|
||||
|
|
@ -1752,4 +1822,29 @@ void LLBottomTray::processChatbarCustomization(S32 new_width)
|
|||
}
|
||||
}
|
||||
|
||||
// static
|
||||
std::string LLBottomTray::resizeStateToString(EResizeState state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
case RS_NORESIZE: return "RS_NORESIZE";
|
||||
case RS_CHICLET_PANEL: return "RS_CHICLET_PANEL";
|
||||
case RS_CHATBAR_INPUT: return "RS_CHATBAR_INPUT";
|
||||
case RS_BUTTON_SNAPSHOT: return "RS_BUTTON_SNAPSHOT";
|
||||
case RS_BUTTON_CAMERA: return "RS_BUTTON_CAMERA";
|
||||
case RS_BUTTON_MOVEMENT: return "RS_BUTTON_MOVEMENT";
|
||||
case RS_BUTTON_GESTURES: return "RS_BUTTON_GESTURES";
|
||||
case RS_BUTTON_SPEAK: return "RS_BUTTON_SPEAK";
|
||||
case RS_IM_WELL: return "RS_IM_WELL";
|
||||
case RS_NOTIFICATION_WELL: return "RS_NOTIFICATION_WELL";
|
||||
case RS_BUTTON_BUILD: return "RS_BUTTON_BUILD";
|
||||
case RS_BUTTON_SEARCH: return "RS_BUTTON_SEARCH";
|
||||
case RS_BUTTON_WORLD_MAP: return "RS_BUTTON_WORLD_MAP";
|
||||
case RS_BUTTON_MINI_MAP: return "RS_BUTTON_MINI_MAP";
|
||||
case RS_BUTTONS_CAN_BE_HIDDEN: return "RS_BUTTONS_CAN_BE_HIDDEN";
|
||||
// No default to track additions.
|
||||
}
|
||||
return "UNKNOWN_BUTTON";
|
||||
}
|
||||
|
||||
//EOF
|
||||
|
|
|
|||
|
|
@ -116,6 +116,7 @@ public:
|
|||
void showMoveButton(BOOL visible);
|
||||
void showCameraButton(BOOL visible);
|
||||
void showSnapshotButton(BOOL visible);
|
||||
void showSpeakButton(bool visible);
|
||||
|
||||
void toggleMovementControls();
|
||||
void toggleCameraControls();
|
||||
|
|
@ -390,6 +391,13 @@ private:
|
|||
*/
|
||||
bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
|
||||
|
||||
/**
|
||||
* Get panel containing the given button.
|
||||
*
|
||||
* @see mStateProcessedObjectMap
|
||||
*/
|
||||
LLPanel* getButtonPanel(EResizeState button_type);
|
||||
|
||||
/**
|
||||
* Shows/hides panel with specified well button (IM or Notification)
|
||||
*
|
||||
|
|
@ -409,12 +417,21 @@ private:
|
|||
*/
|
||||
void processChatbarCustomization(S32 new_width);
|
||||
|
||||
/// Get button name for debugging.
|
||||
static std::string resizeStateToString(EResizeState state);
|
||||
|
||||
/// Buttons automatically hidden due to lack of space.
|
||||
MASK mResizeState;
|
||||
|
||||
/**
|
||||
* Mapping of button types to the layout panels the buttons are wrapped in.
|
||||
*
|
||||
* Used by getButtonPanel().
|
||||
*/
|
||||
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
|
||||
state_object_map_t mStateProcessedObjectMap;
|
||||
|
||||
/// Default (maximum) widths of the layout panels.
|
||||
typedef std::map<EResizeState, S32> state_object_width_map_t;
|
||||
state_object_width_map_t mObjectDefaultWidthMap;
|
||||
|
||||
|
|
@ -424,6 +441,7 @@ private:
|
|||
* Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
|
||||
*/
|
||||
resize_state_vec_t mButtonsProcessOrder;
|
||||
|
||||
/**
|
||||
* Contains order in which child buttons are shown.
|
||||
* It traces order of all bottomtray buttons that may change place via drag'n'drop and should
|
||||
|
|
@ -451,6 +469,7 @@ protected:
|
|||
LLSpeakButton* mSpeakBtn;
|
||||
LLNearbyChatBar* mNearbyChatBar;
|
||||
LLLayoutPanel* mChatBarContainer;
|
||||
LLPanel* mNearbyCharResizeHandlePanel;
|
||||
LLLayoutStack* mToolbarStack;
|
||||
LLMenuGL* mBottomTrayContextMenu;
|
||||
LLButton* mCamButton;
|
||||
|
|
|
|||
|
|
@ -138,10 +138,7 @@ public:
|
|||
|
||||
if (level == "profile")
|
||||
{
|
||||
LLSD params;
|
||||
params["object_id"] = getAvatarId();
|
||||
|
||||
LLFloaterReg::showInstance("inspect_object", params);
|
||||
LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
|
||||
}
|
||||
else if (level == "block")
|
||||
{
|
||||
|
|
@ -229,7 +226,7 @@ public:
|
|||
|
||||
if (mSourceType == CHAT_SOURCE_OBJECT)
|
||||
{
|
||||
LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID));
|
||||
LLFloaterReg::showInstance("inspect_remote_object", mObjectData);
|
||||
}
|
||||
else if (mSourceType == CHAT_SOURCE_AGENT)
|
||||
{
|
||||
|
|
@ -251,7 +248,7 @@ public:
|
|||
|
||||
const LLUUID& getAvatarId () const { return mAvatarID;}
|
||||
|
||||
void setup(const LLChat& chat,const LLStyle::Params& style_params)
|
||||
void setup(const LLChat& chat, const LLStyle::Params& style_params, const LLSD& args)
|
||||
{
|
||||
mAvatarID = chat.mFromID;
|
||||
mSessionID = chat.mSessionID;
|
||||
|
|
@ -332,7 +329,8 @@ public:
|
|||
|
||||
|
||||
setTimeField(chat);
|
||||
|
||||
|
||||
// Set up the icon.
|
||||
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
|
||||
|
||||
if(mSourceType != CHAT_SOURCE_AGENT || mAvatarID.isNull())
|
||||
|
|
@ -352,6 +350,30 @@ public:
|
|||
case CHAT_SOURCE_UNKNOWN:
|
||||
icon->setValue(LLSD("Unknown_Icon"));
|
||||
}
|
||||
|
||||
// In case the message came from an object, save the object info
|
||||
// to be able properly show its profile.
|
||||
if ( chat.mSourceType == CHAT_SOURCE_OBJECT)
|
||||
{
|
||||
std::string slurl = args["slurl"].asString();
|
||||
if (slurl.empty())
|
||||
{
|
||||
LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
|
||||
if(region)
|
||||
{
|
||||
LLSLURL region_slurl(region->getName(), chat.mPosAgent);
|
||||
slurl = region_slurl.getLocationString();
|
||||
}
|
||||
}
|
||||
|
||||
LLSD payload;
|
||||
payload["object_id"] = chat.mFromID;
|
||||
payload["name"] = chat.mFromName;
|
||||
payload["owner_id"] = chat.mOwnerID;
|
||||
payload["slurl"] = LLWeb::escapeURL(slurl);
|
||||
|
||||
mObjectData = payload;
|
||||
}
|
||||
}
|
||||
|
||||
/*virtual*/ void draw()
|
||||
|
|
@ -540,6 +562,7 @@ protected:
|
|||
static LLUICtrl* sInfoCtrl;
|
||||
|
||||
LLUUID mAvatarID;
|
||||
LLSD mObjectData;
|
||||
EChatSourceType mSourceType;
|
||||
std::string mFrom;
|
||||
LLUUID mSessionID;
|
||||
|
|
@ -649,10 +672,10 @@ LLView* LLChatHistory::getSeparator()
|
|||
return separator;
|
||||
}
|
||||
|
||||
LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
|
||||
LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args)
|
||||
{
|
||||
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
|
||||
header->setup(chat,style_params);
|
||||
header->setup(chat, style_params, args);
|
||||
return header;
|
||||
}
|
||||
|
||||
|
|
@ -834,7 +857,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
|
|||
}
|
||||
else
|
||||
{
|
||||
view = getHeader(chat, style_params);
|
||||
view = getHeader(chat, style_params, args);
|
||||
if (mEditor->getText().size() == 0)
|
||||
p.top_pad = 0;
|
||||
else
|
||||
|
|
|
|||
|
|
@ -94,7 +94,7 @@ class LLChatHistory : public LLUICtrl
|
|||
* Builds a message header.
|
||||
* @return pointer to LLView header object.
|
||||
*/
|
||||
LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
|
||||
LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params, const LLSD& args);
|
||||
|
||||
void onClickMoreText();
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
// system includes
|
||||
#include <boost/tokenizer.hpp>
|
||||
|
||||
#define THROTTLE_PERIOD 15 // required secs between throttled commands
|
||||
#define THROTTLE_PERIOD 5 // required secs between throttled commands
|
||||
|
||||
static LLCommandDispatcherListener sCommandDispatcherListener;
|
||||
|
||||
|
|
|
|||
|
|
@ -41,36 +41,35 @@
|
|||
|
||||
|
||||
// static
|
||||
//std::set<std::string> LLFirstUse::sConfigVariables;
|
||||
std::set<std::string> LLFirstUse::sConfigVariablesEnabled;
|
||||
std::set<std::string> LLFirstUse::sConfigVariables;
|
||||
|
||||
// static
|
||||
//void LLFirstUse::addConfigVariable(const std::string& var)
|
||||
//{
|
||||
// sConfigVariables.insert(var);
|
||||
//}
|
||||
void LLFirstUse::addConfigVariable(const std::string& var)
|
||||
{
|
||||
sConfigVariables.insert(var);
|
||||
}
|
||||
|
||||
// static
|
||||
//void LLFirstUse::disableFirstUse()
|
||||
//{
|
||||
// // Set all first-use warnings to disabled
|
||||
// for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
// iter != sConfigVariables.end(); ++iter)
|
||||
// {
|
||||
// gWarningSettings.setBOOL(*iter, FALSE);
|
||||
// }
|
||||
//}
|
||||
void LLFirstUse::disableFirstUse()
|
||||
{
|
||||
// Set all first-use warnings to disabled
|
||||
for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
iter != sConfigVariables.end(); ++iter)
|
||||
{
|
||||
gWarningSettings.setBOOL(*iter, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
//void LLFirstUse::resetFirstUse()
|
||||
//{
|
||||
// // Set all first-use warnings to disabled
|
||||
// for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
// iter != sConfigVariables.end(); ++iter)
|
||||
// {
|
||||
// gWarningSettings.setBOOL(*iter, TRUE);
|
||||
// }
|
||||
//}
|
||||
void LLFirstUse::resetFirstUse()
|
||||
{
|
||||
// Set all first-use warnings to disabled
|
||||
for (std::set<std::string>::iterator iter = sConfigVariables.begin();
|
||||
iter != sConfigVariables.end(); ++iter)
|
||||
{
|
||||
gWarningSettings.setBOOL(*iter, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLFirstUse::otherAvatarChatFirst(bool enable)
|
||||
|
|
@ -104,13 +103,6 @@ void LLFirstUse::notUsingDestinationGuide(bool enable)
|
|||
firstUseNotification("FirstNotUseDestinationGuide", enable, "HintDestinationGuide", LLSD(), LLSD().with("target", "dest_guide_btn").with("direction", "top"));
|
||||
}
|
||||
|
||||
void LLFirstUse::notUsingAvatarPicker(bool enable)
|
||||
{
|
||||
// not doing this yet
|
||||
firstUseNotification("FirstNotUseAvatarPicker", enable, "HintAvatarPicker", LLSD(), LLSD().with("target", "avatar_picker_btn").with("direction", "top"));
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLFirstUse::notUsingSidePanel(bool enable)
|
||||
{
|
||||
|
|
@ -152,21 +144,13 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl
|
|||
|
||||
if (enable)
|
||||
{
|
||||
if(sConfigVariablesEnabled.find(control_var) != sConfigVariablesEnabled.end())
|
||||
{
|
||||
return ; //already added
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("EnableUIHints"))
|
||||
{
|
||||
LL_DEBUGS("LLFirstUse") << "Trigger first use notification " << notification_name << LL_ENDL;
|
||||
|
||||
// if notification doesn't already exist and this notification hasn't been disabled...
|
||||
if (gWarningSettings.getBOOL(control_var))
|
||||
{
|
||||
sConfigVariablesEnabled.insert(control_var) ;
|
||||
|
||||
// create new notification
|
||||
{ // create new notification
|
||||
LLNotifications::instance().add(LLNotification::Params().name(notification_name).substitutions(args).payload(payload.with("control_var", control_var)));
|
||||
}
|
||||
}
|
||||
|
|
@ -178,6 +162,7 @@ void LLFirstUse::firstUseNotification(const std::string& control_var, bool enabl
|
|||
// redundantly clear settings var here, in case there are no notifications to cancel
|
||||
gWarningSettings.setBOOL(control_var, FALSE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// static
|
||||
|
|
|
|||
|
|
@ -78,16 +78,15 @@ class LLFirstUse
|
|||
public:
|
||||
|
||||
// Add a config variable to be reset on resetFirstUse()
|
||||
//static void addConfigVariable(const std::string& var);
|
||||
static void addConfigVariable(const std::string& var);
|
||||
|
||||
// Sets all controls back to show the dialogs.
|
||||
//static void disableFirstUse();
|
||||
//static void resetFirstUse();
|
||||
static void disableFirstUse();
|
||||
static void resetFirstUse();
|
||||
|
||||
static void otherAvatarChatFirst(bool enable = true);
|
||||
static void sit(bool enable = true);
|
||||
static void notUsingDestinationGuide(bool enable = true);
|
||||
static void notUsingAvatarPicker(bool enable = true);
|
||||
static void notUsingSidePanel(bool enable = true);
|
||||
static void notMoving(bool enable = true);
|
||||
static void viewPopup(bool enable = true);
|
||||
|
|
@ -98,8 +97,7 @@ public:
|
|||
|
||||
protected:
|
||||
static void firstUseNotification(const std::string& control_var, bool enable, const std::string& notification_name, LLSD args = LLSD(), LLSD payload = LLSD());
|
||||
//static std::set<std::string> sConfigVariables;
|
||||
static std::set<std::string> sConfigVariablesEnabled;
|
||||
static std::set<std::string> sConfigVariables;
|
||||
|
||||
static void init();
|
||||
static bool processNotification(const LLSD& notify);
|
||||
|
|
|
|||
|
|
@ -351,8 +351,8 @@ void LLFloaterAuction::doResetParcel()
|
|||
body["media_height"] = (S32) 0;
|
||||
body["auto_scale"] = (S32) 0;
|
||||
body["media_loop"] = (S32) 0;
|
||||
body["obscure_media"] = (S32) 0;
|
||||
body["obscure_music"] = (S32) 0;
|
||||
body["obscure_media"] = (S32) 0; // OBSOLETE - no longer used
|
||||
body["obscure_music"] = (S32) 0; // OBSOLETE - no longer used
|
||||
body["media_id"] = LLUUID::null;
|
||||
body["group_id"] = MAINTENANCE_GROUP_ID; // Use maintenance group
|
||||
body["pass_price"] = (S32) 10; // Defaults to $10
|
||||
|
|
|
|||
|
|
@ -83,8 +83,14 @@ LLFloaterMap::~LLFloaterMap()
|
|||
BOOL LLFloaterMap::postBuild()
|
||||
{
|
||||
mMap = getChild<LLNetMap>("Net Map");
|
||||
mMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
|
||||
getString("AltToolTipMsg") : getString("ToolTipMsg"));
|
||||
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
|
||||
{
|
||||
mMap->setToolTipMsg(getString("AltToolTipMsg"));
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
|
||||
{
|
||||
mMap->setToolTipMsg(getString("ToolTipMsg"));
|
||||
}
|
||||
sendChildToBack(mMap);
|
||||
|
||||
mTextBoxNorth = getChild<LLTextBox> ("floater_map_north");
|
||||
|
|
@ -150,7 +156,7 @@ BOOL LLFloaterMap::handleDoubleClick(S32 x, S32 y, MASK mask)
|
|||
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
|
||||
gAgent.teleportViaLocationLookAt(pos_global);
|
||||
}
|
||||
else
|
||||
else if (gSavedSettings.getBOOL("DoubleClickShowWorldMap"))
|
||||
{
|
||||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
|
||||
// newview includes
|
||||
#include "lltransientfloatermgr.h"
|
||||
#include "llsidetray.h"
|
||||
|
||||
LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params)
|
||||
: LLFloater(key, params)
|
||||
|
|
@ -43,3 +44,8 @@ LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
|
|||
{
|
||||
LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
|
||||
}
|
||||
|
||||
void LLFloaterSideTrayTab::onClose(bool app_quitting)
|
||||
{
|
||||
LLSideTray::getInstance()->setTabDocked(getName(), true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@ class LLFloaterSideTrayTab : public LLFloater
|
|||
public:
|
||||
LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams());
|
||||
~LLFloaterSideTrayTab();
|
||||
|
||||
void onClose(bool app_quitting);
|
||||
};
|
||||
|
||||
#endif // LL_LLFLOATERSIDETRAYTAB_H
|
||||
|
|
|
|||
|
|
@ -110,6 +110,12 @@ public:
|
|||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (params.size() == 0)
|
||||
{
|
||||
// support the secondlife:///app/worldmap SLapp
|
||||
|
|
@ -142,6 +148,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableWorldMap"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoWorldMap", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
//Make sure we have some parameters
|
||||
if (params.size() == 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#include "llfriendcard.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llavatarnamecache.h"
|
||||
#include "llinventory.h"
|
||||
#include "llinventoryfunctions.h"
|
||||
|
|
@ -290,58 +291,6 @@ void LLFriendCardsManager::syncFriendCardsFolders()
|
|||
boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
|
||||
}
|
||||
|
||||
void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
|
||||
{
|
||||
folderBuddiesMap.clear();
|
||||
|
||||
static bool syncronize_friends_folders = true;
|
||||
if (syncronize_friends_folders)
|
||||
{
|
||||
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
|
||||
// fetches their contents if needed and synchronizes it with buddies list.
|
||||
// If the folders are not found they are created.
|
||||
LLFriendCardsManager::instance().syncFriendCardsFolders();
|
||||
syncronize_friends_folders = false;
|
||||
}
|
||||
|
||||
|
||||
LLInventoryModel::cat_array_t* listFolders;
|
||||
LLInventoryModel::item_array_t* items;
|
||||
|
||||
// get folders in the Friend folder. Items should be NULL due to Cards should be in lists.
|
||||
gInventory.getDirectDescendentsOf(findFriendFolderUUIDImpl(), listFolders, items);
|
||||
|
||||
if (NULL == listFolders)
|
||||
return;
|
||||
|
||||
LLInventoryModel::cat_array_t::const_iterator itCats; // to iterate Friend Lists (categories)
|
||||
LLInventoryModel::item_array_t::const_iterator itBuddy; // to iterate Buddies in each List
|
||||
LLInventoryModel::cat_array_t* fakeCatsArg;
|
||||
for (itCats = listFolders->begin(); itCats != listFolders->end(); ++itCats)
|
||||
{
|
||||
if (items)
|
||||
items->clear();
|
||||
|
||||
// *HACK: Only Friends/All content will be shown for now
|
||||
// *TODO: Remove this hack, implement sorting if it will be needded by spec.
|
||||
if ((*itCats)->getUUID() != findFriendAllSubfolderUUIDImpl())
|
||||
continue;
|
||||
|
||||
gInventory.getDirectDescendentsOf((*itCats)->getUUID(), fakeCatsArg, items);
|
||||
|
||||
if (NULL == items)
|
||||
continue;
|
||||
|
||||
uuid_vec_t buddyUUIDs;
|
||||
for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
|
||||
{
|
||||
buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
|
||||
}
|
||||
|
||||
folderBuddiesMap.insert(make_pair((*itCats)->getUUID(), buddyUUIDs));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* Private Methods */
|
||||
|
|
@ -499,23 +448,43 @@ void LLFriendCardsManager::syncFriendsFolder()
|
|||
LLAvatarTracker::buddy_map_t all_buddies;
|
||||
LLAvatarTracker::instance().copyBuddyList(all_buddies);
|
||||
|
||||
// 1. Remove Friend Cards for non-friends
|
||||
// 1. Check if own calling card exists
|
||||
LLInventoryModel::cat_array_t cats;
|
||||
LLInventoryModel::item_array_t items;
|
||||
|
||||
gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
|
||||
LLUUID friends_all_folder_id = findFriendAllSubfolderUUIDImpl();
|
||||
gInventory.collectDescendents(friends_all_folder_id, cats, items, LLInventoryModel::EXCLUDE_TRASH);
|
||||
|
||||
bool own_callingcard_found = false;
|
||||
LLInventoryModel::item_array_t::const_iterator it;
|
||||
for (it = items.begin(); it != items.end(); ++it)
|
||||
{
|
||||
lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
|
||||
if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
|
||||
if ((*it)->getCreatorUUID() == gAgentID)
|
||||
{
|
||||
lldebugs << "NONEXISTS, so remove it" << llendl;
|
||||
removeFriendCardFromInventory((*it)->getCreatorUUID());
|
||||
own_callingcard_found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Create own calling card if it was not found in Friends/All folder
|
||||
if (!own_callingcard_found)
|
||||
{
|
||||
LLAvatarName av_name;
|
||||
LLAvatarNameCache::get( gAgentID, &av_name );
|
||||
|
||||
create_inventory_item(gAgentID,
|
||||
gAgent.getSessionID(),
|
||||
friends_all_folder_id,
|
||||
LLTransactionID::tnull,
|
||||
av_name.getCompleteName(),
|
||||
gAgentID.asString(),
|
||||
LLAssetType::AT_CALLINGCARD,
|
||||
LLInventoryType::IT_CALLINGCARD,
|
||||
NOT_WEARABLE,
|
||||
PERM_MOVE | PERM_TRANSFER,
|
||||
NULL);
|
||||
}
|
||||
|
||||
// 2. Add missing Friend Cards for friends
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
|
||||
llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
|
||||
|
|
|
|||
|
|
@ -79,19 +79,6 @@ public:
|
|||
*/
|
||||
void syncFriendCardsFolders();
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
* Collects folders' IDs with the buddies' IDs in the Inventory Calling Card/Friends folder.
|
||||
*
|
||||
* \param folderBuddiesMap
|
||||
* map into collected data will be put. It will be cleared before adding new data.
|
||||
*
|
||||
* Each item in the out map is a pair where first is an LLViewerInventoryCategory UUID,
|
||||
* second is a vector with UUID of Avatars from this folder.
|
||||
*
|
||||
*/
|
||||
void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
|
||||
|
||||
private:
|
||||
typedef boost::function<void()> callback_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,12 @@ public:
|
|||
bool handle(const LLSD& tokens, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableGroupInfo"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoGroupInfo", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tokens.size() < 1)
|
||||
{
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
/**
|
||||
* @file llhudeffecttrail.cpp
|
||||
* @brief LLHUDEffectSpiral class implementation
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llhudeffectblob.h"
|
||||
|
||||
#include "llagent.h"
|
||||
#include "llviewercamera.h"
|
||||
#include "llrendersphere.h"
|
||||
|
||||
LLHUDEffectBlob::LLHUDEffectBlob(const U8 type)
|
||||
: LLHUDEffect(type),
|
||||
mPixelSize(10)
|
||||
{
|
||||
mTimer.start();
|
||||
}
|
||||
|
||||
LLHUDEffectBlob::~LLHUDEffectBlob()
|
||||
{
|
||||
}
|
||||
|
||||
void LLHUDEffectBlob::render()
|
||||
{
|
||||
F32 time = mTimer.getElapsedTimeF32();
|
||||
if (mDuration < time)
|
||||
{
|
||||
markDead();
|
||||
}
|
||||
|
||||
LLVector3 pos_agent = gAgent.getPosAgentFromGlobal(mPositionGlobal);
|
||||
|
||||
LLVector3 pixel_up, pixel_right;
|
||||
|
||||
LLViewerCamera::instance().getPixelVectors(pos_agent, pixel_up, pixel_right);
|
||||
|
||||
LLGLSPipelineAlpha gls_pipeline_alpha;
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
|
||||
LLColor4U color = mColor;
|
||||
color.mV[VALPHA] = (U8)clamp_rescale(time, 0.f, mDuration, 255.f, 0.f);
|
||||
glColor4ubv(color.mV);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
|
||||
F32 scale = pixel_up.magVec() * (F32)mPixelSize;
|
||||
glScalef(scale, scale, scale);
|
||||
gSphere.render(0);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
void LLHUDEffectBlob::renderForTimer()
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/**
|
||||
* @file llhudeffectblob.h
|
||||
* @brief LLHUDEffectBlob class definition
|
||||
*
|
||||
* $LicenseInfo:firstyear=2002&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2010, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#ifndef LL_LLHUDEFFECTBLOB_H
|
||||
#define LL_LLHUDEFFECTBLOB_H
|
||||
|
||||
#include "llhudeffect.h"
|
||||
|
||||
class LLHUDEffectBlob : public LLHUDEffect
|
||||
{
|
||||
public:
|
||||
friend class LLHUDObject;
|
||||
|
||||
void setPixelSize(S32 pixels) { mPixelSize = pixels; }
|
||||
|
||||
protected:
|
||||
LLHUDEffectBlob(const U8 type);
|
||||
~LLHUDEffectBlob();
|
||||
|
||||
/*virtual*/ void render();
|
||||
/*virtual*/ void renderForTimer();
|
||||
private:
|
||||
S32 mPixelSize;
|
||||
LLFrameTimer mTimer;
|
||||
};
|
||||
|
||||
#endif // LL_LLHUDEFFECTBLOB_H
|
||||
|
|
@ -32,6 +32,7 @@
|
|||
#include "llhudtext.h"
|
||||
#include "llhudicon.h"
|
||||
#include "llhudeffectbeam.h"
|
||||
#include "llhudeffectblob.h"
|
||||
#include "llhudeffecttrail.h"
|
||||
#include "llhudeffectlookat.h"
|
||||
#include "llhudeffectpointat.h"
|
||||
|
|
@ -237,6 +238,9 @@ LLHUDEffect *LLHUDObject::addHUDEffect(const U8 type)
|
|||
case LL_HUD_EFFECT_POINTAT:
|
||||
hud_objectp = new LLHUDEffectPointAt(type);
|
||||
break;
|
||||
case LL_HUD_EFFECT_BLOB:
|
||||
hud_objectp = new LLHUDEffectBlob(type);
|
||||
break;
|
||||
default:
|
||||
llwarns << "Unknown type of hud effect:" << (U32) type << llendl;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,8 @@ public:
|
|||
LL_HUD_EFFECT_LOOKAT,
|
||||
LL_HUD_EFFECT_POINTAT,
|
||||
LL_HUD_EFFECT_VOICE_VISUALIZER, // Ventrella
|
||||
LL_HUD_NAME_TAG
|
||||
LL_HUD_NAME_TAG,
|
||||
LL_HUD_EFFECT_BLOB
|
||||
};
|
||||
protected:
|
||||
static void sortObjects();
|
||||
|
|
|
|||
|
|
@ -483,9 +483,6 @@ bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryIte
|
|||
|
||||
switch(item->getType())
|
||||
{
|
||||
case LLAssetType::AT_CALLINGCARD:
|
||||
return false;
|
||||
break;
|
||||
case LLAssetType::AT_OBJECT:
|
||||
case LLAssetType::AT_BODYPART:
|
||||
case LLAssetType::AT_CLOTHING:
|
||||
|
|
|
|||
|
|
@ -182,7 +182,7 @@ void LLInventoryModelBackgroundFetch::backgroundFetch()
|
|||
{
|
||||
// If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
|
||||
std::string url = gAgent.getRegion()->getCapability("FetchInventoryDescendents2");
|
||||
if (!url.empty())
|
||||
if (gSavedSettings.getBOOL("UseHTTPInventory") && !url.empty())
|
||||
{
|
||||
bulkFetch(url);
|
||||
return;
|
||||
|
|
|
|||
|
|
@ -211,7 +211,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
|
|||
{
|
||||
// Lets replace default LLLineEditor with LLLocationLineEditor
|
||||
// to make needed escaping while copying and cutting url
|
||||
this->removeChild(mTextEntry);
|
||||
delete mTextEntry;
|
||||
|
||||
// Can't access old mTextEntry fields as they are protected, so lets build new params
|
||||
|
|
|
|||
|
|
@ -636,18 +636,19 @@ void LLNavigationBar::onRegionNameResponse(
|
|||
U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
|
||||
{
|
||||
// Invalid location?
|
||||
if (!region_handle)
|
||||
if (region_handle)
|
||||
{
|
||||
// Teleport to the location.
|
||||
LLVector3d region_pos = from_region_handle(region_handle);
|
||||
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
|
||||
|
||||
llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
|
||||
gAgent.teleportViaLocation(global_pos);
|
||||
}
|
||||
else if (gSavedSettings.getBOOL("SearchFromAddressBar"))
|
||||
{
|
||||
invokeSearch(typed_location);
|
||||
return;
|
||||
}
|
||||
|
||||
// Teleport to the location.
|
||||
LLVector3d region_pos = from_region_handle(region_handle);
|
||||
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
|
||||
|
||||
llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
|
||||
gAgent.teleportViaLocation(global_pos);
|
||||
}
|
||||
|
||||
void LLNavigationBar::showTeleportHistoryMenu(LLUICtrl* btn_ctrl)
|
||||
|
|
|
|||
|
|
@ -157,6 +157,16 @@ BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
|
|||
return handled;
|
||||
}
|
||||
|
||||
void LLGestureComboList::draw()
|
||||
{
|
||||
LLUICtrl::draw();
|
||||
|
||||
if(mButton->getToggleState())
|
||||
{
|
||||
showList();
|
||||
}
|
||||
}
|
||||
|
||||
void LLGestureComboList::showList()
|
||||
{
|
||||
LLRect rect = mList->getRect();
|
||||
|
|
@ -180,6 +190,7 @@ void LLGestureComboList::showList()
|
|||
// Show the list and push the button down
|
||||
mButton->setToggleState(TRUE);
|
||||
mList->setVisible(TRUE);
|
||||
sendChildToFront(mList);
|
||||
LLUI::addPopup(mList);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,8 @@ public:
|
|||
virtual void hideList();
|
||||
virtual BOOL handleKeyHere(KEY key, MASK mask);
|
||||
|
||||
virtual void draw();
|
||||
|
||||
S32 getCurrentIndex() const;
|
||||
void onItemSelected(const LLSD& data);
|
||||
void sortByName(bool ascending = true);
|
||||
|
|
|
|||
|
|
@ -904,23 +904,29 @@ BOOL LLNetMap::handleClick(S32 x, S32 y, MASK mask)
|
|||
BOOL LLNetMap::handleDoubleClick(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLVector3d pos_global = viewPosToGlobal(x, y);
|
||||
|
||||
// If we're not tracking a beacon already, double-click will set one
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
|
||||
bool double_click_teleport = gSavedSettings.getBOOL("DoubleClickTeleport");
|
||||
bool double_click_show_world_map = gSavedSettings.getBOOL("DoubleClickShowWorldMap");
|
||||
|
||||
if (double_click_teleport || double_click_show_world_map)
|
||||
{
|
||||
LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
|
||||
if (world_map)
|
||||
// If we're not tracking a beacon already, double-click will set one
|
||||
if (!LLTracker::isTracking(NULL))
|
||||
{
|
||||
world_map->trackLocation(pos_global);
|
||||
LLFloaterWorldMap* world_map = LLFloaterWorldMap::getInstance();
|
||||
if (world_map)
|
||||
{
|
||||
world_map->trackLocation(pos_global);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gSavedSettings.getBOOL("DoubleClickTeleport"))
|
||||
|
||||
if (double_click_teleport)
|
||||
{
|
||||
// If DoubleClickTeleport is on, double clicking the minimap will teleport there
|
||||
gAgent.teleportViaLocationLookAt(pos_global);
|
||||
}
|
||||
else
|
||||
else if (double_click_show_world_map)
|
||||
{
|
||||
LLFloaterReg::showInstance("world_map");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
|
|||
initChannel();
|
||||
}
|
||||
|
||||
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
|
||||
if(notify["sigtype"].asString() == "add")
|
||||
{
|
||||
if (LLHandlerUtil::canLogToIM(notification))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -91,9 +91,6 @@ BOOL LLPanelLandAudio::postBuild()
|
|||
mMusicURLEdit = getChild<LLLineEditor>("music_url");
|
||||
childSetCommitCallback("music_url", onCommitAny, this);
|
||||
|
||||
mMusicUrlCheck = getChild<LLCheckBoxCtrl>("hide_music_url");
|
||||
childSetCommitCallback("hide_music_url", onCommitAny, this);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
@ -117,9 +114,6 @@ void LLPanelLandAudio::refresh()
|
|||
mCheckSoundLocal->set( parcel->getSoundLocal() );
|
||||
mCheckSoundLocal->setEnabled( can_change_media );
|
||||
|
||||
mMusicUrlCheck->set( parcel->getObscureMusic() );
|
||||
mMusicUrlCheck->setEnabled( can_change_media );
|
||||
|
||||
bool allow_voice = parcel->getParcelFlagAllowVoice();
|
||||
|
||||
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
|
||||
|
|
@ -148,13 +142,6 @@ void LLPanelLandAudio::refresh()
|
|||
mCheckParcelEnableVoice->set(allow_voice);
|
||||
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
|
||||
|
||||
// don't display urls if you're not able to change it
|
||||
// much requested change in forums so people can't 'steal' urls
|
||||
// NOTE: bug#2009 means this is still vunerable - however, bug
|
||||
// should be closed since this bug opens up major security issues elsewhere.
|
||||
bool obscure_music = ! can_change_media && parcel->getObscureMusic();
|
||||
|
||||
mMusicURLEdit->setDrawAsterixes(obscure_music);
|
||||
mMusicURLEdit->setText(parcel->getMusicURL());
|
||||
mMusicURLEdit->setEnabled( can_change_media );
|
||||
}
|
||||
|
|
@ -173,7 +160,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
|
|||
// Extract data from UI
|
||||
BOOL sound_local = self->mCheckSoundLocal->get();
|
||||
std::string music_url = self->mMusicURLEdit->getText();
|
||||
U8 obscure_music = self->mMusicUrlCheck->get();
|
||||
|
||||
BOOL voice_enabled = self->mCheckParcelEnableVoice->get();
|
||||
BOOL voice_estate_chan = !self->mCheckParcelVoiceLocal->get();
|
||||
|
|
@ -186,7 +172,6 @@ void LLPanelLandAudio::onCommitAny(LLUICtrl*, void *userdata)
|
|||
parcel->setParcelFlag(PF_USE_ESTATE_VOICE_CHAN, voice_estate_chan);
|
||||
parcel->setParcelFlag(PF_SOUND_LOCAL, sound_local);
|
||||
parcel->setMusicURL(music_url);
|
||||
parcel->setObscureMusic(obscure_music);
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
|
||||
|
|
|
|||
|
|
@ -68,8 +68,7 @@ LLPanelLandMedia::LLPanelLandMedia(LLParcelSelectionHandle& parcel)
|
|||
mMediaSizeCtrlLabel(NULL),
|
||||
mMediaTextureCtrl(NULL),
|
||||
mMediaAutoScaleCheck(NULL),
|
||||
mMediaLoopCheck(NULL),
|
||||
mMediaUrlCheck(NULL)
|
||||
mMediaLoopCheck(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -94,9 +93,6 @@ BOOL LLPanelLandMedia::postBuild()
|
|||
mMediaLoopCheck = getChild<LLCheckBoxCtrl>("media_loop");
|
||||
childSetCommitCallback("media_loop", onCommitAny, this );
|
||||
|
||||
mMediaUrlCheck = getChild<LLCheckBoxCtrl>("hide_media_url");
|
||||
childSetCommitCallback("hide_media_url", onCommitAny, this );
|
||||
|
||||
mMediaURLEdit = getChild<LLLineEditor>("media_url");
|
||||
childSetCommitCallback("media_url", onCommitAny, this );
|
||||
|
||||
|
|
@ -153,25 +149,6 @@ void LLPanelLandMedia::refresh()
|
|||
mMediaTypeCombo->setEnabled( can_change_media );
|
||||
getChild<LLUICtrl>("mime_type")->setValue(mime_type);
|
||||
|
||||
mMediaUrlCheck->set( parcel->getObscureMedia() );
|
||||
mMediaUrlCheck->setEnabled( can_change_media );
|
||||
|
||||
// don't display urls if you're not able to change it
|
||||
// much requested change in forums so people can't 'steal' urls
|
||||
// NOTE: bug#2009 means this is still vunerable - however, bug
|
||||
// should be closed since this bug opens up major security issues elsewhere.
|
||||
bool obscure_media = ! can_change_media && parcel->getObscureMedia();
|
||||
|
||||
// Special code to disable asterixes for html type
|
||||
if(mime_type == "text/html")
|
||||
{
|
||||
obscure_media = false;
|
||||
mMediaUrlCheck->set( 0 );
|
||||
mMediaUrlCheck->setEnabled( false );
|
||||
}
|
||||
|
||||
mMediaURLEdit->setDrawAsterixes( obscure_media );
|
||||
|
||||
mMediaAutoScaleCheck->set( parcel->getMediaAutoScale () );
|
||||
mMediaAutoScaleCheck->setEnabled ( can_change_media );
|
||||
|
||||
|
|
@ -301,7 +278,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
|
|||
std::string mime_type = self->getChild<LLUICtrl>("mime_type")->getValue().asString();
|
||||
U8 media_auto_scale = self->mMediaAutoScaleCheck->get();
|
||||
U8 media_loop = self->mMediaLoopCheck->get();
|
||||
U8 obscure_media = self->mMediaUrlCheck->get();
|
||||
S32 media_width = (S32)self->mMediaWidthCtrl->get();
|
||||
S32 media_height = (S32)self->mMediaHeightCtrl->get();
|
||||
LLUUID media_id = self->mMediaTextureCtrl->getImageAssetID();
|
||||
|
|
@ -321,7 +297,6 @@ void LLPanelLandMedia::onCommitAny(LLUICtrl*, void *userdata)
|
|||
parcel->setMediaID(media_id);
|
||||
parcel->setMediaAutoScale ( media_auto_scale );
|
||||
parcel->setMediaLoop ( media_loop );
|
||||
parcel->setObscureMedia( obscure_media );
|
||||
|
||||
// Send current parcel data upstream to server
|
||||
LLViewerParcelMgr::getInstance()->sendParcelPropertiesUpdate( parcel );
|
||||
|
|
|
|||
|
|
@ -81,9 +81,6 @@ const S32 MAX_PASSWORD = 16;
|
|||
LLPanelLogin *LLPanelLogin::sInstance = NULL;
|
||||
BOOL LLPanelLogin::sCapslockDidNotification = FALSE;
|
||||
|
||||
// Helper for converting a user name into the canonical "Firstname Lastname" form.
|
||||
// For new accounts without a last name "Resident" is added as a last name.
|
||||
static std::string canonicalize_username(const std::string& name);
|
||||
|
||||
class LLLoginRefreshHandler : public LLCommandHandler
|
||||
{
|
||||
|
|
@ -217,6 +214,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
|||
}
|
||||
updateLocationCombo(false);
|
||||
|
||||
gSavedSettings.getControl("SessionSettingsFile")->getSignal()->connect(boost::bind(&onModeChange));
|
||||
|
||||
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
|
||||
server_choice_combo->setCommitCallback(onSelectServer, NULL);
|
||||
server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
|
||||
|
|
@ -301,14 +300,7 @@ void LLPanelLogin::addFavoritesToStartLocation()
|
|||
for (LLSD::map_const_iterator iter = fav_llsd.beginMap();
|
||||
iter != fav_llsd.endMap(); ++iter)
|
||||
{
|
||||
std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple();
|
||||
|
||||
// The account name in stored_favorites.xml has Resident last name even if user has
|
||||
// a single word account name, so it can be compared case-insensitive with the
|
||||
// user defined "firstname lastname".
|
||||
S32 res = LLStringUtil::compareInsensitive(canonicalize_username(user_defined_name), iter->first);
|
||||
if (res != 0) continue;
|
||||
|
||||
if(iter->first != getChild<LLComboBox>("username_combo")->getSimple()) continue;
|
||||
combo->addSeparator();
|
||||
LLSD user_llsd = iter->second;
|
||||
for (LLSD::array_const_iterator iter1 = user_llsd.beginArray();
|
||||
|
|
@ -1167,27 +1159,25 @@ void LLPanelLogin::updateLoginPanelLinks()
|
|||
sInstance->getChildView("forgot_password_text")->setVisible( system_grid);
|
||||
}
|
||||
|
||||
std::string canonicalize_username(const std::string& name)
|
||||
//static
|
||||
void LLPanelLogin::onModeChange()
|
||||
{
|
||||
std::string cname = name;
|
||||
LLStringUtil::trim(cname);
|
||||
|
||||
// determine if the username is a first/last form or not.
|
||||
size_t separator_index = cname.find_first_of(" ._");
|
||||
std::string first = cname.substr(0, separator_index);
|
||||
std::string last;
|
||||
if (separator_index != cname.npos)
|
||||
{
|
||||
last = cname.substr(separator_index+1, cname.npos);
|
||||
LLStringUtil::trim(last);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ...on Linden grids, single username users as considered to have
|
||||
// last name "Resident"
|
||||
last = "Resident";
|
||||
}
|
||||
|
||||
// Username in traditional "firstname lastname" form.
|
||||
return first + ' ' + last;
|
||||
LLNotificationsUtil::add("ModeChange", LLSD(), LLSD(), boost::bind(&onModeChangeConfirm, _1, _2));
|
||||
}
|
||||
|
||||
//static
|
||||
void LLPanelLogin::onModeChangeConfirm(const LLSD& notification, const LLSD& response)
|
||||
{
|
||||
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
|
||||
switch (option)
|
||||
{
|
||||
case 0:
|
||||
LLAppViewer::instance()->requestQuit();
|
||||
break;
|
||||
case 1:
|
||||
// do nothing
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -98,6 +98,8 @@ private:
|
|||
static void onServerComboLostFocus(LLFocusableElement*);
|
||||
static void updateServerCombo();
|
||||
static void updateStartSLURL();
|
||||
static void onModeChange();
|
||||
static void onModeChangeConfirm(const LLSD& notification, const LLSD& response);
|
||||
|
||||
static void updateLoginPanelLinks();
|
||||
|
||||
|
|
|
|||
|
|
@ -564,16 +564,14 @@ void LLPanelNearByMedia::refreshParcelItems()
|
|||
if (NULL != mParcelMediaItem)
|
||||
{
|
||||
std::string name, url, tooltip;
|
||||
if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia())
|
||||
getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
|
||||
if (name.empty() || name == url)
|
||||
{
|
||||
getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
|
||||
if (name.empty() || name == url)
|
||||
{
|
||||
tooltip = url;
|
||||
}
|
||||
else {
|
||||
tooltip = name + " : " + url;
|
||||
}
|
||||
tooltip = url;
|
||||
}
|
||||
else
|
||||
{
|
||||
tooltip = name + " : " + url;
|
||||
}
|
||||
LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
|
||||
updateListItem(mParcelMediaItem,
|
||||
|
|
@ -611,10 +609,8 @@ void LLPanelNearByMedia::refreshParcelItems()
|
|||
bool is_playing = LLViewerMedia::isParcelAudioPlaying();
|
||||
|
||||
std::string url;
|
||||
if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic())
|
||||
{
|
||||
url = LLViewerMedia::getParcelAudioURL();
|
||||
}
|
||||
url = LLViewerMedia::getParcelAudioURL();
|
||||
|
||||
updateListItem(mParcelAudioItem,
|
||||
mParcelAudioName,
|
||||
url,
|
||||
|
|
|
|||
|
|
@ -384,6 +384,16 @@ private:
|
|||
{
|
||||
lldebugs << "Inventory changed: " << mask << llendl;
|
||||
|
||||
static bool synchronize_friends_folders = true;
|
||||
if (synchronize_friends_folders)
|
||||
{
|
||||
// Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
|
||||
// fetches their contents if needed and synchronizes it with buddies list.
|
||||
// If the folders are not found they are created.
|
||||
LLFriendCardsManager::instance().syncFriendCardsFolders();
|
||||
synchronize_friends_folders = false;
|
||||
}
|
||||
|
||||
// *NOTE: deleting of InventoryItem is performed via moving to Trash.
|
||||
// That means LLInventoryObserver::STRUCTURE is present in MASK instead of LLInventoryObserver::REMOVE
|
||||
if ((CALLINGCARD_ADDED & mask) == CALLINGCARD_ADDED)
|
||||
|
|
@ -750,18 +760,23 @@ void LLPanelPeople::updateFriendList()
|
|||
all_friendsp.clear();
|
||||
online_friendsp.clear();
|
||||
|
||||
LLFriendCardsManager::folderid_buddies_map_t listMap;
|
||||
uuid_vec_t buddies_uuids;
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddies_iter;
|
||||
|
||||
// *NOTE: For now collectFriendsLists returns data only for Friends/All folder. EXT-694.
|
||||
LLFriendCardsManager::instance().collectFriendsLists(listMap);
|
||||
if (listMap.size() > 0)
|
||||
// Fill the avatar list with friends UUIDs
|
||||
for (buddies_iter = all_buddies.begin(); buddies_iter != all_buddies.end(); ++buddies_iter)
|
||||
{
|
||||
lldebugs << "Friends Cards were found, count: " << listMap.begin()->second.size() << llendl;
|
||||
all_friendsp = listMap.begin()->second;
|
||||
buddies_uuids.push_back(buddies_iter->first);
|
||||
}
|
||||
|
||||
if (buddies_uuids.size() > 0)
|
||||
{
|
||||
lldebugs << "Friends added to the list: " << buddies_uuids.size() << llendl;
|
||||
all_friendsp = buddies_uuids;
|
||||
}
|
||||
else
|
||||
{
|
||||
lldebugs << "Friends Cards were not found" << llendl;
|
||||
lldebugs << "No friends found" << llendl;
|
||||
}
|
||||
|
||||
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ static const std::string CLASSIFIED_NAME("classified_name");
|
|||
|
||||
static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
|
||||
|
||||
|
||||
class LLPickHandler : public LLCommandHandler,
|
||||
public LLAvatarPropertiesObserver
|
||||
{
|
||||
|
|
@ -83,6 +84,12 @@ public:
|
|||
bool handle(const LLSD& params, const LLSD& query_map,
|
||||
LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnablePicks"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoPicks", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// handle app/classified/create urls first
|
||||
if (params.size() == 1 && params[0].asString() == "create")
|
||||
{
|
||||
|
|
@ -189,6 +196,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableClassifieds"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoClassifieds", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// handle app/classified/create urls first
|
||||
if (params.size() == 1 && params[0].asString() == "create")
|
||||
{
|
||||
|
|
|
|||
|
|
@ -31,16 +31,27 @@
|
|||
#include "llavataractions.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llpanelpicks.h"
|
||||
#include "lltabcontainer.h"
|
||||
#include "llviewercontrol.h"
|
||||
#include "llviewernetwork.h"
|
||||
|
||||
static const std::string PANEL_PICKS = "panel_picks";
|
||||
static const std::string PANEL_PROFILE = "panel_profile";
|
||||
|
||||
std::string getProfileURL(const std::string& agent_name)
|
||||
{
|
||||
std::string url = gSavedSettings.getString("WebProfileURL");
|
||||
std::string url;
|
||||
|
||||
if (LLGridManager::getInstance()->isInProductionGrid())
|
||||
{
|
||||
url = gSavedSettings.getString("WebProfileURL");
|
||||
}
|
||||
else
|
||||
{
|
||||
url = gSavedSettings.getString("WebProfileNonProductionURL");
|
||||
}
|
||||
LLSD subs;
|
||||
subs["AGENT_NAME"] = agent_name;
|
||||
url = LLWeb::expandURLSubstitutions(url,subs);
|
||||
|
|
@ -105,6 +116,12 @@ public:
|
|||
|
||||
if (verb == "pay")
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarPay"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoAvatarPay", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
LLAvatarActions::pay(avatar_id);
|
||||
return true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
#include "llviewerprecompiledheaders.h"
|
||||
#include "llcommandhandler.h"
|
||||
#include "llavataractions.h"
|
||||
#include "llnotificationsutil.h"
|
||||
#include "llui.h"
|
||||
|
||||
class LLShareWithAvatarHandler : public LLCommandHandler
|
||||
{
|
||||
|
|
@ -38,6 +40,12 @@ public:
|
|||
|
||||
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
|
||||
{
|
||||
if (!LLUI::sSettingGroups["config"]->getBOOL("EnableAvatarShare"))
|
||||
{
|
||||
LLNotificationsUtil::add("NoAvatarShare", LLSD(), LLSD(), std::string("SwitchToStandardSkinAndQuit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
//Make sure we have some parameters
|
||||
if (params.size() == 0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ bool LLSideTray::instanceCreated ()
|
|||
|
||||
class LLSideTrayTab: public LLPanel
|
||||
{
|
||||
LOG_CLASS(LLSideTrayTab);
|
||||
friend class LLUICtrlFactory;
|
||||
friend class LLSideTray;
|
||||
public:
|
||||
|
|
@ -122,6 +123,8 @@ protected:
|
|||
void undock(LLFloater* floater_tab);
|
||||
|
||||
LLSideTray* getSideTray();
|
||||
|
||||
void onFloaterClose(LLSD::Boolean app_quitting);
|
||||
|
||||
public:
|
||||
virtual ~LLSideTrayTab();
|
||||
|
|
@ -140,6 +143,8 @@ public:
|
|||
void onOpen (const LLSD& key);
|
||||
|
||||
void toggleTabDocked();
|
||||
void setDocked(bool dock);
|
||||
bool isDocked() const;
|
||||
|
||||
BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
|
||||
|
||||
|
|
@ -151,6 +156,7 @@ private:
|
|||
std::string mDescription;
|
||||
|
||||
LLView* mMainPanel;
|
||||
boost::signals2::connection mFloaterCloseConn;
|
||||
};
|
||||
|
||||
LLSideTrayTab::LLSideTrayTab(const Params& p)
|
||||
|
|
@ -271,6 +277,35 @@ void LLSideTrayTab::toggleTabDocked()
|
|||
LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
|
||||
}
|
||||
|
||||
// Same as toggleTabDocked() apart from making sure that we do exactly what we want.
|
||||
void LLSideTrayTab::setDocked(bool dock)
|
||||
{
|
||||
if (isDocked() == dock)
|
||||
{
|
||||
llwarns << "Tab " << getName() << " is already " << (dock ? "docked" : "undocked") << llendl;
|
||||
return;
|
||||
}
|
||||
|
||||
toggleTabDocked();
|
||||
}
|
||||
|
||||
bool LLSideTrayTab::isDocked() const
|
||||
{
|
||||
return dynamic_cast<LLSideTray*>(getParent()) != NULL;
|
||||
}
|
||||
|
||||
void LLSideTrayTab::onFloaterClose(LLSD::Boolean app_quitting)
|
||||
{
|
||||
// If user presses Ctrl-Shift-W, handle that gracefully by docking all
|
||||
// undocked tabs before their floaters get destroyed (STORM-1016).
|
||||
|
||||
// Don't dock on quit for the current dock state to be correctly saved.
|
||||
if (app_quitting) return;
|
||||
|
||||
lldebugs << "Forcibly docking tab " << getName() << llendl;
|
||||
setDocked(true);
|
||||
}
|
||||
|
||||
BOOL LLSideTrayTab::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
||||
{
|
||||
// Let children handle the event
|
||||
|
|
@ -294,6 +329,7 @@ void LLSideTrayTab::dock(LLFloater* floater_tab)
|
|||
return;
|
||||
}
|
||||
|
||||
mFloaterCloseConn.disconnect();
|
||||
setRect(side_tray->getLocalRect());
|
||||
reshape(getRect().getWidth(), getRect().getHeight());
|
||||
|
||||
|
|
@ -342,6 +378,7 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
|
|||
}
|
||||
|
||||
floater_tab->addChild(this);
|
||||
mFloaterCloseConn = floater_tab->setCloseCallback(boost::bind(&LLSideTrayTab::onFloaterClose, this, _2));
|
||||
floater_tab->setTitle(mTabTitle);
|
||||
floater_tab->setName(getName());
|
||||
|
||||
|
|
@ -629,8 +666,16 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
|
|||
|
||||
std::string tab_name = tab->getName();
|
||||
|
||||
bool tab_attached = isTabAttached(tab_name);
|
||||
|
||||
if (tab_attached && LLUI::sSettingGroups["config"]->getBOOL("OpenSidePanelsInFloaters"))
|
||||
{
|
||||
tab->toggleTabDocked();
|
||||
tab_attached = false;
|
||||
}
|
||||
|
||||
// Select tab and expand Side Tray only when a tab is attached.
|
||||
if (isTabAttached(tab_name))
|
||||
if (tab_attached)
|
||||
{
|
||||
selectTabByName(tab_name);
|
||||
if (mCollapsed)
|
||||
|
|
@ -641,14 +686,7 @@ LLPanel* LLSideTray::openChildPanel(LLSideTrayTab* tab, const std::string& panel
|
|||
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
|
||||
if (!floater_tab) return NULL;
|
||||
|
||||
// Restore the floater if it was minimized.
|
||||
if (floater_tab->isMinimized())
|
||||
{
|
||||
floater_tab->setMinimized(FALSE);
|
||||
}
|
||||
|
||||
// Send the floater to the front.
|
||||
floater_tab->setFrontmost();
|
||||
floater_tab->openFloater(panel_name);
|
||||
}
|
||||
|
||||
LLSideTrayPanelContainer* container = dynamic_cast<LLSideTrayPanelContainer*>(view->getParent());
|
||||
|
|
@ -979,16 +1017,7 @@ void LLSideTray::reflectCollapseChange()
|
|||
{
|
||||
updateSidetrayVisibility();
|
||||
|
||||
if(mCollapsed)
|
||||
{
|
||||
gFloaterView->setSnapOffsetRight(0);
|
||||
setFocus(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
gFloaterView->setSnapOffsetRight(getRect().getWidth());
|
||||
setFocus(TRUE);
|
||||
}
|
||||
setFocus(!mCollapsed);
|
||||
|
||||
gFloaterView->refresh();
|
||||
}
|
||||
|
|
@ -1161,23 +1190,43 @@ void LLSideTray::reshape(S32 width, S32 height, BOOL called_from_parent)
|
|||
*/
|
||||
LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& params)
|
||||
{
|
||||
LLPanel* new_panel = NULL;
|
||||
|
||||
// Look up the tab in the list of detached tabs.
|
||||
child_vector_const_iter_t child_it;
|
||||
for ( child_it = mDetachedTabs.begin(); child_it != mDetachedTabs.end(); ++child_it)
|
||||
{
|
||||
LLPanel* panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (panel) return panel;
|
||||
}
|
||||
new_panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (new_panel) break;
|
||||
}
|
||||
|
||||
// Look up the tab in the list of attached tabs.
|
||||
for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
|
||||
{
|
||||
LLPanel* panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (panel) return panel;
|
||||
{
|
||||
new_panel = openChildPanel(*child_it, panel_name, params);
|
||||
if (new_panel) break;
|
||||
}
|
||||
return NULL;
|
||||
|
||||
return new_panel;
|
||||
}
|
||||
|
||||
void LLSideTray::hidePanel(const std::string& panel_name)
|
||||
{
|
||||
LLPanel* panelp = getPanel(panel_name);
|
||||
if (panelp)
|
||||
{
|
||||
if(isTabAttached(panel_name))
|
||||
{
|
||||
collapseSideBar();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLFloaterReg::hideInstance("side_bar_tab", panel_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLSideTray::togglePanel(LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params)
|
||||
{
|
||||
if(!sub_panel)
|
||||
|
|
@ -1267,6 +1316,42 @@ bool LLSideTray::isPanelActive(const std::string& panel_name)
|
|||
return (panel->getName() == panel_name);
|
||||
}
|
||||
|
||||
void LLSideTray::setTabDocked(const std::string& tab_name, bool dock)
|
||||
{
|
||||
LLSideTrayTab* tab = getTab(tab_name);
|
||||
if (!tab)
|
||||
{ // not a docked tab, look through detached tabs
|
||||
for(child_vector_iter_t tab_it = mDetachedTabs.begin(), tab_end_it = mDetachedTabs.end();
|
||||
tab_it != tab_end_it;
|
||||
++tab_it)
|
||||
{
|
||||
if ((*tab_it)->getName() == tab_name)
|
||||
{
|
||||
tab = *tab_it;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (tab)
|
||||
{
|
||||
bool tab_attached = isTabAttached(tab_name);
|
||||
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
|
||||
if (!floater_tab) return;
|
||||
|
||||
if (dock && !tab_attached)
|
||||
{
|
||||
tab->dock(floater_tab);
|
||||
}
|
||||
else if (!dock && tab_attached)
|
||||
{
|
||||
tab->undock(floater_tab);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void LLSideTray::updateSidetrayVisibility()
|
||||
{
|
||||
// set visibility of parent container based on collapsed state
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@ public:
|
|||
*/
|
||||
LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
|
||||
|
||||
void hidePanel (const std::string& panel_name);
|
||||
|
||||
/**
|
||||
* Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
|
||||
* If "sub_panel" is not visible Side Tray is opened to display it,
|
||||
|
|
@ -112,6 +114,8 @@ public:
|
|||
LLPanel* getActivePanel ();
|
||||
bool isPanelActive (const std::string& panel_name);
|
||||
|
||||
void setTabDocked(const std::string& tab_name, bool dock);
|
||||
|
||||
/*
|
||||
* get the panel of given type T (don't show it or do anything else with it)
|
||||
*/
|
||||
|
|
@ -215,7 +219,7 @@ private:
|
|||
if (LLSideTray::instanceCreated())
|
||||
LLSideTray::getInstance()->setEnabled(FALSE);
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
LLPanel* mButtonsPanel;
|
||||
typedef std::map<std::string,LLButton*> button_map_t;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1419,22 +1419,21 @@ void LLTextureCache::readHeaderCache()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (num_entries > sCacheMaxEntries)
|
||||
if (num_entries - empty_entries > sCacheMaxEntries)
|
||||
{
|
||||
// Special case: cache size was reduced, need to remove entries
|
||||
// Note: After we prune entries, we will call this again and create the LRU
|
||||
U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
|
||||
U32 entries_to_purge = (num_entries - empty_entries) - sCacheMaxEntries;
|
||||
llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
|
||||
if (entries_to_purge > 0)
|
||||
// We can exit the following loop with the given condition, since if we'd reach the end of the lru set we'd have:
|
||||
// purge_list.size() = lru.size() = num_entries - empty_entries = entries_to_purge + sCacheMaxEntries >= entries_to_purge
|
||||
// So, it's certain that iter will never reach lru.end() first.
|
||||
std::set<lru_data_t>::iterator iter = lru.begin();
|
||||
while (purge_list.size() < entries_to_purge)
|
||||
{
|
||||
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
|
||||
{
|
||||
purge_list.insert(iter->second);
|
||||
if (purge_list.size() >= entries_to_purge)
|
||||
break;
|
||||
}
|
||||
purge_list.insert(iter->second);
|
||||
++iter;
|
||||
}
|
||||
llassert_always(purge_list.size() >= entries_to_purge);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -99,7 +99,6 @@ LLToast::Params::Params()
|
|||
|
||||
LLToast::LLToast(const LLToast::Params& p)
|
||||
: LLModalDialog(LLSD(), p.is_modal),
|
||||
mPanel(p.panel),
|
||||
mToastLifetime(p.lifetime_secs),
|
||||
mToastFadingTime(p.fading_time_secs),
|
||||
mNotificationID(p.notif_id),
|
||||
|
|
@ -108,6 +107,7 @@ LLToast::LLToast(const LLToast::Params& p)
|
|||
mCanBeStored(p.can_be_stored),
|
||||
mHideBtnEnabled(p.enable_hide_btn),
|
||||
mHideBtn(NULL),
|
||||
mPanel(NULL),
|
||||
mNotification(p.notification),
|
||||
mIsHidden(false),
|
||||
mHideBtnPressed(false),
|
||||
|
|
@ -128,9 +128,9 @@ LLToast::LLToast(const LLToast::Params& p)
|
|||
setBackgroundOpaque(TRUE); // *TODO: obsolete
|
||||
updateTransparency();
|
||||
|
||||
if(mPanel)
|
||||
if(p.panel())
|
||||
{
|
||||
insertPanel(mPanel);
|
||||
insertPanel(p.panel);
|
||||
}
|
||||
|
||||
if(mHideBtnEnabled)
|
||||
|
|
@ -309,6 +309,7 @@ void LLToast::reshapeToPanel()
|
|||
|
||||
void LLToast::insertPanel(LLPanel* panel)
|
||||
{
|
||||
mPanel = panel;
|
||||
mWrapperPanel->addChild(panel);
|
||||
reshapeToPanel();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,8 +79,11 @@ static ECursorType cursor_from_parcel_media(U8 click_action);
|
|||
|
||||
LLToolPie::LLToolPie()
|
||||
: LLTool(std::string("Pie")),
|
||||
mGrabMouseButtonDown( FALSE ),
|
||||
mMouseOutsideSlop( FALSE ),
|
||||
mMouseButtonDown( false ),
|
||||
mMouseOutsideSlop( false ),
|
||||
mMouseSteerX(-1),
|
||||
mMouseSteerY(-1),
|
||||
mAbortClickToWalk(false),
|
||||
mClickAction(0),
|
||||
mClickActionBuyEnabled( gSavedSettings.getBOOL("ClickActionBuyEnabled") ),
|
||||
mClickActionPayEnabled( gSavedSettings.getBOOL("ClickActionPayEnabled") )
|
||||
|
|
@ -99,12 +102,17 @@ BOOL LLToolPie::handleAnyMouseClick(S32 x, S32 y, MASK mask, EClickType clicktyp
|
|||
|
||||
BOOL LLToolPie::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
mMouseOutsideSlop = FALSE;
|
||||
mMouseDownX = x;
|
||||
mMouseDownY = y;
|
||||
|
||||
//left mouse down always picks transparent
|
||||
mPick = gViewerWindow->pickImmediate(x, y, TRUE);
|
||||
mPick.mKeyMask = mask;
|
||||
mGrabMouseButtonDown = TRUE;
|
||||
|
||||
mMouseButtonDown = true;
|
||||
|
||||
pickLeftMouseDownCallback();
|
||||
handleLeftClickPick();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -119,7 +127,7 @@ BOOL LLToolPie::handleRightMouseDown(S32 x, S32 y, MASK mask)
|
|||
|
||||
// claim not handled so UI focus stays same
|
||||
|
||||
pickRightMouseDownCallback();
|
||||
handleRightClickPick();
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
@ -136,7 +144,7 @@ BOOL LLToolPie::handleScrollWheel(S32 x, S32 y, S32 clicks)
|
|||
}
|
||||
|
||||
// True if you selected an object.
|
||||
BOOL LLToolPie::pickLeftMouseDownCallback()
|
||||
BOOL LLToolPie::handleLeftClickPick()
|
||||
{
|
||||
S32 x = mPick.mMousePt.mX;
|
||||
S32 y = mPick.mMousePt.mY;
|
||||
|
|
@ -292,7 +300,12 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
}
|
||||
|
||||
// put focus back "in world"
|
||||
gFocusMgr.setKeyboardFocus(NULL);
|
||||
if (gFocusMgr.getKeyboardFocus())
|
||||
{
|
||||
// don't click to walk on attempt to give focus to world
|
||||
mAbortClickToWalk = true;
|
||||
gFocusMgr.setKeyboardFocus(NULL);
|
||||
}
|
||||
|
||||
BOOL touchable = (object && object->flagHandleTouch())
|
||||
|| (parent && parent->flagHandleTouch());
|
||||
|
|
@ -304,6 +317,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
)
|
||||
{
|
||||
gGrabTransientTool = this;
|
||||
mMouseButtonDown = false;
|
||||
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolGrab::getInstance() );
|
||||
return LLToolGrab::getInstance()->handleObjectHit( mPick );
|
||||
}
|
||||
|
|
@ -319,9 +333,9 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
if (!gSavedSettings.getBOOL("LeftClickShowMenu"))
|
||||
{
|
||||
// mouse already released
|
||||
if (!mGrabMouseButtonDown)
|
||||
if (!mMouseButtonDown)
|
||||
{
|
||||
return TRUE;
|
||||
return true;
|
||||
}
|
||||
|
||||
while( object && object->isAttachment() && !object->flagHandleTouch())
|
||||
|
|
@ -333,9 +347,10 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
|
|||
}
|
||||
object = (LLViewerObject*)object->getParent();
|
||||
}
|
||||
if (object && object == gAgentAvatarp)
|
||||
if (object && object == gAgentAvatarp && !gSavedSettings.getBOOL("ClickToWalk"))
|
||||
{
|
||||
// we left clicked on avatar, switch to focus mode
|
||||
mMouseButtonDown = false;
|
||||
LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
|
||||
gViewerWindow->hideCursor();
|
||||
LLToolCamera::getInstance()->setMouseCapture(TRUE);
|
||||
|
|
@ -513,7 +528,28 @@ void LLToolPie::selectionPropertiesReceived()
|
|||
|
||||
BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if (!mMouseOutsideSlop
|
||||
&& mMouseButtonDown
|
||||
&& gSavedSettings.getBOOL("ClickToWalk"))
|
||||
{
|
||||
S32 delta_x = x - mMouseDownX;
|
||||
S32 delta_y = y - mMouseDownY;
|
||||
S32 threshold = gSavedSettings.getS32("DragAndDropDistanceThreshold");
|
||||
if (delta_x * delta_x + delta_y * delta_y > threshold * threshold)
|
||||
{
|
||||
startCameraSteering();
|
||||
}
|
||||
}
|
||||
|
||||
mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
|
||||
|
||||
if (inCameraSteerMode())
|
||||
{
|
||||
steerCameraWithMouse(x, y);
|
||||
gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// perform a separate pick that detects transparent objects since they respond to 1-click actions
|
||||
LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE);
|
||||
|
||||
|
|
@ -584,39 +620,62 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
|
|||
BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
LLViewerObject* obj = mPick.getObject();
|
||||
|
||||
handleMediaMouseUp();
|
||||
|
||||
U8 click_action = final_click_action(obj);
|
||||
if (click_action != CLICK_ACTION_NONE)
|
||||
|
||||
// let media have first pass at click
|
||||
if (handleMediaMouseUp() || LLViewerMediaFocus::getInstance()->getFocus())
|
||||
{
|
||||
switch(click_action)
|
||||
mAbortClickToWalk = true;
|
||||
}
|
||||
stopCameraSteering();
|
||||
mMouseButtonDown = false;
|
||||
|
||||
if (click_action == CLICK_ACTION_NONE // not doing 1-click action
|
||||
&& gSavedSettings.getBOOL("ClickToWalk") // click to walk enabled
|
||||
&& !gAgent.getFlying() // don't auto-navigate while flying until that works
|
||||
&& !mAbortClickToWalk // another behavior hasn't cancelled click to walk
|
||||
&& !mPick.mPosGlobal.isExactlyZero() // valid coordinates for pick
|
||||
&& (mPick.mPickType == LLPickInfo::PICK_LAND // we clicked on land
|
||||
|| mPick.mObjectID.notNull())) // or on an object
|
||||
{
|
||||
// handle special cases of steering picks
|
||||
LLViewerObject* avatar_object = mPick.getObject();
|
||||
|
||||
// get pointer to avatar
|
||||
while (avatar_object && !avatar_object->isAvatar())
|
||||
{
|
||||
// NOTE: mClickActionBuyEnabled flag enables/disables BUY action but setting cursor to default is okay
|
||||
case CLICK_ACTION_BUY:
|
||||
// NOTE: mClickActionPayEnabled flag enables/disables PAY action but setting cursor to default is okay
|
||||
case CLICK_ACTION_PAY:
|
||||
case CLICK_ACTION_OPEN:
|
||||
case CLICK_ACTION_ZOOM:
|
||||
case CLICK_ACTION_PLAY:
|
||||
case CLICK_ACTION_OPEN_MEDIA:
|
||||
// Because these actions open UI dialogs, we won't change
|
||||
// the cursor again until the next hover and GL pick over
|
||||
// the world. Keep the cursor an arrow, assuming that
|
||||
// after the user moves off the UI, they won't be on the
|
||||
// same object anymore.
|
||||
gViewerWindow->setCursor(UI_CURSOR_ARROW);
|
||||
// Make sure the hover-picked object is ignored.
|
||||
//gToolTipView->resetLastHoverObject();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
avatar_object = (LLViewerObject*)avatar_object->getParent();
|
||||
}
|
||||
|
||||
if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
|
||||
{
|
||||
const F64 SELF_CLICK_WALK_DISTANCE = 3.0;
|
||||
// pretend we picked some point a bit in front of avatar
|
||||
mPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * SELF_CLICK_WALK_DISTANCE;
|
||||
}
|
||||
gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
|
||||
if(mAutoPilotDestination) { mAutoPilotDestination->markDead(); }
|
||||
mAutoPilotDestination = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
|
||||
mAutoPilotDestination->setPositionGlobal(mPick.mPosGlobal);
|
||||
mAutoPilotDestination->setPixelSize(5);
|
||||
mAutoPilotDestination->setColor(LLColor4U(50, 50, 200));
|
||||
mAutoPilotDestination->setDuration(3.f);
|
||||
|
||||
handle_go_to();
|
||||
mAbortClickToWalk = false;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
gViewerWindow->setCursor(UI_CURSOR_ARROW);
|
||||
if (hasMouseCapture())
|
||||
{
|
||||
setMouseCapture(FALSE);
|
||||
}
|
||||
|
||||
mGrabMouseButtonDown = FALSE;
|
||||
LLToolMgr::getInstance()->clearTransientTool();
|
||||
gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
|
||||
|
||||
mAbortClickToWalk = false;
|
||||
return LLTool::handleMouseUp(x, y, mask);
|
||||
}
|
||||
|
||||
|
|
@ -936,7 +995,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
|
|||
p.click_callback(boost::bind(showAvatarInspector, hover_object->getID()));
|
||||
p.visible_time_near(6.f);
|
||||
p.visible_time_far(3.f);
|
||||
p.delay_time(0.35f);
|
||||
p.delay_time(gSavedSettings.getF32("AvatarInspectorTooltipDelay"));
|
||||
p.wrap(false);
|
||||
|
||||
LLToolTipMgr::instance().show(p);
|
||||
|
|
@ -1054,7 +1113,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
|
|||
p.click_homepage_callback(boost::bind(VisitHomePage, mHoverPick));
|
||||
p.visible_time_near(6.f);
|
||||
p.visible_time_far(3.f);
|
||||
p.delay_time(0.35f);
|
||||
p.delay_time(gSavedSettings.getF32("ObjectInspectorTooltipDelay"));
|
||||
p.wrap(false);
|
||||
|
||||
LLToolTipMgr::instance().show(p);
|
||||
|
|
@ -1237,6 +1296,10 @@ void LLToolPie::VisitHomePage(const LLPickInfo& info)
|
|||
}
|
||||
}
|
||||
|
||||
void LLToolPie::handleSelect()
|
||||
{
|
||||
mAbortClickToWalk = true;
|
||||
}
|
||||
|
||||
void LLToolPie::handleDeselect()
|
||||
{
|
||||
|
|
@ -1275,10 +1338,20 @@ void LLToolPie::stopEditing()
|
|||
|
||||
void LLToolPie::onMouseCaptureLost()
|
||||
{
|
||||
mMouseOutsideSlop = FALSE;
|
||||
stopCameraSteering();
|
||||
mMouseButtonDown = false;
|
||||
handleMediaMouseUp();
|
||||
}
|
||||
|
||||
void LLToolPie::stopCameraSteering()
|
||||
{
|
||||
mMouseOutsideSlop = false;
|
||||
}
|
||||
|
||||
bool LLToolPie::inCameraSteerMode()
|
||||
{
|
||||
return mMouseButtonDown && mMouseOutsideSlop && gSavedSettings.getBOOL("ClickToWalk");
|
||||
}
|
||||
|
||||
// true if x,y outside small box around start_x,start_y
|
||||
BOOL LLToolPie::outsideSlop(S32 x, S32 y, S32 start_x, S32 start_y)
|
||||
|
|
@ -1444,8 +1517,6 @@ bool LLToolPie::handleMediaMouseUp()
|
|||
|
||||
mMediaMouseCaptureID.setNull();
|
||||
|
||||
setMouseCapture(FALSE);
|
||||
|
||||
result = true;
|
||||
}
|
||||
|
||||
|
|
@ -1508,7 +1579,7 @@ static ECursorType cursor_from_parcel_media(U8 click_action)
|
|||
|
||||
|
||||
// True if we handled the event.
|
||||
BOOL LLToolPie::pickRightMouseDownCallback()
|
||||
BOOL LLToolPie::handleRightClickPick()
|
||||
{
|
||||
S32 x = mPick.mMousePt.mX;
|
||||
S32 y = mPick.mMousePt.mY;
|
||||
|
|
@ -1630,10 +1701,148 @@ BOOL LLToolPie::pickRightMouseDownCallback()
|
|||
|
||||
void LLToolPie::showVisualContextMenuEffect()
|
||||
{
|
||||
// VEFFECT: ShowPie
|
||||
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
|
||||
effectp->setPositionGlobal(mPick.mPosGlobal);
|
||||
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
|
||||
effectp->setDuration(0.25f);
|
||||
|
||||
// VEFFECT: ShowPie
|
||||
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_SPHERE, TRUE);
|
||||
effectp->setPositionGlobal(mPick.mPosGlobal);
|
||||
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
|
||||
effectp->setDuration(0.25f);
|
||||
}
|
||||
|
||||
|
||||
bool intersect_ray_with_sphere( const LLVector3& ray_pt, const LLVector3& ray_dir, const LLVector3& sphere_center, F32 sphere_radius, LLVector3& intersection_pt)
|
||||
{
|
||||
// do ray/sphere intersection by solving quadratic equation
|
||||
LLVector3 sphere_to_ray_start_vec = ray_pt - sphere_center;
|
||||
F32 B = 2.f * ray_dir * sphere_to_ray_start_vec;
|
||||
F32 C = sphere_to_ray_start_vec.lengthSquared() - (sphere_radius * sphere_radius);
|
||||
|
||||
F32 discriminant = B*B - 4.f*C;
|
||||
if (discriminant > 0.f)
|
||||
{ // intersection detected, now find closest one
|
||||
F32 t0 = (-B - sqrtf(discriminant)) / 2.f;
|
||||
if (t0 > 0.f)
|
||||
{
|
||||
intersection_pt = ray_pt + ray_dir * t0;
|
||||
}
|
||||
else
|
||||
{
|
||||
F32 t1 = (-B + sqrtf(discriminant)) / 2.f;
|
||||
intersection_pt = ray_pt + ray_dir * t1;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLToolPie::startCameraSteering()
|
||||
{
|
||||
mMouseOutsideSlop = true;
|
||||
mAbortClickToWalk = true;
|
||||
|
||||
if (gAgentCamera.getFocusOnAvatar())
|
||||
{
|
||||
mSteerPick = mPick;
|
||||
|
||||
// handle special cases of steering picks
|
||||
LLViewerObject* avatar_object = mSteerPick.getObject();
|
||||
|
||||
// get pointer to avatar
|
||||
while (avatar_object && !avatar_object->isAvatar())
|
||||
{
|
||||
avatar_object = (LLViewerObject*)avatar_object->getParent();
|
||||
}
|
||||
|
||||
// if clicking on own avatar...
|
||||
if (avatar_object && ((LLVOAvatar*)avatar_object)->isSelf())
|
||||
{
|
||||
// ...project pick point a few meters in front of avatar
|
||||
mSteerPick.mPosGlobal = gAgent.getPositionGlobal() + LLVector3d(LLViewerCamera::instance().getAtAxis()) * 3.0;
|
||||
}
|
||||
|
||||
if (!mSteerPick.isValid())
|
||||
{
|
||||
mSteerPick.mPosGlobal = gAgent.getPosGlobalFromAgent(
|
||||
LLViewerCamera::instance().getOrigin() + gViewerWindow->mouseDirectionGlobal(mSteerPick.mMousePt.mX, mSteerPick.mMousePt.mY) * 100.f);
|
||||
}
|
||||
|
||||
setMouseCapture(TRUE);
|
||||
|
||||
mMouseSteerX = mMouseDownX;
|
||||
mMouseSteerY = mMouseDownY;
|
||||
const LLVector3 camera_to_rotation_center = gAgent.getFrameAgent().getOrigin() - LLViewerCamera::instance().getOrigin();
|
||||
const LLVector3 rotation_center_to_pick = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal) - gAgent.getFrameAgent().getOrigin();
|
||||
|
||||
mClockwise = camera_to_rotation_center * rotation_center_to_pick < 0.f;
|
||||
if (mMouseSteerGrabPoint) { mMouseSteerGrabPoint->markDead(); }
|
||||
mMouseSteerGrabPoint = (LLHUDEffectBlob *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BLOB, FALSE);
|
||||
mMouseSteerGrabPoint->setPositionGlobal(mSteerPick.mPosGlobal);
|
||||
mMouseSteerGrabPoint->setColor(LLColor4U(50, 50, 200));
|
||||
mMouseSteerGrabPoint->setPixelSize(5);
|
||||
mMouseSteerGrabPoint->setDuration(2.f);
|
||||
}
|
||||
}
|
||||
|
||||
void LLToolPie::steerCameraWithMouse(S32 x, S32 y)
|
||||
{
|
||||
const F32 MIN_ROTATION_RADIUS_FRACTION = 0.2f;
|
||||
|
||||
const LLVector3 pick_pos = gAgent.getPosAgentFromGlobal(mSteerPick.mPosGlobal);
|
||||
const LLVector3 rotation_center = gAgent.getFrameAgent().getOrigin();
|
||||
// FIXME: get this to work with camera tilt (i.e. sitting on a rotating object)
|
||||
const LLVector3 rotation_up_axis(LLVector3::z_axis);
|
||||
|
||||
LLVector3 object_rotation_center = rotation_center + parallel_component(pick_pos - rotation_center, rotation_up_axis);
|
||||
F32 min_rotation_radius = MIN_ROTATION_RADIUS_FRACTION * dist_vec(rotation_center, LLViewerCamera::instance().getOrigin());;
|
||||
F32 pick_distance_from_rotation_center = llclamp(dist_vec(pick_pos, object_rotation_center), min_rotation_radius, F32_MAX);
|
||||
|
||||
LLVector3 mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(x, y), rotation_up_axis);
|
||||
mouse_ray.normalize();
|
||||
|
||||
LLVector3 old_mouse_ray = orthogonal_component(gViewerWindow->mouseDirectionGlobal(mMouseSteerX, mMouseSteerY), rotation_up_axis);
|
||||
old_mouse_ray.normalize();
|
||||
|
||||
LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent();
|
||||
LLVector3 camera_to_rotation_center = object_rotation_center - camera_pos;
|
||||
LLVector3 adjusted_camera_pos = camera_pos + projected_vec(camera_to_rotation_center, rotation_up_axis);
|
||||
LLVector3 rotation_fwd_axis = LLViewerCamera::instance().getAtAxis() - projected_vec(LLViewerCamera::instance().getAtAxis(), rotation_up_axis);
|
||||
rotation_fwd_axis.normalize();
|
||||
F32 pick_dist = dist_vec(pick_pos, adjusted_camera_pos);
|
||||
|
||||
LLVector3 mouse_on_sphere;
|
||||
bool mouse_hit_sphere = intersect_ray_with_sphere(adjusted_camera_pos + (mouse_ray * pick_dist * 1.1f),
|
||||
-1.f * mouse_ray,
|
||||
object_rotation_center,
|
||||
pick_distance_from_rotation_center,
|
||||
mouse_on_sphere);
|
||||
|
||||
LLVector3 old_mouse_on_sphere;
|
||||
intersect_ray_with_sphere(adjusted_camera_pos + (old_mouse_ray * pick_dist * 1.1f),
|
||||
-1.f * old_mouse_ray,
|
||||
object_rotation_center,
|
||||
pick_distance_from_rotation_center,
|
||||
old_mouse_on_sphere);
|
||||
|
||||
if (mouse_hit_sphere)
|
||||
{
|
||||
// calculate rotation frame in screen space
|
||||
LLVector3 screen_rotation_up_axis = orthogonal_component(rotation_up_axis, LLViewerCamera::instance().getAtAxis());
|
||||
screen_rotation_up_axis.normalize();
|
||||
|
||||
LLVector3 screen_rotation_left_axis = screen_rotation_up_axis % LLViewerCamera::instance().getAtAxis();
|
||||
|
||||
LLVector3 rotation_furthest_pt = object_rotation_center + pick_distance_from_rotation_center * rotation_fwd_axis;
|
||||
F32 mouse_lateral_distance = llclamp(((mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f);
|
||||
F32 old_mouse_lateral_distance = llclamp(((old_mouse_on_sphere - rotation_furthest_pt) * screen_rotation_left_axis) / pick_distance_from_rotation_center, -1.f, 1.f);
|
||||
|
||||
F32 yaw_angle = asinf(mouse_lateral_distance);
|
||||
F32 old_yaw_angle = asinf(old_mouse_lateral_distance);
|
||||
|
||||
F32 delta_angle = yaw_angle - old_yaw_angle;
|
||||
if (!mClockwise) delta_angle *= -1.f;
|
||||
|
||||
gAgent.yaw(delta_angle);
|
||||
mMouseSteerX = x;
|
||||
mMouseSteerY = y;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
#include "lltool.h"
|
||||
#include "lluuid.h"
|
||||
#include "llviewerwindow.h" // for LLPickInfo
|
||||
#include "llhudeffectblob.h" // for LLPointer<LLHudEffectBlob>, apparently
|
||||
|
||||
class LLViewerObject;
|
||||
class LLObjectSelection;
|
||||
|
|
@ -56,6 +57,7 @@ public:
|
|||
virtual void stopEditing();
|
||||
|
||||
virtual void onMouseCaptureLost();
|
||||
virtual void handleSelect();
|
||||
virtual void handleDeselect();
|
||||
virtual LLTool* getOverrideTool(MASK mask);
|
||||
|
||||
|
|
@ -75,8 +77,8 @@ public:
|
|||
|
||||
private:
|
||||
BOOL outsideSlop (S32 x, S32 y, S32 start_x, S32 start_y);
|
||||
BOOL pickLeftMouseDownCallback();
|
||||
BOOL pickRightMouseDownCallback();
|
||||
BOOL handleLeftClickPick();
|
||||
BOOL handleRightClickPick();
|
||||
BOOL useClickAction (MASK mask, LLViewerObject* object,LLViewerObject* parent);
|
||||
|
||||
void showVisualContextMenuEffect();
|
||||
|
|
@ -88,12 +90,26 @@ private:
|
|||
BOOL handleTooltipLand(std::string line, std::string tooltip_msg);
|
||||
BOOL handleTooltipObject( LLViewerObject* hover_object, std::string line, std::string tooltip_msg);
|
||||
|
||||
void steerCameraWithMouse(S32 x, S32 y);
|
||||
void startCameraSteering();
|
||||
void stopCameraSteering();
|
||||
bool inCameraSteerMode();
|
||||
|
||||
private:
|
||||
BOOL mGrabMouseButtonDown;
|
||||
BOOL mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
|
||||
bool mMouseButtonDown;
|
||||
bool mMouseOutsideSlop; // for this drag, has mouse moved outside slop region
|
||||
S32 mMouseDownX;
|
||||
S32 mMouseDownY;
|
||||
S32 mMouseSteerX;
|
||||
S32 mMouseSteerY;
|
||||
LLPointer<LLHUDEffectBlob> mAutoPilotDestination;
|
||||
LLPointer<LLHUDEffectBlob> mMouseSteerGrabPoint;
|
||||
bool mClockwise;
|
||||
bool mAbortClickToWalk;
|
||||
LLUUID mMediaMouseCaptureID;
|
||||
LLPickInfo mPick;
|
||||
LLPickInfo mHoverPick;
|
||||
LLPickInfo mSteerPick;
|
||||
LLPointer<LLViewerObject> mClickActionObject;
|
||||
U8 mClickAction;
|
||||
LLSafeHandle<LLObjectSelection> mLeftClickSelection;
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse)
|
|||
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
|
||||
LLURLDispatcherImpl::regionNameCallback,
|
||||
slurl.getSLURLString(),
|
||||
false); // don't teleport
|
||||
LLUI::sSettingGroups["config"]->getBOOL("SLURLTeleportDirectly")); // don't teleport
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -59,6 +59,8 @@
|
|||
#include "lluuid.h"
|
||||
#include "llkeyboard.h"
|
||||
#include "llmutelist.h"
|
||||
#include "llpanelprofile.h"
|
||||
#include "llappviewer.h"
|
||||
//#include "llfirstuse.h"
|
||||
#include "llwindow.h"
|
||||
|
||||
|
|
@ -292,6 +294,43 @@ public:
|
|||
|
||||
};
|
||||
|
||||
class LLViewerMediaWebProfileResponder : public LLHTTPClient::Responder
|
||||
{
|
||||
LOG_CLASS(LLViewerMediaWebProfileResponder);
|
||||
public:
|
||||
LLViewerMediaWebProfileResponder(std::string host)
|
||||
{
|
||||
mHost = host;
|
||||
}
|
||||
|
||||
~LLViewerMediaWebProfileResponder()
|
||||
{
|
||||
}
|
||||
|
||||
/* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
|
||||
{
|
||||
LL_WARNS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
|
||||
LL_WARNS("MediaAuth") << content << LL_ENDL;
|
||||
|
||||
std::string cookie = content["set-cookie"].asString();
|
||||
|
||||
LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost);
|
||||
}
|
||||
|
||||
void completedRaw(
|
||||
U32 status,
|
||||
const std::string& reason,
|
||||
const LLChannelDescriptors& channels,
|
||||
const LLIOPipe::buffer_ptr_t& buffer)
|
||||
{
|
||||
// This is just here to disable the default behavior (attempting to parse the response as llsd).
|
||||
// We don't care about the content of the response, only the set-cookie header.
|
||||
}
|
||||
|
||||
std::string mHost;
|
||||
};
|
||||
|
||||
|
||||
LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
|
||||
LLURL LLViewerMedia::sOpenIDURL;
|
||||
std::string LLViewerMedia::sOpenIDCookie;
|
||||
|
|
@ -1351,6 +1390,19 @@ void LLViewerMedia::setOpenIDCookie()
|
|||
|
||||
// *HACK: Doing this here is nasty, find a better way.
|
||||
LLWebSharing::instance().setOpenIDCookie(sOpenIDCookie);
|
||||
|
||||
// Do a web profile get so we can store the cookie
|
||||
LLSD headers = LLSD::emptyMap();
|
||||
headers["Accept"] = "*/*";
|
||||
headers["Cookie"] = sOpenIDCookie;
|
||||
headers["User-Agent"] = getCurrentUserAgent();
|
||||
|
||||
std::string profile_url = getProfileURL("");
|
||||
LLURL raw_profile_url( profile_url.c_str() );
|
||||
|
||||
LLHTTPClient::get(profile_url,
|
||||
new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()),
|
||||
headers);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1833,17 +1885,12 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
|
|||
media_source->ignore_ssl_cert_errors(true);
|
||||
}
|
||||
|
||||
// NOTE: Removed as per STORM-927 - SSL handshake failed - setting local self-signed certs like this
|
||||
// seems to screw things up big time. For now, devs will need to add these certs locally and Qt will pick them up.
|
||||
// // start by assuming the default CA file will be used
|
||||
// std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "lindenlab.pem" );
|
||||
// // default turned off so pick up the user specified path
|
||||
// if( ! gSavedSettings.getBOOL("BrowserUseDefaultCAFile"))
|
||||
// {
|
||||
// ca_path = gSavedSettings.getString("BrowserCAFilePath");
|
||||
// }
|
||||
// // set the path to the CA.pem file
|
||||
// media_source->addCertificateFilePath( ca_path );
|
||||
// the correct way to deal with certs it to load ours from CA.pem and append them to the ones
|
||||
// Qt/WebKit loads from your system location.
|
||||
// Note: This needs the new CA.pem file with the Equifax Secure Certificate Authority
|
||||
// cert at the bottom: (MIIDIDCCAomgAwIBAgIENd70zzANBg)
|
||||
std::string ca_path = gDirUtilp->getExpandedFilename( LL_PATH_APP_SETTINGS, "CA.pem" );
|
||||
media_source->addCertificateFilePath( ca_path );
|
||||
|
||||
media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort"));
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue