Automated merge with file:///Users/oz/Work/viewer-vs2010

master
Oz Linden 2011-03-18 19:56:37 -04:00
commit 85ccab2d81
594 changed files with 16470 additions and 4442 deletions

View File

@ -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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

45
indra/cmake/FMOD.cmake Normal file → Executable file
View File

@ -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)

View File

@ -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

View File

@ -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})

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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;
}

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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(

View File

@ -12,6 +12,7 @@ include(LLVFS)
include(LLAddBuildTest)
include(Python)
include(Tut)
include(Python)
include_directories (${CMAKE_CURRENT_SOURCE_DIR})

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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();

View File

@ -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 );

View File

@ -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.

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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
{

View File

@ -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;

View File

@ -346,7 +346,7 @@ void LLRadioGroup::setValue( const LLSD& value )
}
else
{
llwarns << "LLRadioGroup::setValue: value not found: " << value.asString() << llendl;
setSelectedIndex(-1, TRUE);
}
}
}

View File

@ -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();
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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.

View File

@ -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();
};

View File

@ -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;
}

View File

@ -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:

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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}
)

View File

@ -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

View File

@ -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

View File

@ -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-----

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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&apos;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>

View File

@ -2979,6 +2979,9 @@ public:
gAgent.setGenderChosen(TRUE);
}
// release avatar picker keyboard focus
gFocusMgr.setKeyboardFocus( NULL );
return true;
}
};

View File

@ -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())

View File

@ -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;

View File

@ -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)
{

View File

@ -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.

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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();

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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");
}

View File

@ -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);
}

View File

@ -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

View File

@ -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)
{

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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()
{
}

View File

@ -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

View File

@ -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;
}

View File

@ -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();

View File

@ -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:

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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);
}

View File

@ -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);

View File

@ -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");
}

View File

@ -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))
{

View File

@ -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 );

View File

@ -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 );

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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,

View File

@ -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();

View File

@ -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")
{

View File

@ -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;
}

View File

@ -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)
{

View File

@ -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

View File

@ -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

View File

@ -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
{

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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