summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/cmake/00-Common.cmake8
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake16
-rw-r--r--indra/cmake/run_build_test.py12
-rw-r--r--indra/llaudio/CMakeLists.txt6
-rw-r--r--indra/llaudio/llaudiodecodemgr.cpp1
-rw-r--r--indra/llcommon/llpreprocessor.h6
-rw-r--r--indra/llcommon/llsingleton.h1
-rw-r--r--indra/llcommon/llsys.cpp132
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp2
-rw-r--r--indra/llplugin/llpluginclassmedia.h2
-rw-r--r--indra/llplugin/llpluginclassmediaowner.h2
-rw-r--r--indra/llplugin/llplugininstance.cpp2
-rw-r--r--indra/llplugin/llplugininstance.h2
-rw-r--r--indra/llplugin/llpluginmessage.cpp2
-rw-r--r--indra/llplugin/llpluginmessage.h2
-rw-r--r--indra/llplugin/llpluginmessageclasses.h2
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp2
-rw-r--r--indra/llplugin/llpluginmessagepipe.h2
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp2
-rw-r--r--indra/llplugin/llpluginprocesschild.h2
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp2
-rw-r--r--indra/llplugin/llpluginprocessparent.h2
-rw-r--r--indra/llplugin/llpluginsharedmemory.cpp2
-rw-r--r--indra/llplugin/llpluginsharedmemory.h2
-rw-r--r--indra/llplugin/slplugin/slplugin.cpp104
-rw-r--r--indra/llui/llbutton.cpp5
-rw-r--r--indra/llui/llbutton.h5
-rw-r--r--indra/llui/llcheckboxctrl.cpp5
-rw-r--r--indra/llui/llcheckboxctrl.h5
-rw-r--r--indra/llui/llflatlistview.cpp23
-rw-r--r--indra/llui/lllineeditor.cpp5
-rw-r--r--indra/llui/lllineeditor.h5
-rw-r--r--indra/llui/llmenugl.cpp9
-rw-r--r--indra/llui/llpanel.cpp5
-rw-r--r--indra/llui/llpanel.h6
-rw-r--r--indra/llui/llprogressbar.cpp9
-rw-r--r--indra/llui/llresizebar.cpp5
-rw-r--r--indra/llui/lltextbase.cpp3
-rw-r--r--indra/llui/lltextbox.cpp7
-rw-r--r--indra/llui/lltextbox.h6
-rw-r--r--indra/llui/lltexteditor.cpp6
-rw-r--r--indra/llui/lltexteditor.h5
-rw-r--r--indra/llui/lltooltip.cpp2
-rw-r--r--indra/llui/lluictrl.cpp30
-rw-r--r--indra/llui/lluictrl.h28
-rw-r--r--indra/llui/lluictrlfactory.cpp1
-rw-r--r--indra/llui/lluictrlfactory.h4
-rw-r--r--indra/llui/llview.cpp9
-rw-r--r--indra/llui/llview.h25
-rw-r--r--indra/media_plugins/base/media_plugin_base.cpp2
-rw-r--r--indra/media_plugins/base/media_plugin_base.h2
-rw-r--r--indra/media_plugins/example/media_plugin_example.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp2
-rw-r--r--indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h2
-rw-r--r--indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp2
-rw-r--r--indra/media_plugins/quicktime/media_plugin_quicktime.cpp2
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp2
-rw-r--r--indra/newview/CMakeLists.txt6
-rw-r--r--indra/newview/app_settings/settings.xml4
-rw-r--r--indra/newview/llagentwearables.cpp57
-rw-r--r--indra/newview/llappviewer.cpp5
-rw-r--r--indra/newview/llavatariconctrl.cpp1
-rw-r--r--indra/newview/llavatarlist.cpp40
-rw-r--r--indra/newview/llavatarlist.h2
-rw-r--r--indra/newview/llavatarlistitem.cpp52
-rw-r--r--indra/newview/llavatarlistitem.h4
-rw-r--r--indra/newview/llbottomtray.cpp4
-rw-r--r--indra/newview/llbottomtray.h6
-rw-r--r--indra/newview/llcallfloater.cpp199
-rw-r--r--indra/newview/llcallfloater.h97
-rw-r--r--indra/newview/llcallingcard.cpp13
-rw-r--r--indra/newview/llchathistory.cpp31
-rw-r--r--indra/newview/llchathistory.h1
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp324
-rw-r--r--indra/newview/llchatitemscontainerctrl.h17
-rw-r--r--indra/newview/llcurrencyuimanager.cpp6
-rw-r--r--indra/newview/lldynamictexture.cpp22
-rw-r--r--indra/newview/llface.cpp10
-rw-r--r--indra/newview/llfavoritesbar.cpp73
-rw-r--r--indra/newview/llfavoritesbar.h6
-rw-r--r--indra/newview/llfloaterabout.cpp4
-rw-r--r--indra/newview/llfloatercamera.cpp25
-rw-r--r--indra/newview/llfloatercamera.h1
-rw-r--r--indra/newview/llfloatergesture.cpp3
-rw-r--r--indra/newview/llfloaterinventory.cpp6
-rw-r--r--indra/newview/llfloatermediasettings.cpp64
-rw-r--r--indra/newview/llfloatermediasettings.h15
-rw-r--r--indra/newview/llfloaterpreference.cpp7
-rw-r--r--indra/newview/llfloatersearch.cpp4
-rw-r--r--indra/newview/llfloaterwhitelistentry.cpp2
-rw-r--r--indra/newview/llgesturemgr.cpp12
-rw-r--r--indra/newview/llgesturemgr.h2
-rw-r--r--indra/newview/llhudicon.cpp18
-rw-r--r--indra/newview/llhudrender.cpp13
-rw-r--r--indra/newview/llimfloater.cpp6
-rw-r--r--indra/newview/llimfloatercontainer.cpp192
-rw-r--r--indra/newview/llimfloatercontainer.h122
-rw-r--r--indra/newview/llimview.cpp74
-rw-r--r--indra/newview/llimview.h6
-rw-r--r--indra/newview/llinventorybridge.cpp2
-rw-r--r--indra/newview/llinventoryobserver.cpp9
-rw-r--r--indra/newview/llinventoryobserver.h3
-rw-r--r--indra/newview/llinventorypanel.h1
-rw-r--r--indra/newview/lllogchat.cpp4
-rw-r--r--indra/newview/llnearbychat.cpp46
-rw-r--r--indra/newview/llnearbychat.h2
-rw-r--r--indra/newview/llnearbychathandler.cpp25
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp2
-rw-r--r--indra/newview/llnotificationhandler.h28
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp129
-rw-r--r--indra/newview/llnotificationofferhandler.cpp24
-rw-r--r--indra/newview/llnotificationscripthandler.cpp10
-rw-r--r--indra/newview/llpanelavatar.cpp73
-rw-r--r--indra/newview/llpanelavatar.h7
-rw-r--r--indra/newview/llpanelgrouproles.cpp34
-rw-r--r--indra/newview/llpanelgrouproles.h1
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp13
-rw-r--r--indra/newview/llpanelimcontrolpanel.h6
-rw-r--r--indra/newview/llpanellandmarks.cpp29
-rw-r--r--indra/newview/llpanellogin.cpp22
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp69
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.h4
-rw-r--r--indra/newview/llpanelmediasettingssecurity.cpp140
-rw-r--r--indra/newview/llpanelmediasettingssecurity.h16
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp5
-rw-r--r--indra/newview/llpaneloutfitsinventory.h4
-rw-r--r--indra/newview/llpanelpeople.cpp67
-rw-r--r--indra/newview/llpanelpeople.h7
-rw-r--r--indra/newview/llpanelpicks.h4
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp71
-rw-r--r--indra/newview/llpanelprimmediacontrols.h8
-rw-r--r--indra/newview/llpanelteleporthistory.cpp53
-rw-r--r--indra/newview/llpanelteleporthistory.h4
-rw-r--r--indra/newview/llparticipantlist.cpp28
-rw-r--r--indra/newview/llparticipantlist.h7
-rw-r--r--indra/newview/llselectmgr.cpp1
-rw-r--r--indra/newview/llselectmgr.h4
-rw-r--r--indra/newview/llsidetray.cpp11
-rw-r--r--indra/newview/llspeakbutton.cpp59
-rw-r--r--indra/newview/llspeakbutton.h6
-rw-r--r--indra/newview/llstartup.cpp25
-rw-r--r--indra/newview/llstatusbar.cpp11
-rw-r--r--indra/newview/llstatusbar.h3
-rw-r--r--indra/newview/lltexlayer.cpp47
-rw-r--r--indra/newview/lltooldraganddrop.cpp359
-rw-r--r--indra/newview/lltooldraganddrop.h27
-rw-r--r--indra/newview/llviewercamera.cpp1
-rw-r--r--indra/newview/llviewercamera.h4
-rw-r--r--indra/newview/llviewerfloaterreg.cpp6
-rw-r--r--indra/newview/llviewermedia.cpp11
-rw-r--r--indra/newview/llviewermediafocus.cpp9
-rw-r--r--indra/newview/llviewermenu.cpp1
-rw-r--r--indra/newview/llviewerobject.cpp9
-rw-r--r--indra/newview/llviewerobject.h1
-rw-r--r--indra/newview/llviewerparceloverlay.cpp3
-rw-r--r--indra/newview/llviewerpartsim.cpp10
-rw-r--r--indra/newview/llvoavatar.cpp45
-rw-r--r--indra/newview/llvoavatar.h2
-rw-r--r--indra/newview/llvoavatarself.cpp6
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llvoicechannel.h10
-rw-r--r--indra/newview/llvoiceclient.cpp6
-rw-r--r--indra/newview/llvoicevisualizer.cpp9
-rw-r--r--indra/newview/llvopartgroup.cpp3
-rw-r--r--indra/newview/llvovolume.cpp9
-rw-r--r--indra/newview/llwearable.cpp2
-rw-r--r--indra/newview/pipeline.cpp33
-rw-r--r--indra/newview/skins/default/colors.xml13
-rw-r--r--indra/newview/skins/default/textures/textures.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_aaa.xml79
-rw-r--r--indra/newview/skins/default/xui/en/floater_animation_preview.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_textbox.xml253
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml31
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml129
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml74
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml50
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_item.xml85
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_general.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_security.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml39
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml1
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml100
-rw-r--r--indra/newview/skins/default/xui/en/widgets/accordion_tab.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml19
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_animation_preview.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_world_map.xml47
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/nl/floater_buy_currency.xml4
-rwxr-xr-xindra/newview/skins/default/xui/pl/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency.xml4
-rwxr-xr-xindra/newview/viewer_manifest.py14
211 files changed, 3185 insertions, 1798 deletions
diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake
index b159092592..1f578eec5f 100644
--- a/indra/cmake/00-Common.cmake
+++ b/indra/cmake/00-Common.cmake
@@ -119,14 +119,14 @@ if (LINUX)
endif (${GXX_VERSION} STREQUAL ${CXX_VERSION})
# Let's actually get a numerical version of gxx's version
- STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION ${CXX_VERSION})
+ STRING(REGEX REPLACE ".* ([0-9])\\.([0-9])\\.([0-9]).*" "\\1\\2\\3" CXX_VERSION_NUMBER ${CXX_VERSION})
- # gcc 4.3 and above don't like the LL boost and also
+ # gcc 4.3 and above don't like the LL boost and also
# cause warnings due to our use of deprecated headers
- if(${CXX_VERSION} GREATER 429)
+ if(${CXX_VERSION_NUMBER} GREATER 429)
add_definitions(-Wno-parentheses)
set(CMAKE_CXX_FLAGS "-Wno-deprecated ${CMAKE_CXX_FLAGS}")
- endif (${CXX_VERSION} GREATER 429)
+ endif (${CXX_VERSION_NUMBER} GREATER 429)
# End of hacks.
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index bbf31f9297..342accad7a 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -19,10 +19,12 @@ if(WINDOWS)
set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
set(vivox_files
SLVoice.exe
- alut.dll
+ libsndfile-1.dll
+ vivoxplatform.dll
vivoxsdk.dll
ortp.dll
- wrap_oal.dll
+ zlib1.dll
+ vivoxoal.dll
)
#*******************************
@@ -139,9 +141,10 @@ elseif(DARWIN)
set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/universal-darwin")
set(vivox_files
SLVoice
- libalut.dylib
- libopenal.dylib
+ libsndfile.dylib
+ libvivoxoal.dylib
libortp.dylib
+ libvivoxplatform.dylib
libvivoxsdk.dylib
)
# *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables
@@ -190,9 +193,10 @@ elseif(LINUX)
set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux")
set(vivox_files
- libalut.so
- libopenal.so.1
+ libsndfile.so.1
libortp.so
+ libvivoxoal.so.1
+ libvivoxplatform.so
libvivoxsdk.so
SLVoice
)
diff --git a/indra/cmake/run_build_test.py b/indra/cmake/run_build_test.py
index fff78ecbe3..0f6967e42a 100644
--- a/indra/cmake/run_build_test.py
+++ b/indra/cmake/run_build_test.py
@@ -64,20 +64,20 @@ def main(command, libpath=[], vars={}):
# might not exist; instead of KeyError, just use an empty string.
dirs = os.environ.get(var, "").split(os.pathsep)
# Append the sequence in libpath
-## print "%s += %r" % (var, libpath)
+ print "%s += %r" % (var, libpath)
dirs.extend(libpath)
# Now rebuild the path string. This way we use a minimum of separators
# -- and we avoid adding a pointless separator when libpath is empty.
os.environ[var] = os.pathsep.join(dirs)
# Now handle arbitrary environment variables. The tricky part is ensuring
# that all the keys and values we try to pass are actually strings.
-## if vars:
-## print "Setting:"
-## for key, value in vars.iteritems():
-## print "%s=%s" % (key, value)
+ if vars:
+ print "Setting:"
+ for key, value in vars.iteritems():
+ print "%s=%s" % (key, value)
os.environ.update(dict([(str(key), str(value)) for key, value in vars.iteritems()]))
# Run the child process.
-## print "Running: %s" % " ".join(command)
+ print "Running: %s" % " ".join(command)
return subprocess.call(command)
if __name__ == "__main__":
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index 9e9e1aaeae..bfa2c34c12 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -31,7 +31,6 @@ set(llaudio_SOURCE_FILES
llaudioengine.cpp
lllistener.cpp
llaudiodecodemgr.cpp
- llvorbisdecode.cpp
llvorbisencode.cpp
)
@@ -41,7 +40,6 @@ set(llaudio_HEADER_FILES
llaudioengine.h
lllistener.h
llaudiodecodemgr.h
- llvorbisdecode.h
llvorbisencode.h
llwindgen.h
)
@@ -60,11 +58,11 @@ if (FMOD)
)
if (LINUX)
- if (${CXX_VERSION} MATCHES "4.[23]")
+ if (${CXX_VERSION_NUMBER} GREATER 419)
set_source_files_properties(llaudioengine_fmod.cpp
llstreamingaudio_fmod.cpp
COMPILE_FLAGS -Wno-write-strings)
- endif (${CXX_VERSION} MATCHES "4.[23]")
+ endif (${CXX_VERSION_NUMBER} GREATER 419)
endif (LINUX)
endif (FMOD)
diff --git a/indra/llaudio/llaudiodecodemgr.cpp b/indra/llaudio/llaudiodecodemgr.cpp
index ae959eaa81..6bbaad9cef 100644
--- a/indra/llaudio/llaudiodecodemgr.cpp
+++ b/indra/llaudio/llaudiodecodemgr.cpp
@@ -33,7 +33,6 @@
#include "llaudiodecodemgr.h"
-#include "llvorbisdecode.h"
#include "llaudioengine.h"
#include "lllfsthread.h"
#include "llvfile.h"
diff --git a/indra/llcommon/llpreprocessor.h b/indra/llcommon/llpreprocessor.h
index da03230b47..5eefa6a16b 100644
--- a/indra/llcommon/llpreprocessor.h
+++ b/indra/llcommon/llpreprocessor.h
@@ -123,13 +123,15 @@
#pragma warning( 3 : 4265 ) // "class has virtual functions, but destructor is not virtual"
#pragma warning( 3 : 4266 ) // 'function' : no override available for virtual member function from base 'type'; function is hidden
#pragma warning (disable : 4180) // qualifier applied to function type has no meaning; ignored
-// Linker optimization with "extern template" generates this innocuous warning
-#pragma warning( disable : 4231 ) // nonstandard extension used : 'extern' before template explicit instantiation
#pragma warning( disable : 4284 ) // silly MS warning deep inside their <map> include file
#pragma warning( disable : 4503 ) // 'decorated name length exceeded, name was truncated'. Does not seem to affect compilation.
#pragma warning( disable : 4800 ) // 'BOOL' : forcing value to bool 'true' or 'false' (performance warning)
#pragma warning( disable : 4996 ) // warning: deprecated
+// Linker optimization with "extern template" generates these warnings
+#pragma warning( disable : 4231 ) // nonstandard extension used : 'extern' before template explicit instantiation
+#pragma warning( disable : 4506 ) // no definition for inline function
+
// level 4 warnings that we need to disable:
#pragma warning (disable : 4100) // unreferenced formal parameter
#pragma warning (disable : 4127) // conditional expression is constant (e.g. while(1) )
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h
index f55fafadd8..ddeb4d1489 100644
--- a/indra/llcommon/llsingleton.h
+++ b/indra/llcommon/llsingleton.h
@@ -35,7 +35,6 @@
#include <typeinfo>
#include <boost/noncopyable.hpp>
-#include <boost/any.hpp>
/// @brief A global registry of all singletons to prevent duplicate allocations
/// across shared library boundaries
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index cba8cf85b0..0272c55db2 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -77,72 +77,72 @@ static const S32 CPUINFO_BUFFER_SIZE = 16383;
LLCPUInfo gSysCPU;
#if LL_WINDOWS
-#ifndef DLLVERSIONINFO
-typedef struct _DllVersionInfo
-{
- DWORD cbSize;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- DWORD dwBuildNumber;
- DWORD dwPlatformID;
-}DLLVERSIONINFO;
-#endif
-
-#ifndef DLLGETVERSIONPROC
-typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
-#endif
-
-bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
-{
- bool result = false;
- const U32 BUFF_SIZE = 32767;
- WCHAR tempBuf[BUFF_SIZE];
- if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
- {
-
- std::basic_string<WCHAR> shell32_path(tempBuf);
-
- // Shell32.dll contains the DLLGetVersion function.
- // according to msdn its not part of the API
- // so you have to go in and get it.
- // http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
- shell32_path += TEXT("\\shell32.dll");
-
- HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL
- if(hDllInst)
- { // Could successfully load the DLL
- DLLGETVERSIONPROC pDllGetVersion;
- /*
- You must get this function explicitly because earlier versions of the DLL
- don't implement this function. That makes the lack of implementation of the
- function a version marker in itself.
- */
- pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
- "DllGetVersion");
-
- if(pDllGetVersion)
- {
- // DLL supports version retrieval function
- DLLVERSIONINFO dvi;
-
- ZeroMemory(&dvi, sizeof(dvi));
- dvi.cbSize = sizeof(dvi);
- HRESULT hr = (*pDllGetVersion)(&dvi);
-
- if(SUCCEEDED(hr))
- { // Finally, the version is at our hands
- major = dvi.dwMajorVersion;
- minor = dvi.dwMinorVersion;
- build_number = dvi.dwBuildNumber;
- result = true;
- }
- }
-
- FreeLibrary(hDllInst); // Release DLL
- }
- }
- return result;
-}
+#ifndef DLLVERSIONINFO
+typedef struct _DllVersionInfo
+{
+ DWORD cbSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformID;
+}DLLVERSIONINFO;
+#endif
+
+#ifndef DLLGETVERSIONPROC
+typedef int (FAR WINAPI *DLLGETVERSIONPROC) (DLLVERSIONINFO *);
+#endif
+
+bool get_shell32_dll_version(DWORD& major, DWORD& minor, DWORD& build_number)
+{
+ bool result = false;
+ const U32 BUFF_SIZE = 32767;
+ WCHAR tempBuf[BUFF_SIZE];
+ if(GetSystemDirectory((LPWSTR)&tempBuf, BUFF_SIZE))
+ {
+
+ std::basic_string<WCHAR> shell32_path(tempBuf);
+
+ // Shell32.dll contains the DLLGetVersion function.
+ // according to msdn its not part of the API
+ // so you have to go in and get it.
+ // http://msdn.microsoft.com/en-us/library/bb776404(VS.85).aspx
+ shell32_path += TEXT("\\shell32.dll");
+
+ HMODULE hDllInst = LoadLibrary(shell32_path.c_str()); //load the DLL
+ if(hDllInst)
+ { // Could successfully load the DLL
+ DLLGETVERSIONPROC pDllGetVersion;
+ /*
+ You must get this function explicitly because earlier versions of the DLL
+ don't implement this function. That makes the lack of implementation of the
+ function a version marker in itself.
+ */
+ pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
+ "DllGetVersion");
+
+ if(pDllGetVersion)
+ {
+ // DLL supports version retrieval function
+ DLLVERSIONINFO dvi;
+
+ ZeroMemory(&dvi, sizeof(dvi));
+ dvi.cbSize = sizeof(dvi);
+ HRESULT hr = (*pDllGetVersion)(&dvi);
+
+ if(SUCCEEDED(hr))
+ { // Finally, the version is at our hands
+ major = dvi.dwMajorVersion;
+ minor = dvi.dwMinorVersion;
+ build_number = dvi.dwBuildNumber;
+ result = true;
+ }
+ }
+
+ FreeLibrary(hDllInst); // Release DLL
+ }
+ }
+ return result;
+}
#endif // LL_WINDOWS
LLOSInfo::LLOSInfo() :
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index c3d8a5aa23..70d770ef7e 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -2,6 +2,7 @@
* @file llpluginclassmedia.cpp
* @brief LLPluginClassMedia handles a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index dcc4a3bd6a..6b64688718 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -2,6 +2,7 @@
* @file llpluginclassmedia.h
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINCLASSMEDIA_H
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index c798af29ca..6d369cd51a 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -2,6 +2,7 @@
* @file llpluginclassmediaowner.h
* @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/indra/llplugin/llplugininstance.cpp b/indra/llplugin/llplugininstance.cpp
index 58fb792d0d..16ba492669 100644
--- a/indra/llplugin/llplugininstance.cpp
+++ b/indra/llplugin/llplugininstance.cpp
@@ -2,6 +2,7 @@
* @file llplugininstance.cpp
* @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llplugininstance.h b/indra/llplugin/llplugininstance.h
index ba569df10c..02936f65fb 100644
--- a/indra/llplugin/llplugininstance.h
+++ b/indra/llplugin/llplugininstance.h
@@ -2,6 +2,7 @@
* @file llplugininstance.h
* @brief LLPluginInstance handles loading the dynamic library of a plugin and setting up its entry points for message passing.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGININSTANCE_H
diff --git a/indra/llplugin/llpluginmessage.cpp b/indra/llplugin/llpluginmessage.cpp
index 32601b47db..34e02c356e 100644
--- a/indra/llplugin/llpluginmessage.cpp
+++ b/indra/llplugin/llpluginmessage.cpp
@@ -2,6 +2,7 @@
* @file llpluginmessage.cpp
* @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginmessage.h b/indra/llplugin/llpluginmessage.h
index 5e93d8b7a1..99f8d1194f 100644
--- a/indra/llplugin/llpluginmessage.h
+++ b/indra/llplugin/llpluginmessage.h
@@ -2,6 +2,7 @@
* @file llpluginmessage.h
* @brief LLPluginMessage encapsulates the serialization/deserialization of messages passed to and from plugins.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGE_H
diff --git a/indra/llplugin/llpluginmessageclasses.h b/indra/llplugin/llpluginmessageclasses.h
index 927fcf2eb2..01fddb92c5 100644
--- a/indra/llplugin/llpluginmessageclasses.h
+++ b/indra/llplugin/llpluginmessageclasses.h
@@ -2,6 +2,7 @@
* @file llpluginmessageclasses.h
* @brief This file defines the versions of existing message classes for LLPluginMessage.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGECLASSES_H
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index 31ea138912..cc193fca42 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -2,6 +2,7 @@
* @file llpluginmessagepipe.cpp
* @brief Classes that implement connections from the plugin system to pipes/pumps.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index 4eb6575bd4..1ddb38de68 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -2,6 +2,7 @@
* @file llpluginmessagepipe.h
* @brief Classes that implement connections from the plugin system to pipes/pumps.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINMESSAGEPIPE_H
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index fc95136d9e..55cf11c620 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -2,6 +2,7 @@
* @file llpluginprocesschild.cpp
* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index 75860bdf0a..f5c57c3d49 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -2,6 +2,7 @@
* @file llpluginprocesschild.h
* @brief LLPluginProcessChild handles the child side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINPROCESSCHILD_H
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index b7ce800c3a..332ce288d7 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -2,6 +2,7 @@
* @file llpluginprocessparent.cpp
* @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 1289e86c13..25669f5d78 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -2,6 +2,7 @@
* @file llpluginprocessparent.h
* @brief LLPluginProcessParent handles the parent side of the external-process plugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/llplugin/llpluginsharedmemory.cpp b/indra/llplugin/llpluginsharedmemory.cpp
index ce8b8e3e09..3c69a69d28 100644
--- a/indra/llplugin/llpluginsharedmemory.cpp
+++ b/indra/llplugin/llpluginsharedmemory.cpp
@@ -2,6 +2,7 @@
* @file llpluginsharedmemory.cpp
* @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/llplugin/llpluginsharedmemory.h b/indra/llplugin/llpluginsharedmemory.h
index a4613b9a54..4014620c52 100644
--- a/indra/llplugin/llpluginsharedmemory.h
+++ b/indra/llplugin/llpluginsharedmemory.h
@@ -2,6 +2,7 @@
* @file llpluginsharedmemory.h
* @brief LLPluginSharedMemory manages a shared memory segment for use by the LLPlugin API.
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef LL_LLPLUGINSHAREDMEMORY_H
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 005e427572..23dc532ba5 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -1,11 +1,13 @@
-/**
+/**
* @file slplugin.cpp
* @brief Loader shell for plugins, intended to be launched by the plugin host application, which directly loads a plugin dynamic library.
*
+ * @cond
+ *
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
- *
+ *
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
* to you under the terms of the GNU General Public License, version 2.0
@@ -13,20 +15,22 @@
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
* online at http://secondlife.com/developers/opensource/gplv2
- *
+ *
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
* online at http://secondlife.com/developers/opensource/flossexception
- *
+ *
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
* and agree to abide by those obligations.
- *
+ *
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ *
+ * @endcond
*/
@@ -48,15 +52,15 @@
/*
On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
-
+
Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
-
+
-sectcreate __TEXT __info_plist /path/to/slplugin_info.plist
-
+
which means adding this to the gcc flags:
-
+
-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
-
+
*/
#if LL_DARWIN || LL_LINUX
@@ -67,7 +71,7 @@ static void crash_handler(int sig)
// TODO: add our own crash reporting
_exit(1);
}
-#endif
+#endif
#if LL_WINDOWS
#include <windows.h>
@@ -80,7 +84,48 @@ LONG WINAPI myWin32ExceptionHandler( struct _EXCEPTION_POINTERS* exception_infop
//std::cerr << "intercepted an unhandled exception and will exit immediately." << std::endl;
// TODO: replace exception handler before we exit?
- return EXCEPTION_EXECUTE_HANDLER;
+ return EXCEPTION_EXECUTE_HANDLER;
+}
+
+// Taken from : http://blog.kalmbachnet.de/?postid=75
+// The MSVC 2005 CRT forces the call of the default-debugger (normally Dr.Watson)
+// even with the other exception handling code. This (terrifying) piece of code
+// patches things so that doesn't happen.
+LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
+ LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
+{
+ return NULL;
+}
+
+BOOL PreventSetUnhandledExceptionFilter()
+{
+// WARNING: This won't work on 64-bit Windows systems so we turn it off it.
+// It should work for any flavor of 32-bit Windows we care about.
+// If it's off, sometimes you will see an OS message when a plugin crashes
+#ifndef _WIN64
+ HMODULE hKernel32 = LoadLibraryA( "kernel32.dll" );
+ if ( NULL == hKernel32 )
+ return FALSE;
+
+ void *pOrgEntry = GetProcAddress( hKernel32, "SetUnhandledExceptionFilter" );
+ if( NULL == pOrgEntry )
+ return FALSE;
+
+ unsigned char newJump[ 100 ];
+ DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
+ dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
+ void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
+ DWORD dwNewEntryAddr = (DWORD) pNewFunc;
+ DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
+
+ newJump[ 0 ] = 0xE9; // JMP absolute
+ memcpy( &newJump[ 1 ], &dwRelativeAddr, sizeof( pNewFunc ) );
+ SIZE_T bytesWritten;
+ BOOL bRet = WriteProcessMemory( GetCurrentProcess(), pOrgEntry, newJump, sizeof( pNewFunc ) + 1, &bytesWritten );
+ return bRet;
+#else
+ return FALSE;
+#endif
}
////////////////////////////////////////////////////////////////////////////////
@@ -91,6 +136,7 @@ void initExceptionHandler()
// save old exception handler in case we need to restore it at the end
prev_filter = SetUnhandledExceptionFilter( myWin32ExceptionHandler );
+ PreventSetUnhandledExceptionFilter();
}
bool checkExceptionHandler()
@@ -99,6 +145,8 @@ bool checkExceptionHandler()
LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
prev_filter = SetUnhandledExceptionFilter(myWin32ExceptionHandler);
+ PreventSetUnhandledExceptionFilter();
+
if (prev_filter != myWin32ExceptionHandler)
{
LL_WARNS("AppInit") << "Our exception handler (" << (void *)myWin32ExceptionHandler << ") replaced with " << prev_filter << "!" << LL_ENDL;
@@ -122,7 +170,7 @@ bool checkExceptionHandler()
}
#endif
-// If this application on Windows platform is a console application, a console is always
+// If this application on Windows platform is a console application, a console is always
// created which is bad. Making it a Windows "application" via CMake settings but not
// adding any code to explicitly create windows does the right thing.
#if LL_WINDOWS
@@ -133,7 +181,7 @@ int main(int argc, char **argv)
{
ll_init_apr();
- // Set up llerror logging
+ // Set up llerror logging
{
LLError::initForApplication(".");
LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -146,14 +194,14 @@ int main(int argc, char **argv)
{
LL_ERRS("slplugin") << "usage: " << "SLPlugin" << " launcher_port" << LL_ENDL;
};
-
+
U32 port = 0;
if(!LLStringUtil::convertToU32(lpCmdLine, port))
{
LL_ERRS("slplugin") << "port number must be numeric" << LL_ENDL;
};
- // Insert our exception handler into the system so this plugin doesn't
+ // Insert our exception handler into the system so this plugin doesn't
// display a crash message if something bad happens. The host app will
// see the missing heartbeat and log appropriately.
initExceptionHandler();
@@ -162,7 +210,7 @@ int main(int argc, char **argv)
{
LL_ERRS("slplugin") << "usage: " << argv[0] << " launcher_port" << LL_ENDL;
}
-
+
U32 port = 0;
if(!LLStringUtil::convertToU32(argv[1], port))
{
@@ -183,17 +231,17 @@ int main(int argc, char **argv)
LLPluginProcessChild *plugin = new LLPluginProcessChild();
plugin->init(port);
-
+
LLTimer timer;
timer.start();
#if LL_WINDOWS
checkExceptionHandler();
#endif
-
+
while(!plugin->isDone())
{
- timer.reset();
+ timer.reset();
plugin->idle();
#if LL_DARWIN
{
@@ -204,7 +252,7 @@ int main(int argc, char **argv)
#endif
F64 elapsed = timer.getElapsedTimeF64();
F64 remaining = plugin->getSleepTime() - elapsed;
-
+
if(remaining <= 0.0f)
{
// We've already used our full allotment.
@@ -217,26 +265,26 @@ int main(int argc, char **argv)
{
// LL_INFOS("slplugin") << "elapsed = " << elapsed * 1000.0f << " ms, remaining = " << remaining * 1000.0f << " ms, sleeping for " << remaining * 1000.0f << " ms" << LL_ENDL;
-// timer.reset();
-
+// timer.reset();
+
// This also services the network as needed.
plugin->sleep(remaining);
-
+
// LL_INFOS("slplugin") << "slept for "<< timer.getElapsedTimeF64() * 1000.0f << " ms" << LL_ENDL;
}
#if LL_WINDOWS
// More agressive checking of interfering exception handlers.
- // Doesn't appear to be required so far - even for plugins
- // that do crash with a single call to the intercept
+ // Doesn't appear to be required so far - even for plugins
+ // that do crash with a single call to the intercept
// exception handler such as QuickTime.
//checkExceptionHandler();
#endif
}
delete plugin;
-
- ll_cleanup_apr();
+
+ ll_cleanup_apr();
return 0;
}
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 617a97b6cf..7721137e29 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -32,6 +32,7 @@
#include "linden_common.h"
+#define LLBUTTON_CPP
#include "llbutton.h"
// Linden library includes
@@ -57,8 +58,8 @@
static LLDefaultChildRegistry::Register<LLButton> r("button");
// Compiler optimization, generate extern template
-//template class LLButton* LLView::getChild<class LLButton>(
-// const std::string& name, BOOL recurse) const;
+template class LLButton* LLView::getChild<class LLButton>(
+ const std::string& name, BOOL recurse) const;
// globals loaded from settings.xml
S32 LLBUTTON_H_PAD = 0;
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 8c3b4bd859..4c7400220d 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -322,5 +322,10 @@ private:
LLFrameTimer mFlashingTimer;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLBUTTON_CPP
+extern template class LLButton* LLView::getChild<class LLButton>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_LLBUTTON_H
diff --git a/indra/llui/llcheckboxctrl.cpp b/indra/llui/llcheckboxctrl.cpp
index 3c5925f965..cd10dfdb1c 100644
--- a/indra/llui/llcheckboxctrl.cpp
+++ b/indra/llui/llcheckboxctrl.cpp
@@ -33,6 +33,7 @@
// The mutants are coming!
#include "linden_common.h"
+#define LLCHECKBOXCTRL_CPP
#include "llcheckboxctrl.h"
#include "llgl.h"
@@ -51,8 +52,8 @@ const U32 MAX_STRING_LENGTH = 10;
static LLDefaultChildRegistry::Register<LLCheckBoxCtrl> r("check_box");
// Compiler optimization, generate extern template
-//template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
-// const std::string& name, BOOL recurse) const;
+template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
+ const std::string& name, BOOL recurse) const;
LLCheckBoxCtrl::Params::Params()
: text_enabled_color("text_enabled_color"),
diff --git a/indra/llui/llcheckboxctrl.h b/indra/llui/llcheckboxctrl.h
index b14e66b915..28d50f957d 100644
--- a/indra/llui/llcheckboxctrl.h
+++ b/indra/llui/llcheckboxctrl.h
@@ -126,5 +126,10 @@ protected:
LLUIColor mTextDisabledColor;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLCHECKBOXCTRL_CPP
+extern template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_LLCHECKBOXCTRL_H
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 8de3a8a96f..ddfb0f8534 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -484,6 +484,8 @@ void LLFlatListView::rearrangeItems()
void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
{
if (!item_pair) return;
+
+ setFocus(TRUE);
bool select_item = !isSelected(item_pair);
@@ -554,12 +556,21 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
break;
}
- if ( key == KEY_UP || key == KEY_DOWN )
+ if ( ( key == KEY_UP || key == KEY_DOWN ) && mSelectedItemPairs.size() )
{
- LLRect selcted_rect = getLastSelectedItemRect().stretch(1);
- LLRect visible_rect = getVisibleContentRect();
- if ( !visible_rect.contains (selcted_rect) )
- scrollToShowRect(selcted_rect);
+ LLRect visible_rc = getVisibleContentRect();
+ LLRect selected_rc = getLastSelectedItemRect();
+
+ if ( !visible_rc.contains (selected_rc) )
+ {
+ // But scroll in Items panel coordinates
+ scrollToShowRect(selected_rc);
+ }
+
+ // In case we are in accordion tab notify parent to show selected rectangle
+ LLRect screen_rc;
+ localRectToScreen(selected_rc, &screen_rc);
+ notifyParent(LLSD().insert("scrollToShowRect",screen_rc.getValue()));
handled = TRUE;
}
@@ -645,8 +656,6 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
onCommit();
}
- setFocus(TRUE);
-
// Stretch selected items rect to ensure it won't be clipped
mSelectedItemsBorder->setRect(getSelectedItemsRect().stretch(-1));
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 1551aab192..8a21155cc3 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -34,6 +34,7 @@
#include "linden_common.h"
+#define LLLINEEDITOR_CPP
#include "lllineeditor.h"
#include "lltexteditor.h"
@@ -72,8 +73,8 @@ const F32 TRIPLE_CLICK_INTERVAL = 0.3f; // delay between double and triple click
static LLDefaultChildRegistry::Register<LLLineEditor> r1("line_editor");
// Compiler optimization, generate extern template
-//template class LLLineEditor* LLView::getChild<class LLLineEditor>(
-// const std::string& name, BOOL recurse) const;
+template class LLLineEditor* LLView::getChild<class LLLineEditor>(
+ const std::string& name, BOOL recurse) const;
//
// Member functions
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index b96220e020..49e9539b16 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -395,5 +395,10 @@ private:
}; // end class LLLineEditor
+// Build time optimization, generate once in .cpp file
+#ifndef LLLINEEDITOR_CPP
+extern template class LLLineEditor* LLView::getChild<class LLLineEditor>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_LINEEDITOR_
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index f8935d03ac..907f2352a0 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -590,12 +590,13 @@ BOOL LLMenuItemSeparatorGL::handleMouseDown(S32 x, S32 y, MASK mask)
LLMenuGL* parent_menu = getMenu();
if (y > getRect().getHeight() / 2)
{
- LLView* prev_menu_item = parent_menu->findPrevSibling(this);
+ // the menu items are in the child list in bottom up order
+ LLView* prev_menu_item = parent_menu->findNextSibling(this);
return prev_menu_item ? prev_menu_item->handleMouseDown(x, prev_menu_item->getRect().getHeight(), mask) : FALSE;
}
else
{
- LLView* next_menu_item = parent_menu->findNextSibling(this);
+ LLView* next_menu_item = parent_menu->findPrevSibling(this);
return next_menu_item ? next_menu_item->handleMouseDown(x, 0, mask) : FALSE;
}
}
@@ -605,12 +606,12 @@ BOOL LLMenuItemSeparatorGL::handleMouseUp(S32 x, S32 y, MASK mask)
LLMenuGL* parent_menu = getMenu();
if (y > getRect().getHeight() / 2)
{
- LLView* prev_menu_item = parent_menu->findPrevSibling(this);
+ LLView* prev_menu_item = parent_menu->findNextSibling(this);
return prev_menu_item ? prev_menu_item->handleMouseUp(x, prev_menu_item->getRect().getHeight(), mask) : FALSE;
}
else
{
- LLView* next_menu_item = parent_menu->findNextSibling(this);
+ LLView* next_menu_item = parent_menu->findPrevSibling(this);
return next_menu_item ? next_menu_item->handleMouseUp(x, 0, mask) : FALSE;
}
}
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index dc5db03a44..750b190953 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -34,6 +34,7 @@
#include "linden_common.h"
+#define LLPANEL_CPP
#include "llpanel.h"
#include "llalertdialog.h"
@@ -59,8 +60,8 @@
static LLDefaultChildRegistry::Register<LLPanel> r1("panel", &LLPanel::fromXML);
// Compiler optimization, generate extern template
-//template class LLPanel* LLView::getChild<class LLPanel>(
-// const std::string& name, BOOL recurse) const;
+template class LLPanel* LLView::getChild<class LLPanel>(
+ const std::string& name, BOOL recurse) const;
LLPanel::LocalizedString::LocalizedString()
: name("name"),
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 0a0fed82fb..a8bd5fd5e5 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -275,4 +275,10 @@ private:
}; // end class LLPanel
+// Build time optimization, generate once in .cpp file
+#ifndef LLPANEL_CPP
+extern template class LLPanel* LLView::getChild<class LLPanel>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif
diff --git a/indra/llui/llprogressbar.cpp b/indra/llui/llprogressbar.cpp
index c8b6e814e1..62ca569e6c 100644
--- a/indra/llui/llprogressbar.cpp
+++ b/indra/llui/llprogressbar.cpp
@@ -72,12 +72,13 @@ LLProgressBar::~LLProgressBar()
void LLProgressBar::draw()
{
static LLTimer timer;
-
- LLUIImagePtr bar_fg_imagep = LLUI::getUIImage("progressbar_fill.tga");
+ F32 alpha = getDrawContext().mAlpha;
- mImageBar->draw(getLocalRect(), mColorBackground.get());
+ LLColor4 image_bar_color = mColorBackground.get();
+ image_bar_color.setAlpha(alpha);
+ mImageBar->draw(getLocalRect(), image_bar_color);
- F32 alpha = 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
+ alpha *= 0.5f + 0.5f*0.5f*(1.f + (F32)sin(3.f*timer.getElapsedTimeF32()));
LLColor4 bar_color = mColorBar.get();
bar_color.mV[VALPHA] *= alpha; // modulate alpha
LLRect progress_rect = getLocalRect();
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index a7cf9be277..0c46edf300 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -144,9 +144,10 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
if( valid_rect.localPointInRect( screen_x, screen_y ) && mResizingView )
{
// undock floater when user resize it
- if (((LLFloater*)getParent())->isDocked())
+ LLFloater* parent = dynamic_cast<LLFloater*>( getParent());
+ if (parent && parent->isDocked())
{
- ((LLFloater*)getParent())->setDocked(false, false);
+ parent->setDocked( false, false);
}
// Resize the parent
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 64164df17f..db16670f79 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2096,7 +2096,8 @@ void LLTextBase::updateRects()
// update document container dimensions according to text contents
LLRect doc_rect = mContentsRect;
// use old mTextRect constraint document to width of viewable region
- doc_rect.mRight = doc_rect.mLeft + mTextRect.getWidth();
+ doc_rect.mLeft = 0;
+ doc_rect.mRight = mTextRect.getWidth();
mDocumentView->setShape(doc_rect);
diff --git a/indra/llui/lltextbox.cpp b/indra/llui/lltextbox.cpp
index 4bd9a32b1d..0bd0ab59fb 100644
--- a/indra/llui/lltextbox.cpp
+++ b/indra/llui/lltextbox.cpp
@@ -31,7 +31,10 @@
*/
#include "linden_common.h"
+
+#define LLTEXTBOX_CPP
#include "lltextbox.h"
+
#include "lluictrlfactory.h"
#include "llfocusmgr.h"
#include "llwindow.h"
@@ -41,8 +44,8 @@
static LLDefaultChildRegistry::Register<LLTextBox> r("text");
// Compiler optimization, generate extern template
-//template class LLTextBox* LLView::getChild<class LLTextBox>(
-// const std::string& name, BOOL recurse) const;
+template class LLTextBox* LLView::getChild<class LLTextBox>(
+ const std::string& name, BOOL recurse) const;
LLTextBox::LLTextBox(const LLTextBox::Params& p)
: LLTextBase(p),
diff --git a/indra/llui/lltextbox.h b/indra/llui/lltextbox.h
index 01b4bfa5ed..3a045534d3 100644
--- a/indra/llui/lltextbox.h
+++ b/indra/llui/lltextbox.h
@@ -79,4 +79,10 @@ protected:
callback_t mClickedCallback;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLTEXTBOX_CPP
+extern template class LLTextBox* LLView::getChild<class LLTextBox>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 6e07a890ad..e68affc36c 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -1,6 +1,5 @@
/**
* @file lltexteditor.cpp
- * @brief LLTextEditor base class
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -34,6 +33,7 @@
#include "linden_common.h"
+#define LLTEXTEDITOR_CPP
#include "lltexteditor.h"
#include "llfontfreetype.h" // for LLFontFreetype::FIRST_CHAR
@@ -74,8 +74,8 @@
static LLDefaultChildRegistry::Register<LLTextEditor> r("simple_text_editor");
// Compiler optimization, generate extern template
-//template class LLTextEditor* LLView::getChild<class LLTextEditor>(
-// const std::string& name, BOOL recurse) const;
+template class LLTextEditor* LLView::getChild<class LLTextEditor>(
+ const std::string& name, BOOL recurse) const;
//
// Constants
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index fb014b86bf..043dda8fa6 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -334,5 +334,10 @@ private:
LLContextMenu* mContextMenu;
}; // end class LLTextEditor
+// Build time optimization, generate once in .cpp file
+#ifndef LLTEXTEDITOR_CPP
+extern template class LLTextEditor* LLView::getChild<class LLTextEditor>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif // LL_TEXTEDITOR_
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index cf135997b2..01c7a81309 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -228,7 +228,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p)
{
LLButton::Params p_button;
p_button.name(std::string("play_media"));
- p_button.label(""); // provid label but set to empty so name does not overwrite it -angela
+ p_button.label(""); // provide label but set to empty so name does not overwrite it -angela
TOOLTIP_PLAYBUTTON_SIZE = 16;
LLRect button_rect;
button_rect.setOriginAndSize((mPadding +TOOLTIP_ICON_SIZE+ mPadding ), mPadding, TOOLTIP_ICON_SIZE, TOOLTIP_ICON_SIZE);
diff --git a/indra/llui/lluictrl.cpp b/indra/llui/lluictrl.cpp
index 3cf592f351..706712ec5e 100644
--- a/indra/llui/lluictrl.cpp
+++ b/indra/llui/lluictrl.cpp
@@ -31,9 +31,11 @@
* $/LicenseInfo$
*/
-//#include "llviewerprecompiledheaders.h"
#include "linden_common.h"
+
+#define LLUICTRL_CPP
#include "lluictrl.h"
+
#include "llfocusmgr.h"
#include "llpanel.h"
#include "lluictrlfactory.h"
@@ -41,8 +43,30 @@
static LLDefaultChildRegistry::Register<LLUICtrl> r("ui_ctrl");
// Compiler optimization, generate extern template
-//template class LLUICtrl* LLView::getChild<class LLUICtrl>(
-// const std::string& name, BOOL recurse) const;
+template class LLUICtrl* LLView::getChild<class LLUICtrl>(
+ const std::string& name, BOOL recurse) const;
+
+LLUICtrl::CallbackParam::CallbackParam()
+: name("name"),
+ function_name("function"),
+ parameter("parameter"),
+ control_name("control") // Shortcut to control -> "control_name" for backwards compatability
+{
+ addSynonym(parameter, "userdata");
+}
+
+LLUICtrl::EnableControls::EnableControls()
+: enabled("enabled_control"),
+ disabled("disabled_control")
+{}
+
+LLUICtrl::ControlVisibility::ControlVisibility()
+: visible("visibility_control"),
+ invisible("invisibility_control")
+{
+ addSynonym(visible, "visiblity_control");
+ addSynonym(invisible, "invisiblity_control");
+}
LLUICtrl::Params::Params()
: tab_stop("tab_stop", true),
diff --git a/indra/llui/lluictrl.h b/indra/llui/lluictrl.h
index aef1bcd519..b20ff5d798 100644
--- a/indra/llui/lluictrl.h
+++ b/indra/llui/lluictrl.h
@@ -75,14 +75,7 @@ public:
Optional<std::string> control_name;
- CallbackParam()
- : name("name"),
- function_name("function"),
- parameter("parameter"),
- control_name("control") // Shortcut to control -> "control_name" for backwards compatability
- {
- addSynonym(parameter, "userdata");
- }
+ CallbackParam();
};
struct CommitCallbackParam : public LLInitParam::Block<CommitCallbackParam, CallbackParam >
@@ -105,23 +98,14 @@ public:
Alternative<std::string> enabled;
Alternative<std::string> disabled;
- EnableControls()
- : enabled("enabled_control"),
- disabled("disabled_control")
- {}
+ EnableControls();
};
struct ControlVisibility : public LLInitParam::Choice<ControlVisibility>
{
Alternative<std::string> visible;
Alternative<std::string> invisible;
- ControlVisibility()
- : visible("visibility_control"),
- invisible("invisibility_control")
- {
- addSynonym(visible, "visiblity_control");
- addSynonym(invisible, "invisiblity_control");
- }
+ ControlVisibility();
};
struct Params : public LLInitParam::Block<Params, LLView::Params>
{
@@ -328,4 +312,10 @@ private:
class DefaultTabGroupFirstSorter;
};
+// Build time optimization, generate once in .cpp file
+#ifndef LLUICTRL_CPP
+extern template class LLUICtrl* LLView::getChild<class LLUICtrl>(
+ const std::string& name, BOOL recurse) const;
+#endif
+
#endif // LL_LLUICTRL_H
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 49182be328..3643bf44f7 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -32,6 +32,7 @@
#include "linden_common.h"
+#define LLUICTRLFACTORY_CPP
#include "lluictrlfactory.h"
#include "llxmlnode.h"
diff --git a/indra/llui/lluictrlfactory.h b/indra/llui/lluictrlfactory.h
index e021c04ad6..55d7d745eb 100644
--- a/indra/llui/lluictrlfactory.h
+++ b/indra/llui/lluictrlfactory.h
@@ -109,7 +109,9 @@ extern LLFastTimer::DeclareTimer FTM_WIDGET_CONSTRUCTION;
extern LLFastTimer::DeclareTimer FTM_INIT_FROM_PARAMS;
// Build time optimization, generate this once in .cpp file
-//extern template class LLUICtrlFactory* LLSingleton<class LLUICtrlFactory>::getInstance();
+#ifndef LLUICTRLFACTORY_CPP
+extern template class LLUICtrlFactory* LLSingleton<class LLUICtrlFactory>::getInstance();
+#endif
class LLUICtrlFactory : public LLSingleton<LLUICtrlFactory>
{
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index ef23268a14..23e4131e6d 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -33,6 +33,7 @@
#include "linden_common.h"
+#define LLVIEW_CPP
#include "llview.h"
#include <cassert>
@@ -77,10 +78,16 @@ BOOL LLView::sIsDrawing = FALSE;
#endif
// Compiler optimization, generate extern template
-//template class LLView* LLView::getChild<class LLView>(const std::string& name, BOOL recurse) const;
+template class LLView* LLView::getChild<class LLView>(
+ const std::string& name, BOOL recurse) const;
static LLDefaultChildRegistry::Register<LLView> r("view");
+LLView::Follows::Follows()
+: string(""),
+ flags("flags", FOLLOWS_LEFT | FOLLOWS_TOP)
+{}
+
LLView::Params::Params()
: name("name", std::string("unnamed")),
enabled("enabled", true),
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index 1b12e78509..d485244a05 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -111,10 +111,7 @@ public:
Alternative<std::string> string;
Alternative<U32> flags;
- Follows()
- : string(""),
- flags("flags", FOLLOWS_LEFT | FOLLOWS_TOP)
- {}
+ Follows();
};
struct Params : public LLInitParam::Block<Params>
@@ -661,21 +658,9 @@ template <class T> T* LLView::getChild(const std::string& name, BOOL recurse) co
// Compiler optimization - don't generate these specializations inline,
// require explicit specialization. See llbutton.cpp for an example.
-//extern template class LLButton* LLView::getChild<class LLButton>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLCheckBoxCtrl* LLView::getChild<class LLCheckBoxCtrl>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLLineEditor* LLView::getChild<class LLLineEditor>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLPanel* LLView::getChild<class LLPanel>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLTextBox* LLView::getChild<class LLTextBox>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLTextEditor* LLView::getChild<class LLTextEditor>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLUICtrl* LLView::getChild<class LLUICtrl>(
-// const std::string& name, BOOL recurse) const;
-//extern template class LLView* LLView::getChild<class LLView>(
-// const std::string& name, BOOL recurse) const;
+#ifndef LLVIEW_CPP
+extern template class LLView* LLView::getChild<class LLView>(
+ const std::string& name, BOOL recurse) const;
+#endif
#endif //LL_LLVIEW_H
diff --git a/indra/media_plugins/base/media_plugin_base.cpp b/indra/media_plugins/base/media_plugin_base.cpp
index 6acac07423..8c8fa24a65 100644
--- a/indra/media_plugins/base/media_plugin_base.cpp
+++ b/indra/media_plugins/base/media_plugin_base.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_base.cpp
* @brief Media plugin base class for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/base/media_plugin_base.h b/indra/media_plugins/base/media_plugin_base.h
index f1e96335f9..4dd157a07c 100644
--- a/indra/media_plugins/base/media_plugin_base.h
+++ b/indra/media_plugins/base/media_plugin_base.h
@@ -2,6 +2,7 @@
* @file media_plugin_base.h
* @brief Media plugin base class for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
index 99e0199a29..f5b077fea0 100644
--- a/indra/media_plugins/example/media_plugin_example.cpp
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_example.cpp
* @brief Example plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
index ef41736c18..48accd3e66 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer.h
@@ -3,6 +3,7 @@
* @author Tofu Linden
* @brief implementation that supports media playback via GStreamer.
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -29,6 +30,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
// header guard
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
index cc52232496..52cea46d46 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.cpp
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamer_syms.cpp
* @brief dynamic GStreamer symbol-grabbing code
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
index ee7473d6d1..88f100af6e 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamer_syms.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamer_syms.h
* @brief dynamic GStreamer symbol-grabbing code
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
index e31d4a3282..2244ccc146 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamertriviallogging.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamertriviallogging.h
* @brief minimal logging utilities.
*
+ * @cond
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
* Copyright (c) 2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef __LLMEDIAIMPLGSTREAMERTRIVIALLOGGING_H__
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
index d8ccfaa702..5bb0ef5a99 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.cpp
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamervidplug.h
* @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#if LL_GSTREAMER010_ENABLED
diff --git a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
index f6d55b8758..208523e8d0 100644
--- a/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
+++ b/indra/media_plugins/gstreamer010/llmediaimplgstreamervidplug.h
@@ -2,6 +2,7 @@
* @file llmediaimplgstreamervidplug.h
* @brief Video-consuming static GStreamer plugin for gst-to-LLMediaImpl
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007-2009, Linden Research, Inc.
@@ -28,6 +29,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#ifndef __GST_SLVIDEO_H__
diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index a4c43988ba..d21ff26f83 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_gstreamer010.cpp
* @brief GStreamer-0.10 plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
* Copyright (c) 2007, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index 236f79978d..dbc44c8334 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_quicktime.cpp
* @brief QuickTime plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "linden_common.h"
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index 09348782a4..30c7483229 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -2,6 +2,7 @@
* @file media_plugin_webkit.cpp
* @brief Webkit plugin for LLMedia API plugin system
*
+ * @cond
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
* Copyright (c) 2008, Linden Research, Inc.
@@ -27,6 +28,7 @@
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
+ * @endcond
*/
#include "llqtwebkit.h"
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index fc6955bc70..73240cebbb 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -90,6 +90,7 @@ set(viewer_SOURCE_FILES
llbox.cpp
llbreadcrumbview.cpp
llcallbacklist.cpp
+ llcallfloater.cpp
llcallingcard.cpp
llcapabilitylistener.cpp
llcaphttpsender.cpp
@@ -185,7 +186,7 @@ set(viewer_SOURCE_FILES
llfloatermediasettings.cpp
llfloatermemleak.cpp
llfloaternamedesc.cpp
- llfloaternearbymedia.cpp
+ llfloaternearbymedia.cpp
llfloaternotificationsconsole.cpp
llfloateropenobject.cpp
llfloaterparcel.cpp
@@ -212,6 +213,7 @@ set(viewer_SOURCE_FILES
llfloaterurldisplay.cpp
llfloaterurlentry.cpp
llfloatervoicedevicesettings.cpp
+ llfloatervolumepulldown.cpp
llfloaterwater.cpp
llfloaterwhitelistentry.cpp
llfloaterwindlight.cpp
@@ -291,6 +293,7 @@ set(viewer_SOURCE_FILES
llnetmap.cpp
llnotificationalerthandler.cpp
llnotificationgrouphandler.cpp
+ llnotificationhandlerutil.cpp
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
@@ -588,6 +591,7 @@ set(viewer_HEADER_FILES
llbox.h
llbreadcrumbview.h
llcallbacklist.h
+ llcallfloater.h
llcallingcard.h
llcapabilitylistener.h
llcapabilityprovider.h
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index b0f782622c..e69adad190 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -9260,7 +9260,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>3</integer>
+ <integer>4</integer>
</map>
<key>UIMaxComboWidth</key>
<map>
@@ -9722,7 +9722,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>8</integer>
+ <integer>11</integer>
</map>
<key>UISpinctrlBtnWidth</key>
<map>
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 18a8396451..b52b58f9e2 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -50,6 +50,10 @@
#include "llgesturemgr.h"
#include "llappearancemgr.h"
#include "lltexlayer.h"
+#include "llsidetray.h"
+#include "llpaneloutfitsinventory.h"
+#include "llfolderview.h"
+#include "llaccordionctrltab.h"
#include <boost/scoped_ptr.hpp>
@@ -409,7 +413,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
return;
}
- gAgent.getAvatarObject()->wearableUpdated( type );
+ gAgent.getAvatarObject()->wearableUpdated( type, TRUE );
if (send_update)
{
@@ -699,7 +703,7 @@ U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearabl
void LLAgentWearables::wearableUpdated(LLWearable *wearable)
{
- mAvatarObject->wearableUpdated(wearable->getType());
+ mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
wearable->setLabelUpdated();
// Hack pt 2. If the wearable we just loaded has definition version 24,
@@ -740,7 +744,7 @@ void LLAgentWearables::popWearable(const EWearableType type, U32 index)
if (wearable)
{
mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
- mAvatarObject->wearableUpdated(wearable->getType());
+ mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
wearable->setLabelUpdated();
}
}
@@ -1296,6 +1300,41 @@ void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
}
}
+class LLAutoRenameFolder: public LLInventoryCallback
+{
+public:
+ LLAutoRenameFolder(LLUUID& folder_id):
+ mFolderID(folder_id)
+ {
+ }
+
+ virtual ~LLAutoRenameFolder()
+ {
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ LLPanelOutfitsInventory *outfit_panel =
+ dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ if (outfit_panel)
+ {
+ outfit_panel->getRootFolder()->clearSelection();
+ outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
+ outfit_panel->getRootFolder()->setNeedsAutoRename(TRUE);
+ }
+ LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0;
+ if (tab_outfits && !tab_outfits->getDisplayChildren())
+ {
+ tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren());
+ }
+ }
+
+ virtual void fire(const LLUUID&)
+ {
+ }
+
+private:
+ LLUUID mFolderID;
+};
+
LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
{
if (mAvatarObject.isNull())
@@ -1310,17 +1349,9 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
LLFolderType::FT_OUTFIT,
new_folder_name);
- LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL);
+ LLPointer<LLInventoryCallback> cb = new LLAutoRenameFolder(folder_id);
+ LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb);
-#if 0 // BAP - fix to go into rename state automatically after outfit is created.
- LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id);
- if (parent_category)
- {
- parent_category->setSelectionByID(folder_id,TRUE);
- parent_category->setNeedsAutoRename(TRUE);
- }
-#endif
-
return folder_id;
}
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index f196ebbf93..eb08707b61 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -907,6 +907,7 @@ static LLFastTimer::DeclareTimer FTM_SLEEP("Sleep");
static LLFastTimer::DeclareTimer FTM_TEXTURE_CACHE("Texture Cache");
static LLFastTimer::DeclareTimer FTM_DECODE("Image Decode");
static LLFastTimer::DeclareTimer FTM_VFS("VFS Thread");
+static LLFastTimer::DeclareTimer FTM_LFS("LFS Thread");
static LLFastTimer::DeclareTimer FTM_PAUSE_THREADS("Pause Threads");
static LLFastTimer::DeclareTimer FTM_IDLE("Idle");
static LLFastTimer::DeclareTimer FTM_PUMP("Pump");
@@ -1123,6 +1124,10 @@ bool LLAppViewer::mainLoop()
LLFastTimer ftm(FTM_VFS);
io_pending += LLVFSThread::updateClass(1);
}
+ {
+ LLFastTimer ftm(FTM_LFS);
+ io_pending += LLLFSThread::updateClass(1);
+ }
if (io_pending > 1000)
{
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 327d80ba34..8f3eba98a6 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -234,6 +234,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
// Check if cache already contains image_id for that avatar
if (!updateFromCache())
{
+ LLIconCtrl::setValue(mDefaultIconName);
app->addObserver(mAvatarId, this);
app->sendAvatarPropertiesRequest(mAvatarId);
}
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index bb03f47f46..202fbdebd4 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -153,6 +153,13 @@ void LLAvatarList::draw()
}
}
+//virtual
+void LLAvatarList::clear()
+{
+ getIDs().clear();
+ setDirty(true);
+}
+
void LLAvatarList::setNameFilter(const std::string& filter)
{
if (mNameFilter != filter)
@@ -363,37 +370,6 @@ void LLAvatarList::computeDifference(
vadded.erase(it, vadded.end());
}
-static std::string format_secs(S32 secs)
-{
- // *TODO: reinventing the wheel?
- // *TODO: i18n
- static const int LL_AL_MIN = 60;
- static const int LL_AL_HOUR = LL_AL_MIN * 60;
- static const int LL_AL_DAY = LL_AL_HOUR * 24;
- static const int LL_AL_WEEK = LL_AL_DAY * 7;
- static const int LL_AL_MONTH = LL_AL_DAY * 31;
- static const int LL_AL_YEAR = LL_AL_DAY * 365;
-
- std::string s;
-
- if (secs >= LL_AL_YEAR)
- s = llformat("%dy", secs / LL_AL_YEAR);
- else if (secs >= LL_AL_MONTH)
- s = llformat("%dmon", secs / LL_AL_MONTH);
- else if (secs >= LL_AL_WEEK)
- s = llformat("%dw", secs / LL_AL_WEEK);
- else if (secs >= LL_AL_DAY)
- s = llformat("%dd", secs / LL_AL_DAY);
- else if (secs >= LL_AL_HOUR)
- s = llformat("%dh", secs / LL_AL_HOUR);
- else if (secs >= LL_AL_MIN)
- s = llformat("%dm", secs / LL_AL_MIN);
- else
- s = llformat("%ds", secs);
-
- return s;
-}
-
// Refresh shown time of our last interaction with all listed avatars.
void LLAvatarList::updateLastInteractionTimes()
{
@@ -407,7 +383,7 @@ void LLAvatarList::updateLastInteractionTimes()
LLAvatarListItem* item = static_cast<LLAvatarListItem*>(*it);
S32 secs_since = now - (S32) LLRecentPeople::instance().getDate(item->getAvatarId()).secondsSinceEpoch();
if (secs_since >= 0)
- item->setLastInteractionTime(format_secs(secs_since));
+ item->setLastInteractionTime(secs_since);
}
}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 490f93e501..9058fec540 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -70,6 +70,8 @@ public:
virtual void draw(); // from LLView
+ virtual void clear();
+
void setNameFilter(const std::string& filter);
void setDirty(bool val = true) { mDirty = val; }
uuid_vector_t& getIDs() { return mIDs; }
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index c670a65bcc..efc9538fa6 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -198,9 +198,9 @@ void LLAvatarListItem::showLastInteractionTime(bool show)
mAvatarName->setRect(name_rect);
}
-void LLAvatarListItem::setLastInteractionTime(const std::string& val)
+void LLAvatarListItem::setLastInteractionTime(U32 secs_since)
{
- mLastInteractionTime->setValue(val);
+ mLastInteractionTime->setValue(formatSeconds(secs_since));
}
void LLAvatarListItem::setShowInfoBtn(bool show)
@@ -326,3 +326,51 @@ void LLAvatarListItem::reshapeAvatarName()
mAvatarName->reshape(width, height);
}
+
+// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
+// taking i18n into account. The format string to use is taken from the panel XML.
+std::string LLAvatarListItem::formatSeconds(U32 secs)
+{
+ static const U32 LL_ALI_MIN = 60;
+ static const U32 LL_ALI_HOUR = LL_ALI_MIN * 60;
+ static const U32 LL_ALI_DAY = LL_ALI_HOUR * 24;
+ static const U32 LL_ALI_WEEK = LL_ALI_DAY * 7;
+ static const U32 LL_ALI_MONTH = LL_ALI_DAY * 30;
+ static const U32 LL_ALI_YEAR = LL_ALI_DAY * 365;
+
+ std::string fmt;
+ U32 count = 0;
+
+ if (secs >= LL_ALI_YEAR)
+ {
+ fmt = "FormatYears"; count = secs / LL_ALI_YEAR;
+ }
+ else if (secs >= LL_ALI_MONTH)
+ {
+ fmt = "FormatMonths"; count = secs / LL_ALI_MONTH;
+ }
+ else if (secs >= LL_ALI_WEEK)
+ {
+ fmt = "FormatWeeks"; count = secs / LL_ALI_WEEK;
+ }
+ else if (secs >= LL_ALI_DAY)
+ {
+ fmt = "FormatDays"; count = secs / LL_ALI_DAY;
+ }
+ else if (secs >= LL_ALI_HOUR)
+ {
+ fmt = "FormatHours"; count = secs / LL_ALI_HOUR;
+ }
+ else if (secs >= LL_ALI_MIN)
+ {
+ fmt = "FormatMinutes"; count = secs / LL_ALI_MIN;
+ }
+ else
+ {
+ fmt = "FormatSeconds"; count = secs;
+ }
+
+ LLStringUtil::format_map_t args;
+ args["[COUNT]"] = llformat("%u", count);
+ return getString(fmt, args);
+}
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 9d48101a44..341f5a6bcf 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -63,7 +63,7 @@ public:
void setOnline(bool online);
void setName(const std::string& name);
void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
- void setLastInteractionTime(const std::string& val);
+ void setLastInteractionTime(U32 secs_since);
//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
void setShowProfileBtn(bool show);
void setShowInfoBtn(bool show);
@@ -94,6 +94,8 @@ private:
void onNameCache(const std::string& first_name, const std::string& last_name);
+ std::string formatSeconds(U32 secs);
+
LLAvatarIconCtrl* mAvatarIcon;
LLTextBox* mAvatarName;
LLTextBox* mLastInteractionTime;
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 4823932951..c44b0b5331 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -31,6 +31,8 @@
*/
#include "llviewerprecompiledheaders.h" // must be first include
+
+#define LLBOTTOMTRAY_CPP
#include "llbottomtray.h"
#include "llagent.h"
@@ -46,7 +48,7 @@
#include "llsyswellwindow.h"
#include "llfloatercamera.h"
-// Build time optimization, generate this once in .cpp file
+// Build time optimization, generate extern template once in .cpp file
template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
LLBottomTray::LLBottomTray(const LLSD&)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 30f5f88cce..728a420324 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -47,8 +47,10 @@ class LLSpeakButton;
class LLNearbyChatBar;
class LLIMChiclet;
-// Build time optimization, generate this once in .cpp file
-//extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
+// Build time optimization, generate once in .cpp file
+#ifndef LLBOTTOMTRAY_CPP
+extern template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
+#endif
class LLBottomTray
: public LLSingleton<LLBottomTray>
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
new file mode 100644
index 0000000000..1b929eca0e
--- /dev/null
+++ b/indra/newview/llcallfloater.cpp
@@ -0,0 +1,199 @@
+/**
+ * @file llcallfloater.cpp
+ * @author Mike Antipov
+ * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcallfloater.h"
+
+#include "llagentdata.h" // for gAgentID
+#include "llavatarlist.h"
+#include "llbottomtray.h"
+#include "llparticipantlist.h"
+#include "llspeakers.h"
+
+
+LLCallFloater::LLCallFloater(const LLSD& key)
+: LLDockableFloater(NULL, key)
+, mSpeakerManager(NULL)
+, mPaticipants(NULL)
+, mAvatarList(NULL)
+, mVoiceType(VC_LOCAL_CHAT)
+{
+
+}
+
+LLCallFloater::~LLCallFloater()
+{
+ delete mPaticipants;
+ mPaticipants = NULL;
+}
+
+// virtual
+BOOL LLCallFloater::postBuild()
+{
+ LLDockableFloater::postBuild();
+ mAvatarList = getChild<LLAvatarList>("speakers_list");
+
+
+ LLView *anchor_panel = LLBottomTray::getInstance()->getChild<LLView>("speak_panel");
+
+ setDockControl(new LLDockControl(
+ anchor_panel, this,
+ getDockTongue(), LLDockControl::TOP));
+
+ initAgentData();
+
+ // update list for current session
+ updateSession();
+
+ // subscribe to to be notified Voice Channel is changed
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1));
+ return TRUE;
+}
+
+// virtual
+void LLCallFloater::onOpen(const LLSD& /*key*/)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PRIVATE SECTION
+//////////////////////////////////////////////////////////////////////////
+void LLCallFloater::updateSession()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ if (voice_channel)
+ {
+ lldebugs << "Current voice channel: " << voice_channel->getSessionID() << llendl;
+
+ if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID())
+ {
+ lldebugs << "Speaker manager is already set for session: " << voice_channel->getSessionID() << llendl;
+ return;
+ }
+ else
+ {
+ mSpeakerManager = NULL;
+ }
+ }
+
+ const LLUUID& session_id = voice_channel->getSessionID();
+ lldebugs << "Set speaker manager for session: " << session_id << llendl;
+
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (im_session)
+ {
+ mSpeakerManager = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ switch (im_session->mType)
+ {
+ case IM_NOTHING_SPECIAL:
+ case IM_SESSION_P2P_INVITE:
+ mVoiceType = VC_PEER_TO_PEER;
+ break;
+ case IM_SESSION_CONFERENCE_START:
+ mVoiceType = VC_AD_HOC_CHAT;
+ break;
+ default:
+ mVoiceType = VC_GROUP_CHAT;
+ break;
+ }
+ }
+
+ if (NULL == mSpeakerManager)
+ {
+ // by default let show nearby chat participants
+ mSpeakerManager = LLLocalSpeakerMgr::getInstance();
+ lldebugs << "Set DEFAULT speaker manager" << llendl;
+ mVoiceType = VC_LOCAL_CHAT;
+ }
+
+ updateTitle();
+ refreshPartisipantList();
+}
+
+void LLCallFloater::refreshPartisipantList()
+{
+ delete mPaticipants;
+ mAvatarList->clear();
+
+ bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager;
+ mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat);
+
+ if (!do_not_use_context_menu_in_local_chat)
+ {
+ mAvatarList->setNoItemsCommentText(getString("no_one_near"));
+ }
+}
+
+void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
+{
+ updateSession();
+}
+
+void LLCallFloater::updateTitle()
+{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ std::string title;
+ switch (mVoiceType)
+ {
+ case VC_LOCAL_CHAT:
+ title = getString("title_nearby");
+ break;
+ case VC_PEER_TO_PEER:
+ title = voice_channel->getSessionName();
+ break;
+ case VC_AD_HOC_CHAT:
+ title = getString("title_adhoc");
+ break;
+ case VC_GROUP_CHAT:
+ LLStringUtil::format_map_t args;
+ args["[GROUP]"] = voice_channel->getSessionName();
+ title = getString("title_group", args);
+ break;
+ }
+
+ setTitle(title);
+}
+
+void LLCallFloater::initAgentData()
+{
+ childSetValue("user_icon", gAgentID);
+
+ std::string name;
+ gCacheName->getFullName(gAgentID, name);
+ childSetValue("user_text", name);
+
+ LLOutputMonitorCtrl* speaking_indicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
+ speaking_indicator->setSpeakerId(gAgentID);
+}
+//EOF
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
new file mode 100644
index 0000000000..8a440873ff
--- /dev/null
+++ b/indra/newview/llcallfloater.h
@@ -0,0 +1,97 @@
+/**
+ * @file llcallfloater.h
+ * @author Mike Antipov
+ * @brief Voice Control Panel in a Voice Chats (P2P, Group, Nearby...).
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCALLFLOATER_H
+#define LL_LLCALLFLOATER_H
+
+#include "lldockablefloater.h"
+
+class LLAvatarList;
+class LLParticipantList;
+class LLSpeakerMgr;
+
+/**
+ * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
+ * It can be torn-off and freely positioned onscreen.
+ *
+ * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over
+ * the Resident's own microphone input volume, the audible volume of each of the other participants,
+ * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
+ *
+ * When the Resident is engaged in Group Voice Chat, the Voice Control Panel also provides an
+ * 'End Call' button to allow the Resident to leave that voice channel.
+ */
+class LLCallFloater : public LLDockableFloater
+{
+public:
+ LLCallFloater(const LLSD& key);
+ ~LLCallFloater();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+private:
+ typedef enum e_voice_controls_type
+ {
+ VC_LOCAL_CHAT,
+ VC_GROUP_CHAT,
+ VC_AD_HOC_CHAT,
+ VC_PEER_TO_PEER
+ }EVoiceControls;
+
+ /**
+ * Updates mSpeakerManager and list according to current Voice Channel
+ *
+ * It compares mSpeakerManager & current Voice Channel session IDs.
+ * If they are different gets Speaker manager related to current channel and updates channel participant list.
+ */
+ void updateSession();
+
+ /**
+ * Refreshes participant list according to current Voice Channel
+ */
+ void refreshPartisipantList();
+ void onCurrentChannelChanged(const LLUUID& session_id);
+ void updateTitle();
+ void initAgentData();
+
+private:
+ LLSpeakerMgr* mSpeakerManager;
+ LLParticipantList* mPaticipants;
+ LLAvatarList* mAvatarList;
+ EVoiceControls mVoiceType;
+};
+
+
+#endif //LL_LLCALLFLOATER_H
+
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index 476f1f41ac..714bd20ab8 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -633,20 +633,21 @@ void LLAvatarTracker::processChange(LLMessageSystem* msg)
{
if((mBuddyInfo[agent_id]->getRightsGrantedFrom() ^ new_rights) & LLRelationship::GRANT_MODIFY_OBJECTS)
{
- std::string first, last;
+ std::string name;
LLSD args;
- if(gCacheName->getName(agent_id, first, last))
+ if(gCacheName->getFullName(agent_id, name))
{
- args["FIRST_NAME"] = first;
- args["LAST_NAME"] = last;
+ args["NAME"] = name;
}
+ LLSD payload;
+ payload["from_id"] = agent_id;
if(LLRelationship::GRANT_MODIFY_OBJECTS & new_rights)
{
- LLNotificationsUtil::add("GrantedModifyRights",args);
+ LLNotificationsUtil::add("GrantedModifyRights",args, payload);
}
else
{
- LLNotificationsUtil::add("RevokedModifyRights",args);
+ LLNotificationsUtil::add("RevokedModifyRights",args, payload);
}
}
(mBuddyInfo[agent_id])->setRightsFrom(new_rights);
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index d08be335c3..078c2518c6 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -199,7 +199,7 @@ public:
userName->setValue(SL);
}
- setTimeField(chat.mTimeStr);
+ setTimeField(chat);
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
@@ -267,11 +267,29 @@ protected:
}
private:
- void setTimeField(const std::string& time_value)
+ std::string appendTime(const LLChat& chat)
+ {
+ time_t utc_time;
+ utc_time = time_corrected();
+ std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+ +LLTrans::getString("TimeMin")+"] ";
+
+ LLSD substitution;
+
+ substitution["datetime"] = (S32) utc_time;
+ LLStringUtil::format (timeStr, substitution);
+
+ return timeStr;
+ }
+
+ void setTimeField(const LLChat& chat)
{
LLTextBox* time_box = getChild<LLTextBox>("time_box");
LLRect rect_before = time_box->getRect();
+
+ std::string time_value = appendTime(chat);
+
time_box->setValue(time_value);
// set necessary textbox width to fit all text
@@ -284,7 +302,7 @@ private:
time_box->translate(delta_pos_x, delta_pos_y);
//... & change width of the name control
- LLUICtrl* user_name = getChild<LLUICtrl>("user_name");
+ LLView* user_name = getChild<LLView>("user_name");
const LLRect& user_rect = user_name->getRect();
user_name->reshape(user_rect.getWidth() + delta_pos_x, user_rect.getHeight());
}
@@ -386,7 +404,11 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
p.left_pad = mLeftWidgetPad;
p.right_pad = mRightWidgetPad;
- if (mLastFromName == chat.mFromName)
+ LLDate new_message_time = LLDate::now();
+
+ if (mLastFromName == chat.mFromName &&
+ mLastMessageTime.notNull() &&
+ (new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0 )
{
view = getSeparator();
p.top_pad = mTopSeparatorPad;
@@ -414,6 +436,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const bool use_plain_text_
appendWidget(p, header_text, false);
mLastFromName = chat.mFromName;
+ mLastMessageTime = new_message_time;
}
//Handle IRC styled /me messages.
std::string prefix = chat.mText.substr(0, 4);
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index ef5839ff2f..d2cfa53d8b 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -114,6 +114,7 @@ class LLChatHistory : public LLTextEditor
private:
std::string mLastFromName;
+ LLDate mLastMessageTime;
std::string mMessageHeaderFilename;
std::string mMessageSeparatorFilename;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 8a6935b71b..efdaff3f6a 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -44,27 +44,12 @@
#include "llviewercontrol.h"
#include "llagentdata.h"
-/*
-static const S32 BORDER_MARGIN = 2;
-static const S32 PARENT_BORDER_MARGIN = 0;
-
-static const S32 HORIZONTAL_MULTIPLE = 8;
-static const S32 VERTICAL_MULTIPLE = 16;
-static const F32 MIN_AUTO_SCROLL_RATE = 120.f;
-static const F32 MAX_AUTO_SCROLL_RATE = 500.f;
-static const F32 AUTO_SCROLL_RATE_ACCEL = 120.f;
-
-#define MAX_CHAT_HISTORY 100
-*/
-
-static const S32 msg_left_offset = 30;
+static const S32 msg_left_offset = 10;
static const S32 msg_right_offset = 10;
-static const S32 msg_height_pad = 2;
-
-//static LLDefaultChildRegistry::Register<LLChatItemsContainerCtrl> t2("chat_items_container");
+static const S32 msg_height_pad = 5;
//*******************************************************************************************************************
-//LLChatItemCtrl
+//LLNearbyChatToastPanel
//*******************************************************************************************************************
LLNearbyChatToastPanel* LLNearbyChatToastPanel::createInstance()
@@ -79,22 +64,22 @@ void LLNearbyChatToastPanel::reshape (S32 width, S32 height, BOOL called_from_p
{
LLPanel::reshape(width, height,called_from_parent);
- // *NOTE: we must check if child items exist because reshape is called from the
- // LLView::initFromParams BEFORE postBuild is called and child controls are not exist yet
- LLPanel* caption = findChild<LLPanel>("msg_caption", false);
- LLChatMsgBox* msg_text = findChild<LLChatMsgBox>("msg_text" ,false);
- if(caption && msg_text)
- {
- LLRect caption_rect = caption->getRect();
- caption_rect.setLeftTopAndSize( 2, height, width - 4, caption_rect.getHeight());
- caption->reshape( width - 4, caption_rect.getHeight(), 1);
- caption->setRect(caption_rect);
-
- LLRect msg_text_rect = msg_text->getRect();
- msg_text_rect.setLeftTopAndSize( msg_left_offset, height - caption_rect.getHeight() , width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight());
- msg_text->reshape( width - msg_left_offset - msg_right_offset, height - caption_rect.getHeight(), 1);
- msg_text->setRect(msg_text_rect);
- }
+ LLUICtrl* msg_text = getChild<LLUICtrl>("msg_text", false);
+ LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+
+ LLRect msg_text_rect = msg_text->getRect();
+ LLRect avatar_rect = icon->getRect();
+
+ avatar_rect.setLeftTopAndSize(2,height-2,avatar_rect.getWidth(),avatar_rect.getHeight());
+ icon->setRect(avatar_rect);
+
+
+ msg_text_rect.setLeftTopAndSize( avatar_rect.mRight + msg_left_offset,
+ height - msg_height_pad,
+ width - avatar_rect.mRight - msg_left_offset - msg_right_offset,
+ height - 2*msg_height_pad);
+ msg_text->reshape( msg_text_rect.getWidth(), msg_text_rect.getHeight(), 1);
+ msg_text->setRect(msg_text_rect);
}
BOOL LLNearbyChatToastPanel::postBuild()
@@ -102,37 +87,63 @@ BOOL LLNearbyChatToastPanel::postBuild()
return LLPanel::postBuild();
}
-
-std::string LLNearbyChatToastPanel::appendTime()
+void LLNearbyChatToastPanel::addMessage(LLSD& notification)
{
- time_t utc_time;
- utc_time = time_corrected();
- std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ";
+ std::string messageText = notification["message"].asString(); // UTF-8 line of text
- LLSD substitution;
+ LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- substitution["datetime"] = (S32) utc_time;
- LLStringUtil::format (timeStr, substitution);
+ std::string color_name = notification["text_color"].asString();
+
+ LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
+ textColor.mV[VALPHA] =notification["color_alpha"].asReal();
+
+ S32 font_size = notification["font_size"].asInteger();
- return timeStr;
-}
+ LLFontGL* messageFont;
+ switch(font_size)
+ {
+ case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
+ default:
+ case 1: messageFont = LLFontGL::getFontSansSerif(); break;
+ case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
+ }
+ //append text
+ {
+ LLStyle::Params style_params;
+ style_params.color(textColor);
+ std::string font_name = LLFontGL::nameFromFont(messageFont);
+ std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+ style_params.font.name(font_name);
+ style_params.font.size(font_style_size);
+ int chat_type = notification["chat_type"].asInteger();
+
+ if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+ {
+ messageText = messageText.substr(3);
+ style_params.font.style = "ITALIC";
+ }
+ else if( chat_type == CHAT_TYPE_SHOUT)
+ {
+ style_params.font.style = "BOLD";
+ }
+ else if( chat_type == CHAT_TYPE_WHISPER)
+ {
+ style_params.font.style = "ITALIC";
+ }
+ msg_text->appendText(messageText, TRUE, style_params);
+ }
+
+ snapToMessageHeight();
-void LLNearbyChatToastPanel::addText (const std::string& message , const LLStyle::Params& input_params)
-{
- LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- msg_text->addText(message , input_params);
- mMessages.push_back(message);
}
void LLNearbyChatToastPanel::init(LLSD& notification)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-
- mText = notification["message"].asString(); // UTF-8 line of text
- mFromName = notification["from"].asString(); // agent or object name
+ std::string messageText = notification["message"].asString(); // UTF-8 line of text
+ std::string fromName = notification["from"].asString(); // agent or object name
mFromID = notification["from_id"].asUUID(); // agent id or object id
int sType = notification["source"].asInteger();
@@ -140,192 +151,121 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
std::string color_name = notification["text_color"].asString();
- mTextColor = LLUIColorTable::instance().getColor(color_name);
- mTextColor.mV[VALPHA] =notification["color_alpha"].asReal();
+ LLColor4 textColor = LLUIColorTable::instance().getColor(color_name);
+ textColor.mV[VALPHA] =notification["color_alpha"].asReal();
S32 font_size = notification["font_size"].asInteger();
+
+ LLFontGL* messageFont;
switch(font_size)
{
- case 0:
- mFont = LLFontGL::getFontSansSerifSmall();
- break;
+ case 0: messageFont = LLFontGL::getFontSansSerifSmall(); break;
default:
- case 1:
- mFont = LLFontGL::getFontSansSerif();
- break;
- case 2:
- mFont = LLFontGL::getFontSansSerifBig();
- break;
+ case 1: messageFont = LLFontGL::getFontSansSerif(); break;
+ case 2: messageFont = LLFontGL::getFontSansSerifBig(); break;
}
- LLStyle::Params style_params;
- style_params.color(mTextColor);
-// style_params.font(mFont);
- std::string font_name = LLFontGL::nameFromFont(mFont);
- std::string font_style_size = LLFontGL::sizeFromFont(mFont);
- style_params.font.name(font_name);
- style_params.font.size(font_style_size);
+ LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
+
+ msg_text->setText(std::string(""));
std::string str_sender;
if(gAgentID != mFromID)
- str_sender = mFromName;
+ str_sender = fromName;
else
- str_sender = LLTrans::getString("You");;
+ str_sender = LLTrans::getString("You");
- caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params);
-
- LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
+ str_sender+=" ";
+ //append user name
+ {
+ LLStyle::Params style_params_name;
+
+ LLColor4 userNameColor = LLUIColorTable::instance().getColor("ChatToastAgentNameColor");
+
+ style_params_name.color(userNameColor);
+
+ std::string font_name = LLFontGL::nameFromFont(messageFont);
+ std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+ style_params_name.font.name(font_name);
+ style_params_name.font.size(font_style_size);
+
+ msg_text->appendText(str_sender, FALSE, style_params_name);
+
+ }
- if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
+ //append text
{
- if (mFromName.size() > 0)
+ LLStyle::Params style_params;
+ style_params.color(textColor);
+ std::string font_name = LLFontGL::nameFromFont(messageFont);
+ std::string font_style_size = LLFontGL::sizeFromFont(messageFont);
+ style_params.font.name(font_name);
+ style_params.font.size(font_style_size);
+
+ int chat_type = notification["chat_type"].asInteger();
+
+ if(notification["chat_style"].asInteger()== CHAT_STYLE_IRC)
{
+ messageText = messageText.substr(3);
style_params.font.style = "ITALIC";
-
- msg_text->setText(mFromName, style_params);
}
- mText = mText.substr(3);
- style_params.font.style = "ITALIC";
-#define INFINITE_REFLOW_BUG 0
-#if INFINITE_REFLOW_BUG
- // This causes LLTextBase::reflow() to infinite loop until the viewer
- // runs out of memory, throws a bad_alloc exception from std::vector
- // in mLineInfoList, and the main loop catches it and continues.
- // It appears to be caused by addText() adding a line separator in the
- // middle of a line. See EXT-2579, EXT-1949
- msg_text->addText(mText,style_params);
-#else
- msg_text->appendText(mText, FALSE, style_params);
-#endif
- }
- else
- {
- msg_text->setText(mText, style_params);
+ else if( chat_type == CHAT_TYPE_SHOUT)
+ {
+ style_params.font.style = "BOLD";
+ }
+ else if( chat_type == CHAT_TYPE_WHISPER)
+ {
+ style_params.font.style = "ITALIC";
+ }
+ msg_text->appendText(messageText, FALSE, style_params);
}
-
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- if(mSourceType != CHAT_SOURCE_AGENT)
- msg_inspector->setVisible(false);
-
- mMessages.clear();
-
- snapToMessageHeight ();
+ snapToMessageHeight();
mIsDirty = true;//will set Avatar Icon in draw
}
-void LLNearbyChatToastPanel::setMessage (const LLChat& chat_msg)
-{
- LLSD notification;
- notification["message"] = chat_msg.mText;
- notification["from"] = chat_msg.mFromName;
- notification["from_id"] = chat_msg.mFromID;
- notification["time"] = chat_msg.mTime;
- notification["source"] = (S32)chat_msg.mSourceType;
- notification["chat_type"] = (S32)chat_msg.mChatType;
- notification["chat_style"] = (S32)chat_msg.mChatStyle;
-
- std::string r_color_name="White";
- F32 r_color_alpha = 1.0f;
- LLViewerChat::getChatColor( chat_msg, r_color_name, r_color_alpha);
-
- notification["text_color"] = r_color_name;
- notification["color_alpha"] = r_color_alpha;
-
- notification["font_size"] = (S32)LLViewerChat::getChatFontSize() ;
- init(notification);
-
-}
-
void LLNearbyChatToastPanel::snapToMessageHeight ()
{
LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
- S32 new_height = text_box->getTextPixelHeight() + msg_height_pad;
+ S32 new_height = llmax (text_box->getTextPixelHeight() + 2*text_box->getVPad() + 2*msg_height_pad, 25);
+
LLRect panel_rect = getRect();
- S32 caption_height = 0;
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- caption_height = caption->getRect().getHeight();
-
- panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), caption_height + new_height);
+ panel_rect.setLeftTopAndSize( panel_rect.mLeft, panel_rect.mTop, panel_rect.getWidth(), new_height);
- reshape( getRect().getWidth(), caption_height + new_height, 1);
+ reshape( getRect().getWidth(), getRect().getHeight(), 1);
setRect(panel_rect);
}
-
-void LLNearbyChatToastPanel::setWidth(S32 width)
-{
- LLChatMsgBox* text_box = getChild<LLChatMsgBox>("msg_text", false);
- text_box->reshape(width - msg_left_offset - msg_right_offset,100/*its not magic number, we just need any number*/);
-
- LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
-
- LLStyle::Params style_params;
- style_params.color(mTextColor);
- style_params.font(mFont);
-
-
- if(mText.length())
- msg_text->setText(mText, style_params);
-
- for(size_t i=0;i<mMessages.size();++i)
- msg_text->addText(mMessages[i] , style_params);
-
- setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width , getRect().mBottom));
- snapToMessageHeight ();
-}
-
void LLNearbyChatToastPanel::onMouseLeave (S32 x, S32 y, MASK mask)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- msg_inspector->setVisible(false);
}
void LLNearbyChatToastPanel::onMouseEnter (S32 x, S32 y, MASK mask)
{
if(mSourceType != CHAT_SOURCE_AGENT)
return;
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- msg_inspector->setVisible(true);
}
BOOL LLNearbyChatToastPanel::handleMouseDown (S32 x, S32 y, MASK mask)
{
if(mSourceType != CHAT_SOURCE_AGENT)
return LLPanel::handleMouseDown(x,y,mask);
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
- S32 local_x = x - msg_inspector->getRect().mLeft - caption->getRect().mLeft;
- S32 local_y = y - msg_inspector->getRect().mBottom - caption->getRect().mBottom;
- if(msg_inspector->pointInView(local_x, local_y))
- {
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mFromID));
- }
- else
- {
- LLFloaterReg::showInstance("nearby_chat",LLSD());
- }
+ LLFloaterReg::showInstance("nearby_chat",LLSD());
return LLPanel::handleMouseDown(x,y,mask);
}
void LLNearbyChatToastPanel::setHeaderVisibility(EShowItemHeader e)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
-
- LLUICtrl* icon = caption->getChild<LLUICtrl>("avatar_icon", false);
- LLUICtrl* name = caption->getChild<LLUICtrl>("sender_name", false);
-
- icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
- name->setVisible(e == CHATITEMHEADER_SHOW_ONLY_NAME || e==CHATITEMHEADER_SHOW_BOTH);
+ LLUICtrl* icon = getChild<LLUICtrl>("avatar_icon", false);
+ if(icon)
+ icon->setVisible(e == CHATITEMHEADER_SHOW_ONLY_ICON || e==CHATITEMHEADER_SHOW_BOTH);
}
@@ -339,11 +279,10 @@ bool LLNearbyChatToastPanel::canAddText ()
BOOL LLNearbyChatToastPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
- LLPanel* caption = getChild<LLPanel>("msg_caption", false);
- LLUICtrl* avatar_icon = caption->getChild<LLUICtrl>("avatar_icon", false);
+ LLUICtrl* avatar_icon = getChild<LLUICtrl>("avatar_icon", false);
- S32 local_x = x - avatar_icon->getRect().mLeft - caption->getRect().mLeft;
- S32 local_y = y - avatar_icon->getRect().mBottom - caption->getRect().mBottom;
+ S32 local_x = x - avatar_icon->getRect().mLeft;
+ S32 local_y = y - avatar_icon->getRect().mBottom;
//eat message for avatar icon if msg was from object
if(avatar_icon->pointInView(local_x, local_y) && mSourceType != CHAT_SOURCE_AGENT)
@@ -354,9 +293,12 @@ void LLNearbyChatToastPanel::draw()
{
if(mIsDirty)
{
- LLPanel* caption = findChild<LLPanel>("msg_caption", false);
- if(caption)
- caption->getChild<LLAvatarIconCtrl>("avatar_icon", false)->setValue(mFromID);
+ LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon", false);
+ if(icon)
+ {
+ icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
+ icon->setValue(mFromID);
+ }
mIsDirty = false;
}
LLToastPanelBase::draw();
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index a65bfedd09..0a85c52401 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -59,9 +59,8 @@ public:
const LLUUID& getFromID() const { return mFromID;}
- void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params());
- void setMessage (const LLChat& msg);
- void setWidth (S32 width);
+ //void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params());
+ //void setMessage (const LLChat& msg);
void snapToMessageHeight ();
bool canAddText ();
@@ -78,22 +77,16 @@ public:
BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
virtual void init(LLSD& data);
+ virtual void addMessage(LLSD& data);
virtual void draw();
-private:
-
- std::string appendTime ();
+ const LLUUID& messageID() const { return mFromID;}
private:
- std::string mText; // UTF-8 line of text
- std::string mFromName; // agent or object name
LLUUID mFromID; // agent id or object id
EChatSourceType mSourceType;
- LLColor4 mTextColor;
- LLFontGL* mFont;
-
+
- std::vector<std::string> mMessages;
bool mIsDirty;
};
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 319cbf8209..544711a862 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -85,6 +85,7 @@ public:
S32 mUSDCurrencyEstimatedCost;
bool mLocalCurrencyEstimated;
std::string mLocalCurrencyEstimatedCost;
+ bool mSupportsInternationalBilling;
std::string mSiteConfirm;
bool mBought;
@@ -137,6 +138,7 @@ LLCurrencyUIManager::Impl::Impl(LLPanel& dialog)
mError(false),
mUserCurrencyBuy(2000), // note, this is a default, real value set in llfloaterbuycurrency.cpp
mUserEnteredCurrencyBuy(false),
+ mSupportsInternationalBilling(false),
mBought(false),
mTransactionType(TransactionNone), mTransaction(0),
mCurrencyChanged(false)
@@ -207,6 +209,7 @@ void LLCurrencyUIManager::Impl::finishCurrencyInfo()
if (mLocalCurrencyEstimated)
{
mLocalCurrencyEstimatedCost = currency["estimatedLocalCost"].asString();
+ mSupportsInternationalBilling = true;
}
S32 newCurrencyBuy = currency["currencyBuy"].asInt();
@@ -464,6 +467,9 @@ void LLCurrencyUIManager::Impl::updateUI()
mPanel.childSetTextArg("currency_est", "[LOCALAMOUNT]", getLocalEstimate());
mPanel.childSetVisible("currency_est", hasEstimate() && mUserCurrencyBuy > 0);
+ mPanel.childSetVisible("currency_links", mSupportsInternationalBilling);
+ mPanel.childSetVisible("exchange_rate_note", mSupportsInternationalBilling);
+
if (mPanel.childIsEnabled("buy_btn")
||mPanel.childIsVisible("currency_est")
|| mPanel.childIsVisible("error_web"))
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index 9bc7221dc8..c7c79401a0 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -141,11 +141,12 @@ void LLViewerDynamicTexture::preRender(BOOL clear_depth)
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
}
// Set up camera
- mCamera.setOrigin(*LLViewerCamera::getInstance());
- mCamera.setAxes(*LLViewerCamera::getInstance());
- mCamera.setAspect(LLViewerCamera::getInstance()->getAspect());
- mCamera.setView(LLViewerCamera::getInstance()->getView());
- mCamera.setNear(LLViewerCamera::getInstance()->getNear());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ mCamera.setOrigin(*camera);
+ mCamera.setAxes(*camera);
+ mCamera.setAspect(camera->getAspect());
+ mCamera.setView(camera->getView());
+ mCamera.setNear(camera->getNear());
glViewport(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
if (clear_depth)
@@ -174,11 +175,12 @@ void LLViewerDynamicTexture::postRender(BOOL success)
gViewerWindow->setup2DViewport();
// restore camera
- LLViewerCamera::getInstance()->setOrigin(mCamera);
- LLViewerCamera::getInstance()->setAxes(mCamera);
- LLViewerCamera::getInstance()->setAspect(mCamera.getAspect());
- LLViewerCamera::getInstance()->setView(mCamera.getView());
- LLViewerCamera::getInstance()->setNear(mCamera.getNear());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ camera->setOrigin(mCamera);
+ camera->setAxes(mCamera);
+ camera->setAspect(mCamera.getAspect());
+ camera->setView(mCamera.getView());
+ camera->setNear(mCamera.getNear());
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 31f1462a12..eef774426a 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -1378,7 +1378,8 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
LLVector3 center = getPositionAgent();
LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
- LLVector3 lookAt = center - LLViewerCamera::getInstance()->getOrigin();
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 lookAt = center - camera->getOrigin();
F32 dist = lookAt.normVec() ;
//get area of circle around node
@@ -1393,7 +1394,7 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
}
else
{
- cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ;
+ cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
}
@@ -1443,8 +1444,9 @@ F32 LLFace::calcImportanceToCamera(F32 cos_angle_to_view_dir, F32 dist)
if(cos_angle_to_view_dir > LLViewerCamera::getInstance()->getCosHalfFov() &&
dist < FACE_IMPORTANCE_TO_CAMERA_OVER_DISTANCE[FACE_IMPORTANCE_LEVEL - 1][0])
{
- F32 camera_moving_speed = LLViewerCamera::getInstance()->getAverageSpeed() ;
- F32 camera_angular_speed = LLViewerCamera::getInstance()->getAverageAngularSpeed();
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ F32 camera_moving_speed = camera->getAverageSpeed() ;
+ F32 camera_angular_speed = camera->getAverageAngularSpeed();
if(camera_moving_speed > 10.0f || camera_angular_speed > 1.0f)
{
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 8406ddeeca..17b0710813 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -355,8 +355,8 @@ struct LLFavoritesSort
};
LLFavoritesBarCtrl::Params::Params()
-: chevron_button_tool_tip("chevron_button_tool_tip"),
- image_drag_indication("image_drag_indication")
+: image_drag_indication("image_drag_indication"),
+ chevron_button("chevron_button")
{
}
@@ -365,7 +365,6 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
mFont(p.font.isProvided() ? p.font() : LLFontGL::getFontSansSerifSmall()),
mPopupMenuHandle(),
mInventoryItemsPopupMenuHandle(),
- mChevronButtonToolTip(p.chevron_button_tool_tip),
mImageDragIndication(p.image_drag_indication),
mShowDragMarker(FALSE),
mLandingTab(NULL),
@@ -381,6 +380,12 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
boost::bind(&LLFavoritesBarCtrl::enableSelected, this, _2));
gInventory.addObserver(this);
+
+ //make chevron button
+ LLButton::Params chevron_button_params(p.chevron_button);
+ chevron_button_params.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
+ mChevronButton = LLUICtrlFactory::create<LLButton> (chevron_button_params);
+ addChild(mChevronButton);
}
LLFavoritesBarCtrl::~LLFavoritesBarCtrl()
@@ -653,10 +658,6 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
buttonXMLNode->getAttributeS32("left", buttonHGap);
S32 count = mItems.count();
-
- const S32 buttonHPad = LLUI::sSettingGroups["config"]->getS32("ButtonHPad");
- const S32 chevron_button_width = mFont->getWidth(">>") + buttonHPad * 2;
-
S32 buttons_space = bar_width - buttonHGap;
S32 first_drop_down_item = count;
@@ -670,7 +671,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
{
// There is no space for all buttons.
// Calculating the number of buttons, that are fit with chevron button
- buttons_space -= chevron_button_width + buttonHGap;
+ buttons_space -= mChevronButton->getRect().getWidth() + buttonHGap;
while (i >= 0 && buttons_width > buttons_space)
{
buttons_width -= buttonWidth + buttonHGap;
@@ -718,7 +719,7 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
child_list_const_iter_t cur_it = child_it++;
LLView* viewp = *cur_it;
LLButton* button = dynamic_cast<LLButton*>(viewp);
- if (button)
+ if (button && (button != mChevronButton))
{
removeChild(button);
delete button;
@@ -732,55 +733,15 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
if (mFirstDropDownItem != count)
{
// Chevron button should stay right aligned
- LLView *chevron_button = findChildView(std::string(">>"), FALSE);
- if (chevron_button)
- {
- LLRect rect;
- rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight());
- chevron_button->setRect(rect);
- chevron_button->setVisible(TRUE);
- mChevronRect = rect;
- }
- else
- {
- static LLButton::Params default_button_params(LLUICtrlFactory::getDefaultParams<LLButton>());
- std::string flat_icon = "transparent.j2c";
- std::string hover_icon = default_button_params.image_unselected.name;
- std::string hover_icon_selected = default_button_params.image_selected.name;
-
- LLButton::Params bparams;
-
- LLRect rect;
- rect.setOriginAndSize(bar_width - chevron_button_width - buttonHGap, 0, chevron_button_width, getRect().getHeight());
-
- bparams.follows.flags (FOLLOWS_LEFT | FOLLOWS_BOTTOM);
- bparams.image_unselected.name(flat_icon);
- bparams.image_disabled.name(flat_icon);
- bparams.image_selected.name(hover_icon_selected);
- bparams.image_hover_selected.name(hover_icon_selected);
- bparams.image_disabled_selected.name(hover_icon_selected);
- bparams.image_hover_unselected.name(hover_icon);
- bparams.rect (rect);
- bparams.tab_stop(false);
- bparams.font(mFont);
- bparams.name(">>");
- bparams.label(">>");
- bparams.tool_tip(mChevronButtonToolTip);
- bparams.click_callback.function(boost::bind(&LLFavoritesBarCtrl::showDropDownMenu, this));
-
- addChildInBack(LLUICtrlFactory::create<LLButton> (bparams));
-
- mChevronRect = rect;
- }
+ LLRect rect;
+ rect.setOriginAndSize(bar_width - mChevronButton->getRect().getWidth() - buttonHGap, 0, mChevronButton->getRect().getWidth(), mChevronButton->getRect().getHeight());
+ mChevronButton->setRect(rect);
+ mChevronButton->setVisible(TRUE);
}
else
{
// Hide chevron button if all items are visible on bar
- LLView *chevron_button = findChildView(std::string(">>"), FALSE);
- if (chevron_button)
- {
- chevron_button->setVisible(FALSE);
- }
+ mChevronButton->setVisible(FALSE);
}
}
@@ -917,7 +878,7 @@ void LLFavoritesBarCtrl::showDropDownMenu()
if (menu->getButtonRect().isEmpty())
{
- menu->setButtonRect(mChevronRect, this);
+ menu->setButtonRect(mChevronButton->getRect(), this);
}
LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
@@ -981,7 +942,7 @@ void LLFavoritesBarCtrl::showDropDownMenu()
menu->buildDrawLabels();
menu->updateParent(LLMenuGL::sMenuContainer);
- menu->setButtonRect(mChevronRect, this);
+ menu->setButtonRect(mChevronButton->getRect(), this);
LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index 20a324c67c..b2fe3cc651 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -33,6 +33,7 @@
#ifndef LL_LLFAVORITESBARCTRL_H
#define LL_LLFAVORITESBARCTRL_H
+#include "llbutton.h"
#include "lluictrl.h"
#include "llinventoryobserver.h"
@@ -43,8 +44,8 @@ class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<std::string> chevron_button_tool_tip;
Optional<LLUIImage*> image_drag_indication;
+ Optional<LLButton::Params> chevron_button;
Params();
};
@@ -105,9 +106,7 @@ protected:
item_names_array_t mItemNamesCache;
LLUUID mSelectedItemID;
- LLRect mChevronRect;
- std::string mChevronButtonToolTip;
LLUIImage* mImageDragIndication;
private:
@@ -150,6 +149,7 @@ private:
BOOL mShowDragMarker;
LLUICtrl* mLandingTab;
LLUICtrl* mLastTab;
+ LLButton* mChevronButton;
LLUUID mDragItemId;
BOOL mStartDrag;
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index 80b0a430e0..58c0c19761 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -269,10 +269,10 @@ LLSD LLFloaterAbout::getInfo()
info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
bool want_fullname = true;
info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
- info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : "Unknown";
+ info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
// TODO: Implement media plugin version query
- info["QT_WEBKIT_VERSION"] = "4.5.2";
+ info["QT_WEBKIT_VERSION"] = "4.5.2 (version number hard-coded)";
if (gPacketsIn > 0)
{
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 92e958b32d..764aff68c9 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -215,17 +215,38 @@ void LLFloaterCamera::onOpen(const LLSD& key)
getDockTongue(), LLDockControl::TOP));
mZoom->onOpen(key);
+
+ // Returns to previous mode, see EXT-2727(View tool should remember state).
+ // In case floater was just hidden and it isn't reset the mode
+ // just update state to current one. Else go to previous.
+ if ( !mClosed )
+ updateState();
+ else
+ toPrevMode();
+ mClosed = FALSE;
}
void LLFloaterCamera::onClose(bool app_quitting)
{
//We don't care of camera mode if app is quitting
- if(!app_quitting)
- switchMode(CAMERA_CTRL_MODE_ORBIT);
+ if(app_quitting)
+ return;
+ // When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
+ // switchMode won't modify mPrevMode, so force it here.
+ // It is needed to correctly return to previous mode on open, see EXT-2727.
+ if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
+ mPrevMode = CAMERA_CTRL_MODE_ORBIT;
+
+ // HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
+ if ( !isDocked() )
+ setDocked(true);
+ switchMode(CAMERA_CTRL_MODE_ORBIT);
+ mClosed = TRUE;
}
LLFloaterCamera::LLFloaterCamera(const LLSD& val)
: LLTransientDockableFloater(NULL, true, val),
+ mClosed(FALSE),
mCurrMode(CAMERA_CTRL_MODE_ORBIT),
mPrevMode(CAMERA_CTRL_MODE_ORBIT)
{
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 4873a34e00..5d44b4944d 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -109,6 +109,7 @@ private:
void assignButton2Mode(ECameraControlMode mode, const std::string& button_name);
+ BOOL mClosed;
ECameraControlMode mPrevMode;
ECameraControlMode mCurrMode;
std::map<ECameraControlMode, LLButton*> mMode2Button;
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index 0f8e4c10d7..5072bc8c82 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -168,6 +168,7 @@ LLFloaterGesture::~LLFloaterGesture()
LLGestureManager::instance().removeObserver(mObserver);
delete mObserver;
mObserver = NULL;
+ gInventory.removeObserver(this);
}
// virtual
@@ -304,7 +305,7 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
{
font_style = "BOLD";
}
-
+ item_name = gesture->mName;
element["columns"][0]["column"] = "trigger";
element["columns"][0]["value"] = gesture->mTrigger;
element["columns"][0]["font"]["name"] = "SANSSERIF";
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index db38fc0fb3..4a2e1913cd 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -107,10 +107,14 @@ LLInventoryPanel* LLFloaterInventory::getPanel()
// static
LLFloaterInventory* LLFloaterInventory::showAgentInventory()
{
+ // Hack to generate semi-unique key for each inventory floater.
+ static S32 instance_num = 0;
+ instance_num = (instance_num + 1) % S32_MAX;
+
LLFloaterInventory* iv = NULL;
if (!gAgent.cameraMouselook())
{
- iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD());
+ iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num));
}
return iv;
}
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 44e68d7745..16a76723eb 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -41,6 +41,7 @@
#include "lluictrlfactory.h"
#include "llbutton.h"
#include "llselectmgr.h"
+#include "llsdutil.h"
LLFloaterMediaSettings* LLFloaterMediaSettings::sInstance = NULL;
@@ -57,7 +58,6 @@ LLFloaterMediaSettings::LLFloaterMediaSettings(const LLSD& key)
mMultipleMedia(false),
mMultipleValidMedia(false)
{
-// LLUICtrlFactory::getInstance()->buildFloater(this, "floater_media_settings.xml");
}
////////////////////////////////////////////////////////////////////////////////
@@ -145,15 +145,15 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
//static
void LLFloaterMediaSettings::apply()
{
- LLSD settings;
+ LLSD settings;
sInstance->mPanelMediaSettingsGeneral->preApply();
- sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings );
sInstance->mPanelMediaSettingsSecurity->preApply();
sInstance->mPanelMediaSettingsSecurity->getValues( settings );
sInstance->mPanelMediaSettingsPermissions->preApply();
- sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
- LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+ LLSelectMgr::getInstance()->selectionSetMediaData(settings);
sInstance->mPanelMediaSettingsGeneral->postApply();
sInstance->mPanelMediaSettingsSecurity->postApply();
sInstance->mPanelMediaSettingsPermissions->postApply();
@@ -183,7 +183,12 @@ void LLFloaterMediaSettings::initValues( const LLSD& media_settings, bool editab
sInstance->mPanelMediaSettingsPermissions->
initValues( sInstance->mPanelMediaSettingsPermissions, media_settings, editable );
-
+
+ // Squirrel away initial values
+ sInstance->mInitialValues.clear();
+ sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
}
////////////////////////////////////////////////////////////////////////////////
@@ -206,11 +211,10 @@ void LLFloaterMediaSettings::clearValues( bool editable)
{
// clean up all panels before updating
sInstance->mPanelMediaSettingsGeneral ->clearValues(sInstance->mPanelMediaSettingsGeneral, editable);
- sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
+ sInstance->mPanelMediaSettingsSecurity ->clearValues(sInstance->mPanelMediaSettingsSecurity, editable);
sInstance->mPanelMediaSettingsPermissions->clearValues(sInstance->mPanelMediaSettingsPermissions, editable);
}
-
////////////////////////////////////////////////////////////////////////////////
// static
void LLFloaterMediaSettings::onBtnOK( void* userdata )
@@ -235,7 +239,7 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )
// static
void LLFloaterMediaSettings::onBtnCancel( void* userdata )
{
- sInstance->closeFloater();
+ sInstance->closeFloater();
}
////////////////////////////////////////////////////////////////////////////////
@@ -250,7 +254,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
//
void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
{
- setCtrlsEnabled( enable );
childSetEnabled( "OK", enable );
childSetEnabled( "Apply", enable );
}
@@ -265,17 +268,36 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
return std::string( "" );
}
-
////////////////////////////////////////////////////////////////////////////////
-//
-bool LLFloaterMediaSettings::passesWhiteList( const std::string& test_url )
+// virtual
+void LLFloaterMediaSettings::draw()
{
- // sanity check - don't think this can happen
- if ( mPanelMediaSettingsSecurity )
- // version in security dialog code is specialized so we pass in
- // empty string for first parameter since it's not used
- return mPanelMediaSettingsSecurity->passesWhiteList( "", test_url );
- else
- // this is all we can do
- return false;
+ // *NOTE: The code below is very inefficient. Better to do this
+ // only when data change.
+ // Every frame, check to see what the values are. If they are not
+ // the same as the default media data, enable the OK/Apply buttons
+ LLSD settings;
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+ sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+
+ bool values_changed = false;
+
+ LLSD::map_const_iterator iter = settings.beginMap();
+ LLSD::map_const_iterator end = settings.endMap();
+ for ( ; iter != end; ++iter )
+ {
+ const std::string &current_key = iter->first;
+ const LLSD &current_value = iter->second;
+ if ( ! llsd_equals(current_value, mInitialValues[current_key]))
+ {
+ values_changed = true;
+ break;
+ }
+ }
+
+ enableOkApplyBtns(values_changed);
+
+ LLFloater::draw();
}
+
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index 17a47cb0f5..b72e3d855d 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -54,10 +54,12 @@ public:
static void apply();
static void initValues( const LLSD& media_settings , bool editable);
static void clearValues( bool editable);
- void enableOkApplyBtns( bool enable );
- LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
- const std::string getHomeUrl();
- bool passesWhiteList( const std::string& test_url );
+
+ LLPanelMediaSettingsSecurity* getPanelSecurity(){return mPanelMediaSettingsSecurity;};
+ const std::string getHomeUrl();
+ //bool passesWhiteList( const std::string& test_url );
+
+ virtual void draw();
bool mIdenticalHasMediaInfo;
bool mMultipleMedia;
@@ -73,7 +75,6 @@ protected:
LLPanelMediaSettingsSecurity* mPanelMediaSettingsSecurity;
LLPanelMediaSettingsPermissions* mPanelMediaSettingsPermissions;
-
static void onBtnOK(void*);
static void onBtnCancel(void*);
static void onBtnApply(void*);
@@ -83,6 +84,10 @@ protected:
static LLFloaterMediaSettings* sInstance;
private:
+
+ void enableOkApplyBtns( bool enable );
+
+ LLSD mInitialValues;
bool mWaitingToClose;
};
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 83c784c1f7..a6ecb4c127 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -367,6 +367,10 @@ BOOL LLFloaterPreference::postBuild()
tabcontainer->selectFirstTab();
S32 show_avatar_nametag_options = gSavedSettings.getS32("AvatarNameTagMode");
handleNameTagOptionChanged(LLSD(show_avatar_nametag_options));
+
+ std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
+ childSetText("cache_location", cache_location);
+
return TRUE;
}
@@ -760,8 +764,9 @@ void LLFloaterPreference::onClickResetCache()
{
gSavedSettings.setString("NewCacheLocation", "");
gSavedSettings.setString("NewCacheLocationTopFolder", "");
- LLNotificationsUtil::add("CacheWillBeMoved");
}
+
+ LLNotificationsUtil::add("CacheWillBeMoved");
std::string cache_location = gDirUtilp->getCacheDir(true);
gSavedSettings.setString("CacheLocation", cache_location);
std::string top_folder(gDirUtilp->getBaseFileName(cache_location));
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index e2df2ffdf7..c8ff36b4f4 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -37,6 +37,7 @@
#include "lllogininstance.h"
#include "lluri.h"
#include "llagent.h"
+#include "llui.h"
LLFloaterSearch::LLFloaterSearch(const LLSD& key) :
LLFloater(key),
@@ -139,6 +140,9 @@ void LLFloaterSearch::search(const LLSD &key)
}
url += "&r=" + maturity;
+ // add the current localization information
+ url += "&lang=" + LLUI::getLanguage();
+
// and load the URL in the web view
mBrowser->navigateTo(url);
}
diff --git a/indra/newview/llfloaterwhitelistentry.cpp b/indra/newview/llfloaterwhitelistentry.cpp
index 551a5191fc..04dbd38153 100644
--- a/indra/newview/llfloaterwhitelistentry.cpp
+++ b/indra/newview/llfloaterwhitelistentry.cpp
@@ -81,7 +81,7 @@ void LLFloaterWhiteListEntry::onBtnOK( void* userdata )
{
std::string white_list_item = self->mWhiteListEdit->getText();
- panel->addWhiteListItem( white_list_item );
+ panel->addWhiteListEntry( white_list_item );
};
self->closeFloater();
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 77a2cbcfca..18ff53c127 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -73,6 +73,7 @@ LLGestureManager::LLGestureManager()
mActive(),
mLoadingCount(0)
{
+ mRetryIfMissing = true;
gInventory.addObserver(this);
}
@@ -984,7 +985,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
else
{
// Watch this item and set gesture name when item exists in inventory
- self.watchItem(item_id);
+ item_ref_t ids;
+ ids.push_back(item_id);
+ self.fetchItems(ids);
}
self.mActive[item_id] = gesture;
@@ -1177,6 +1180,7 @@ void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids)
void LLGestureManager::done()
{
+ bool notify = false;
for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)
{
if(it->second && it->second->mName.empty())
@@ -1185,10 +1189,14 @@ void LLGestureManager::done()
if(item)
{
it->second->mName = item->getName();
+ notify = true;
}
}
}
- notifyObservers();
+ if(notify)
+ {
+ notifyObservers();
+ }
}
// static
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 094ca13798..e80eea9ae9 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -54,7 +54,7 @@ public:
virtual void changed() = 0;
};
-class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver
+class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryFetchObserver
{
public:
diff --git a/indra/newview/llhudicon.cpp b/indra/newview/llhudicon.cpp
index 040027c70d..28b0e7356a 100644
--- a/indra/newview/llhudicon.cpp
+++ b/indra/newview/llhudicon.cpp
@@ -103,28 +103,29 @@ void LLHUDIcon::renderIcon(BOOL for_select)
// put icon above object, and in front
// RN: don't use drawable radius, it's fricking HUGE
- LLVector3 icon_relative_pos = (LLViewerCamera::getInstance()->getUpAxis() * ~mSourceObject->getRenderRotation());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 icon_relative_pos = (camera->getUpAxis() * ~mSourceObject->getRenderRotation());
icon_relative_pos.abs();
F32 distance_scale = llmin(mSourceObject->getScale().mV[VX] / icon_relative_pos.mV[VX],
mSourceObject->getScale().mV[VY] / icon_relative_pos.mV[VY],
mSourceObject->getScale().mV[VZ] / icon_relative_pos.mV[VZ]);
F32 up_distance = 0.5f * distance_scale;
- LLVector3 icon_position = obj_position + (up_distance * LLViewerCamera::getInstance()->getUpAxis()) * 1.2f;
+ LLVector3 icon_position = obj_position + (up_distance * camera->getUpAxis()) * 1.2f;
LLVector3 icon_to_cam = LLViewerCamera::getInstance()->getOrigin() - icon_position;
icon_to_cam.normVec();
icon_position += icon_to_cam * mSourceObject->mDrawable->getRadius() * 1.1f;
- mDistance = dist_vec(icon_position, LLViewerCamera::getInstance()->getOrigin());
+ mDistance = dist_vec(icon_position, camera->getOrigin());
F32 alpha_factor = for_select ? 1.f : clamp_rescale(mDistance, DIST_START_FADE, DIST_END_FADE, 1.f, 0.f);
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
- LLViewerCamera::getInstance()->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
+ camera->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
F32 scale_factor = 1.f;
if (mAnimTimer.getElapsedTimeF32() < ANIM_TIME)
@@ -226,26 +227,27 @@ BOOL LLHUDIcon::lineSegmentIntersect(const LLVector3& start, const LLVector3& en
// put icon above object, and in front
// RN: don't use drawable radius, it's fricking HUGE
- LLVector3 icon_relative_pos = (LLViewerCamera::getInstance()->getUpAxis() * ~mSourceObject->getRenderRotation());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 icon_relative_pos = (camera->getUpAxis() * ~mSourceObject->getRenderRotation());
icon_relative_pos.abs();
F32 distance_scale = llmin(mSourceObject->getScale().mV[VX] / icon_relative_pos.mV[VX],
mSourceObject->getScale().mV[VY] / icon_relative_pos.mV[VY],
mSourceObject->getScale().mV[VZ] / icon_relative_pos.mV[VZ]);
F32 up_distance = 0.5f * distance_scale;
- LLVector3 icon_position = obj_position + (up_distance * LLViewerCamera::getInstance()->getUpAxis()) * 1.2f;
+ LLVector3 icon_position = obj_position + (up_distance * camera->getUpAxis()) * 1.2f;
LLVector3 icon_to_cam = LLViewerCamera::getInstance()->getOrigin() - icon_position;
icon_to_cam.normVec();
icon_position += icon_to_cam * mSourceObject->mDrawable->getRadius() * 1.1f;
- mDistance = dist_vec(icon_position, LLViewerCamera::getInstance()->getOrigin());
+ mDistance = dist_vec(icon_position, camera->getOrigin());
LLVector3 x_pixel_vec;
LLVector3 y_pixel_vec;
- LLViewerCamera::getInstance()->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
+ camera->getPixelVectors(icon_position, y_pixel_vec, x_pixel_vec);
F32 scale_factor = 1.f;
if (mAnimTimer.getElapsedTimeF32() < ANIM_TIME)
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index ab0be90def..a02dc3355b 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -64,11 +64,12 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
const LLColor4& color,
const BOOL orthographic)
{
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
// Do cheap plane culling
- LLVector3 dir_vec = pos_agent - LLViewerCamera::getInstance()->getOrigin();
+ LLVector3 dir_vec = pos_agent - camera->getOrigin();
dir_vec /= dir_vec.magVec();
- if (wstr.empty() || (!orthographic && dir_vec * LLViewerCamera::getInstance()->getAtAxis() <= 0.f))
+ if (wstr.empty() || (!orthographic && dir_vec * camera->getAtAxis() <= 0.f))
{
return;
}
@@ -82,15 +83,15 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
}
else
{
- LLViewerCamera::getInstance()->getPixelVectors(pos_agent, up_axis, right_axis);
+ camera->getPixelVectors(pos_agent, up_axis, right_axis);
}
- LLCoordFrame render_frame = *LLViewerCamera::getInstance();
+ LLCoordFrame render_frame = *camera;
LLQuaternion rot;
if (!orthographic)
{
rot = render_frame.getQuaternion();
- rot = rot * LLQuaternion(-F_PI_BY_TWO, LLViewerCamera::getInstance()->getYAxis());
- rot = rot * LLQuaternion(F_PI_BY_TWO, LLViewerCamera::getInstance()->getXAxis());
+ rot = rot * LLQuaternion(-F_PI_BY_TWO, camera->getYAxis());
+ rot = rot * LLQuaternion(F_PI_BY_TWO, camera->getXAxis());
}
else
{
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index ee93a9349a..5e9ffdf410 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -34,6 +34,8 @@
#include "llimfloater.h"
+#include "llnotificationsutil.h"
+
#include "llagent.h"
#include "llappviewer.h"
#include "llbutton.h"
@@ -529,7 +531,6 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
//in disconnected state IM input editor should be disabled
self->mInputEditor->setEnabled(!gDisconnected);
}
- self->mChatHistory->setCursorAndScrollToEnd();
}
// static
@@ -635,6 +636,9 @@ void LLIMFloater::processAgentListUpdates(const LLSD& body)
else
label = LLTrans::getString("IM_to_label") + " " + LLIMModel::instance().getName(mSessionID);
mInputEditor->setLabel(label);
+
+ if (moderator_muted_text)
+ LLNotificationsUtil::add("TextChatIsMutedByModerator");
}
}
}
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 6e4b3ae214..2d7333f7e4 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -1,96 +1,96 @@
-/**
- * @file llimfloatercontainer.cpp
- * @brief Multifloater containing active IM sessions in separate tab container tabs
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-
-#include "llviewerprecompiledheaders.h"
-
-#include "llimfloatercontainer.h"
-
-//
-// LLIMFloaterContainer
-//
-LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
-: LLMultiFloater(seed),
- mActiveVoiceFloater(NULL)
-{
- mAutoResize = FALSE;
-}
-
-LLIMFloaterContainer::~LLIMFloaterContainer()
-{
-}
-
-BOOL LLIMFloaterContainer::postBuild()
-{
- // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
- // mTabContainer will be initialized in LLMultiFloater::addChild()
- return TRUE;
-}
-
-void LLIMFloaterContainer::onOpen(const LLSD& key)
-{
- LLMultiFloater::onOpen(key);
-/*
- if (key.isDefined())
- {
- LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
- if (im_floater)
- {
- im_floater->openFloater();
- }
- }
-*/
-}
-
-void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point)
-{
- if(!floaterp) return;
-
- // already here
- if (floaterp->getHost() == this)
- {
- openFloater(floaterp->getKey());
- return;
- }
-
- LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
-
- // make sure active voice icon shows up for new tab
- if (floaterp == mActiveVoiceFloater)
- {
- mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
- }
-}
-
-// EOF
+/**
+ * @file llimfloatercontainer.cpp
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llimfloatercontainer.h"
+
+//
+// LLIMFloaterContainer
+//
+LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
+: LLMultiFloater(seed),
+ mActiveVoiceFloater(NULL)
+{
+ mAutoResize = FALSE;
+}
+
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+}
+
+BOOL LLIMFloaterContainer::postBuild()
+{
+ // Do not call base postBuild to not connect to mCloseSignal to not close all floaters via Close button
+ // mTabContainer will be initialized in LLMultiFloater::addChild()
+ return TRUE;
+}
+
+void LLIMFloaterContainer::onOpen(const LLSD& key)
+{
+ LLMultiFloater::onOpen(key);
+/*
+ if (key.isDefined())
+ {
+ LLIMFloater* im_floater = LLIMFloater::findInstance(key.asUUID());
+ if (im_floater)
+ {
+ im_floater->openFloater();
+ }
+ }
+*/
+}
+
+void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point)
+{
+ if(!floaterp) return;
+
+ // already here
+ if (floaterp->getHost() == this)
+ {
+ openFloater(floaterp->getKey());
+ return;
+ }
+
+ LLMultiFloater::addFloater(floaterp, select_added_floater, insertion_point);
+
+ // make sure active voice icon shows up for new tab
+ if (floaterp == mActiveVoiceFloater)
+ {
+ mTabContainer->setTabImage(floaterp, "active_voice_tab.tga");
+ }
+}
+
+// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index 10cde56c6e..ead7cf4730 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -1,61 +1,61 @@
-/**
- * @file llimfloatercontainer.h
- * @brief Multifloater containing active IM sessions in separate tab container tabs
- *
- * $LicenseInfo:firstyear=2009&license=viewergpl$
- *
- * Copyright (c) 2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLIMFLOATERCONTAINER_H
-#define LL_LLIMFLOATERCONTAINER_H
-
-#include "llfloater.h"
-#include "llmultifloater.h"
-
-class LLTabContainer;
-
-class LLIMFloaterContainer : public LLMultiFloater
-{
-public:
- LLIMFloaterContainer(const LLSD& seed);
- virtual ~LLIMFloaterContainer();
-
- /*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
-
- /*virtual*/ void addFloater(LLFloater* floaterp,
- BOOL select_added_floater,
- LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
-
- static LLFloater* getCurrentVoiceFloater();
-
-protected:
-
- LLFloater* mActiveVoiceFloater;
-};
-
-#endif // LL_LLIMFLOATERCONTAINER_H
+/**
+ * @file llimfloatercontainer.h
+ * @brief Multifloater containing active IM sessions in separate tab container tabs
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLIMFLOATERCONTAINER_H
+#define LL_LLIMFLOATERCONTAINER_H
+
+#include "llfloater.h"
+#include "llmultifloater.h"
+
+class LLTabContainer;
+
+class LLIMFloaterContainer : public LLMultiFloater
+{
+public:
+ LLIMFloaterContainer(const LLSD& seed);
+ virtual ~LLIMFloaterContainer();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ /*virtual*/ void addFloater(LLFloater* floaterp,
+ BOOL select_added_floater,
+ LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
+
+ static LLFloater* getCurrentVoiceFloater();
+
+protected:
+
+ LLFloater* mActiveVoiceFloater;
+};
+
+#endif // LL_LLIMFLOATERCONTAINER_H
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index c096b5220a..be719c0a78 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -165,6 +165,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
{
mVoiceChannel = new LLVoiceChannelGroup(session_id, name);
}
+
+ if(mVoiceChannel)
+ {
+ mVoiceChannel->setStateChangedCallback(boost::bind(&LLIMSession::onVoiceChannelStateChanged, this, _1, _2));
+ }
mSpeakers = new LLIMSpeakerMgr(mVoiceChannel);
// All participants will be added to the list of people we've recently interacted with.
@@ -191,6 +196,56 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
LLLogChat::loadHistory(mName, &chatFromLogFile, (void *)this);
}
+void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
+{
+ bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel);
+ bool is_incoming_call = false;
+ std::string other_avatar_name;
+
+ if(is_p2p_session)
+ {
+ is_incoming_call = static_cast<LLVoiceChannelP2P*>(mVoiceChannel)->isIncomingCall();
+ gCacheName->getFullName(mOtherParticipantID, other_avatar_name);
+
+ if(is_incoming_call)
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
+ break;
+ case LLVoiceChannel::STATE_CONNECTED :
+ LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call");
+ default:
+ break;
+ }
+ }
+ else // outgoing call
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call");
+ break;
+ case LLVoiceChannel::STATE_CONNECTED :
+ LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
+ default:
+ break;
+ }
+ }
+
+ // Update speakers list when connected
+ if (LLVoiceChannel::STATE_CONNECTED == new_state)
+ {
+ mSpeakers->update(true);
+ }
+ }
+ else // group || ad-hoc calls
+ {
+
+ }
+}
+
LLIMModel::LLIMSession::~LLIMSession()
{
delete mSpeakers;
@@ -396,6 +451,19 @@ bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from,
return true;
}
+bool LLIMModel::logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
+{
+ if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
+ {
+ LLLogChat::saveHistory(session_name, from, from_id, utf8_text);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
bool LLIMModel::logToFile(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text)
{
if (gSavedPerAccountSettings.getBOOL("LogInstantMessages"))
@@ -430,7 +498,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
const std::string& utf8_text, bool log2file /* = true */) {
LLIMSession* session = findIMSession(session_id);
- if (!session)
+ if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
return false;
@@ -1150,7 +1218,7 @@ BOOL LLOutgoingCallDialog::postBuild()
childSetAction("Cancel", onCancel, this);
// dock the dialog to the sys well, where other sys messages appear
- setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+ setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),
this, getDockTongue(), LLDockControl::TOP,
boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
@@ -1227,7 +1295,7 @@ void LLIncomingCallDialog::onOpen(const LLSD& key)
}
// dock the dialog to the sys well, where other sys messages appear
- setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+ setDockControl(new LLDockControl(LLBottomTray::getInstance()->getChild<LLPanel>("speak_panel"),
this, getDockTongue(), LLDockControl::TOP,
boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
}
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 62a54bc081..40e3a8fb69 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -61,6 +61,7 @@ public:
void sessionInitReplyReceived(const LLUUID& new_session_id);
void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
+ void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state);
static void chatFromLogFile(LLLogChat::ELogLineType type, const LLSD& msg, void* userdata);
LLUUID mSessionID;
@@ -199,6 +200,11 @@ public:
void testMessages();
+ /**
+ * Saves an IM message into a file
+ */
+ bool logToFile(const std::string& session_name, const std::string& from, const LLUUID& from_id, const std::string& utf8_text);
+
private:
/**
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index d216872363..a44ce07d76 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2387,6 +2387,8 @@ void LLFolderBridge::folderOptionsMenu()
if (is_sidepanel)
{
mItems.clear();
+ mItems.push_back("Rename");
+ mItems.push_back("Delete");
}
// Only enable calling-card related options for non-default folders.
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 944676ad7a..2d9ea21b5f 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -63,6 +63,15 @@
#include "llsdutil.h"
#include <deque>
+LLInventoryObserver::LLInventoryObserver()
+{
+}
+
+// virtual
+LLInventoryObserver::~LLInventoryObserver()
+{
+}
+
void LLInventoryCompletionObserver::changed(U32 mask)
{
// scan through the incomplete items and move or erase them as
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 73b25a8ed0..4ee6c48cb1 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -63,7 +63,8 @@ public:
CALLING_CARD = 32, // online, grant status, cancel, etc change
ALL = 0xffffffff
};
- virtual ~LLInventoryObserver() {};
+ LLInventoryObserver();
+ virtual ~LLInventoryObserver();
virtual void changed(U32 mask) = 0;
std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
};
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index fd23b375fa..fd83729630 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -192,6 +192,7 @@ protected:
//--------------------------------------------------------------------
public:
BOOL getIsViewsInitialized() const { return mViewsInitialized; }
+ const LLUUID& getStartFolderID() const { return mStartFolderID; }
private:
// Builds the UI. Call this once the inventory is usable.
void initializeViews();
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 941ccc227c..9caa863bd8 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -77,12 +77,12 @@ std::string LLLogChat::timestamp(bool withdate)
+LLTrans::getString ("TimeMonth")+"]/["
+LLTrans::getString ("TimeDay")+"] ["
+LLTrans::getString ("TimeHour")+"]:["
- +LLTrans::getString ("TimeMin")+"] ";
+ +LLTrans::getString ("TimeMin")+"]";
}
else
{
timeStr = "[" + LLTrans::getString("TimeHour") + "]:["
- + LLTrans::getString ("TimeMin")+"] ";
+ + LLTrans::getString ("TimeMin")+"]";
}
LLStringUtil::format (timeStr, substitution);
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index baf4d4bfe3..0684cec370 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -130,6 +130,21 @@ void LLNearbyChat::applySavedVariables()
}
}
+std::string appendTime()
+{
+ time_t utc_time;
+ utc_time = time_corrected();
+ std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
+ +LLTrans::getString("TimeMin")+"] ";
+
+ LLSD substitution;
+
+ substitution["datetime"] = (S32) utc_time;
+ LLStringUtil::format (timeStr, substitution);
+
+ return timeStr;
+}
+
void LLNearbyChat::addMessage(const LLChat& chat)
{
if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
@@ -150,11 +165,18 @@ void LLNearbyChat::addMessage(const LLChat& chat)
return;
}
}
+
+ bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
if (!chat.mMuted)
{
std::string message = chat.mText;
- std::string prefix = message.substr(0, 4);
+
+
+ LLChat& tmp_chat = const_cast<LLChat&>(chat);
+
+ if(tmp_chat.mTimeStr.empty())
+ tmp_chat.mTimeStr = appendTime();
if (chat.mChatStyle == CHAT_STYLE_IRC)
{
@@ -173,7 +195,7 @@ void LLNearbyChat::addMessage(const LLChat& chat)
append_style_params.font.style = "ITALIC";
LLChat add_chat=chat;
add_chat.mText = chat.mFromName + " ";
- mChatHistory->appendMessage(add_chat, false, append_style_params);
+ mChatHistory->appendMessage(add_chat, use_plain_text_chat_history, append_style_params);
}
message = message.substr(3);
@@ -182,7 +204,7 @@ void LLNearbyChat::addMessage(const LLChat& chat)
}
else
{
- mChatHistory->appendMessage(chat);
+ mChatHistory->appendMessage(chat,use_plain_text_chat_history);
}
}
}
@@ -206,13 +228,23 @@ bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata)
return false;
}
-void LLNearbyChat::onOpen(const LLSD& key )
+void LLNearbyChat::setVisible(BOOL visible)
{
- LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
- if(chat_channel)
+ if(visible)
{
- chat_channel->removeToastsFromChannel();
+ LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID")));
+ if(chat_channel)
+ {
+ chat_channel->removeToastsFromChannel();
+ }
}
+
+ LLDockableFloater::setVisible(visible);
+}
+
+void LLNearbyChat::onOpen(const LLSD& key )
+{
+ LLDockableFloater::onOpen(key);
}
void LLNearbyChat::setRect (const LLRect &rect)
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 5d9ed0c3ac..cf47a0aa18 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -57,6 +57,8 @@ public:
/*virtual*/ void onOpen (const LLSD& key);
+ /*virtual*/ void setVisible(BOOL visible);
+
virtual void setRect (const LLRect &rect);
private:
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index 74a75d0369..b0b6db682c 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -52,8 +52,6 @@ using namespace LLNotificationsUI;
LLToastPanelBase* createToastPanel()
{
LLNearbyChatToastPanel* item = LLNearbyChatToastPanel::createInstance();
- static S32 chat_item_width = 304;
- item->setWidth(chat_item_width);
return item;
}
@@ -169,6 +167,29 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
//look in pool. if there is any message
if(mStopProcessing)
return;
+
+ /*
+ find last toast and check ID
+ */
+
+ if(m_active_toasts.size())
+ {
+ LLUUID fromID = notification["from_id"].asUUID(); // agent id or object id
+ LLToast* toast = m_active_toasts[0];
+ LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel());
+
+ if(panel && panel->messageID() == fromID && panel->canAddText())
+ {
+ panel->addMessage(notification);
+ toast->reshapeToPanel();
+ toast->resetTimer();
+
+ arrangeToasts();
+ return;
+ }
+ }
+
+
if(m_toast_pool.empty())
{
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index 2e7f95660a..6889931956 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -88,6 +88,8 @@ bool LLGroupHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
+ LLHandlerUtil::logGroupNoticeToIMGroup(notification);
+
LLPanel* notify_box = new LLToastGroupNotifyPanel(notification);
LLToast::Params p;
p.notif_id = notification->getID();
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 29664e1919..da8928321a 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -39,6 +39,7 @@
//#include "llnotificationsutil.h"
#include "llchannelmanager.h"
#include "llchat.h"
+#include "llnotificationptr.h"
namespace LLNotificationsUI
{
@@ -256,6 +257,33 @@ protected:
void onRejectToast(LLUUID& id);
};
+class LLHandlerUtil
+{
+public:
+ /**
+ * Checks sufficient conditions to log notification message to IM session.
+ */
+ static bool canLogToIM(const LLNotificationPtr& notification);
+
+ /**
+ * Writes notification message to IM session.
+ */
+ static void logToIM(const EInstantMessage& session_type,
+ const std::string& session_name, const std::string& from_name,
+ const std::string& message, const LLUUID& session_owner_id,
+ const LLUUID& from_id);
+
+ /**
+ * Writes notification message to IM p2p session.
+ */
+ static void logToIMP2P(const LLNotificationPtr& notification);
+
+ /**
+ * Writes group notice notification message to IM group session.
+ */
+ static void logGroupNoticeToIMGroup(const LLNotificationPtr& notification);
+};
+
}
#endif
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
new file mode 100644
index 0000000000..05da338513
--- /dev/null
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -0,0 +1,129 @@
+/**
+ * @file llnotificationofferhandler.cpp
+ * @brief Provides set of utility methods for notifications processing.
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h" // must be first include
+
+#include "llnotificationhandler.h"
+#include "llnotifications.h"
+#include "llimview.h"
+#include "llagent.h"
+
+using namespace LLNotificationsUI;
+
+const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
+ REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
+ "ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
+ "ObjectGiveItemUnknownUser");
+
+// static
+bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
+{
+ return GRANTED_MODIFY_RIGHTS == notification->getName()
+ || REVOKED_MODIFY_RIGHTS == notification->getName();
+}
+
+// static
+void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
+ const std::string& session_name, const std::string& from_name,
+ const std::string& message, const LLUUID& session_owner_id,
+ const LLUUID& from_id)
+{
+ LLUUID session_id = LLIMMgr::computeSessionID(session_type,
+ session_owner_id);
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+ session_id);
+ if (session == NULL)
+ {
+ LLIMModel::instance().logToFile(session_name, from_name, from_id, message);
+ }
+ else
+ {
+ // store active session id
+ const LLUUID & active_session_id =
+ LLIMModel::instance().getActiveSessionID();
+
+ // set searched session as active to avoid IM toast popup
+ LLIMModel::instance().setActiveSessionID(session_id);
+
+ LLIMModel::instance().addMessage(session_id, from_name, from_id,
+ message);
+
+ // restore active session id
+ LLIMModel::instance().setActiveSessionID(active_session_id);
+ }
+}
+
+// static
+void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification)
+{
+ const std::string
+ name =
+ notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
+ : notification->getSubstitutions()["[NAME]"];
+
+ // don't create IM p2p session with objects, it's necessary condition to log
+ if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
+ != OBJECT_GIVE_ITEM_UNKNOWN_USER)
+ {
+ LLUUID from_id = notification->getPayload()["from_id"];
+
+ logToIM(IM_NOTHING_SPECIAL, name, name, notification->getMessage(),
+ from_id, from_id);
+ }
+}
+
+// static
+void LLHandlerUtil::logGroupNoticeToIMGroup(
+ const LLNotificationPtr& notification)
+{
+
+ const LLSD& payload = notification->getPayload();
+ LLGroupData groupData;
+ if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData))
+ {
+ llwarns
+ << "Group notice for unkown group: "
+ << payload["group_id"].asUUID() << llendl;
+ }
+
+ const std::string group_name = groupData.mName;
+ const std::string sender_name = payload["sender_name"].asString();
+
+ // we can't retrieve sender id from group notice system message, so try to lookup it from cache
+ LLUUID sender_id;
+ gCacheName->getUUID(sender_name, sender_id);
+
+ logToIM(IM_SESSION_GROUP_START, group_name, sender_name, payload["message"],
+ payload["group_id"], sender_id);
+}
+
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 45b5e88472..c179a2cf90 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -37,8 +37,6 @@
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
-#include "llimview.h"
-#include "llimfloater.h"
#include "llnotificationmanager.h"
#include "llnotifications.h"
@@ -92,27 +90,7 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
- // add message to IM
- const std::string
- name =
- notification->getSubstitutions().has("NAME") ? notification->getSubstitutions()["NAME"]
- : notification->getSubstitutions()["[NAME]"];
-
- // don't create IM session with objects
- if (notification->getName() != "ObjectGiveItem"
- && notification->getName() != "ObjectGiveItemUnknownUser")
- {
- LLUUID from_id = notification->getPayload()["from_id"];
- LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL,
- from_id);
- if (!LLIMMgr::instance().hasSession(session_id))
- {
- session_id = LLIMMgr::instance().addSession(name,
- IM_NOTHING_SPECIAL, from_id);
- }
- LLIMMgr::instance().addMessage(session_id, LLUUID(), name,
- notification->getMessage());
- }
+ LLHandlerUtil::logToIMP2P(notification);
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llnotificationscripthandler.cpp b/indra/newview/llnotificationscripthandler.cpp
index 471c254bbc..c7261199e3 100644
--- a/indra/newview/llnotificationscripthandler.cpp
+++ b/indra/newview/llnotificationscripthandler.cpp
@@ -45,6 +45,7 @@ using namespace LLNotificationsUI;
static const std::string SCRIPT_DIALOG ("ScriptDialog");
static const std::string SCRIPT_DIALOG_GROUP ("ScriptDialogGroup");
+static const std::string SCRIPT_LOAD_URL ("LoadWebPage");
//--------------------------------------------------------------------------
LLScriptHandler::LLScriptHandler(e_notification_type type, const LLSD& id)
@@ -95,7 +96,12 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
if(notify["sigtype"].asString() == "add" || notify["sigtype"].asString() == "change")
{
- if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+ if (LLHandlerUtil::canLogToIM(notification))
+ {
+ LLHandlerUtil::logToIMP2P(notification);
+ }
+
+ if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
{
LLScriptFloaterManager::getInstance()->onAddNotification(notification->getID());
}
@@ -121,7 +127,7 @@ bool LLScriptHandler::processNotification(const LLSD& notify)
}
else if (notify["sigtype"].asString() == "delete")
{
- if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName())
+ if(SCRIPT_DIALOG == notification->getName() || SCRIPT_DIALOG_GROUP == notification->getName() || SCRIPT_LOAD_URL == notification->getName())
{
LLScriptFloaterManager::getInstance()->onRemoveNotification(notification->getID());
}
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 6f753b6176..97c1e96175 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -48,6 +48,9 @@
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
#include "llweb.h"
+#include "llfloaterworldmap.h"
+#include "llfloaterreg.h"
+#include "llnotificationsutil.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLDropTarget
@@ -150,6 +153,8 @@ BOOL LLPanelAvatarNotes::postBuild()
childSetCommitCallback("call", boost::bind(&LLPanelAvatarNotes::onCallButtonClick, this), NULL);
childSetCommitCallback("teleport", boost::bind(&LLPanelAvatarNotes::onTeleportButtonClick, this), NULL);
childSetCommitCallback("share", boost::bind(&LLPanelAvatarNotes::onShareButtonClick, this), NULL);
+ childSetCommitCallback("show_on_map_btn", (boost::bind(
+ &LLPanelAvatarNotes::onMapButtonClick, this)), NULL);
LLTextEditor* te = getChild<LLTextEditor>("notes_edit");
te->setCommitCallback(boost::bind(&LLPanelAvatarNotes::onCommitNotes,this));
@@ -195,6 +200,46 @@ void LLPanelAvatarNotes::onCommitNotes()
LLAvatarPropertiesProcessor::getInstance()-> sendNotes(getAvatarId(),notes);
}
+void LLPanelAvatarNotes::rightsConfirmationCallback(const LLSD& notification,
+ const LLSD& response, S32 rights)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option == 0)
+ {
+ LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(
+ getAvatarId(), rights);
+ }
+ else
+ {
+ childSetValue("objects_check",
+ childGetValue("objects_check").asBoolean() ? FALSE : TRUE);
+ }
+}
+
+void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
+{
+ std::string first, last;
+ LLSD args;
+ if (gCacheName->getName(getAvatarId(), first, last))
+ {
+ args["FIRST_NAME"] = first;
+ args["LAST_NAME"] = last;
+ }
+
+ if (grant)
+ {
+ LLNotificationsUtil::add("GrantModifyRights", args, LLSD(),
+ boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
+ _1, _2, rights));
+ }
+ else
+ {
+ LLNotificationsUtil::add("RevokeModifyRights", args, LLSD(),
+ boost::bind(&LLPanelAvatarNotes::rightsConfirmationCallback, this,
+ _1, _2, rights));
+ }
+}
+
void LLPanelAvatarNotes::onCommitRights()
{
S32 rights = 0;
@@ -206,7 +251,14 @@ void LLPanelAvatarNotes::onCommitRights()
if(childGetValue("objects_check").asBoolean())
rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
- LLAvatarPropertiesProcessor::getInstance()->sendFriendRights(getAvatarId(),rights);
+ const LLRelationship* buddy_relationship =
+ LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
+ bool allow_modify_objects = childGetValue("objects_check").asBoolean();
+ if (buddy_relationship->isRightGrantedTo(
+ LLRelationship::GRANT_MODIFY_OBJECTS) != allow_modify_objects)
+ {
+ confirmModifyRights(allow_modify_objects, rights);
+ }
}
void LLPanelAvatarNotes::processProperties(void* data, EAvatarProcessorType type)
@@ -311,6 +363,7 @@ void LLPanelProfileTab::onOpen(const LLSD& key)
// Update data even if we are viewing same avatar profile as some data might been changed.
setAvatarId(key.asUUID());
updateData();
+ updateButtons();
}
void LLPanelProfileTab::scrollToTop()
@@ -320,6 +373,22 @@ void LLPanelProfileTab::scrollToTop()
scrollContainer->goToTop();
}
+void LLPanelProfileTab::onMapButtonClick()
+{
+ std::string name;
+ gCacheName->getFullName(getAvatarId(), name);
+ gFloaterWorldMap->trackAvatar(getAvatarId(), name);
+ LLFloaterReg::showInstance("world_map");
+}
+
+void LLPanelProfileTab::updateButtons()
+{
+ bool enable_map_btn = LLAvatarTracker::instance().isBuddyOnline(getAvatarId())
+ && gAgent.isGodlike() || is_agent_mappable(getAvatarId());
+
+ childSetEnabled("show_on_map_btn", enable_map_btn);
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -338,6 +407,8 @@ BOOL LLPanelAvatarProfile::postBuild()
childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);
childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
+ childSetCommitCallback("show_on_map_btn", (boost::bind(
+ &LLPanelAvatarProfile::onMapButtonClick, this)), NULL);
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 527e1c0d34..f54aeee4eb 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -106,6 +106,10 @@ protected:
*/
void scrollToTop();
+ virtual void onMapButtonClick();
+
+ virtual void updateButtons();
+
private:
LLUUID mAvatarId;
@@ -256,6 +260,9 @@ protected:
*/
void fillRightsData();
+ void rightsConfirmationCallback(const LLSD& notification,
+ const LLSD& response, S32 rights);
+ void confirmModifyRights(bool grant, S32 rights);
void onCommitRights();
void onCommitNotes();
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index da7922d657..b6c58808ae 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -42,6 +42,7 @@
#include "lliconctrl.h"
#include "lllineeditor.h"
#include "llnamelistctrl.h"
+#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llnotify.h"
#include "llpanelgrouproles.h"
@@ -1101,10 +1102,33 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()
mMembersList->deleteSelectedItems();
+ sendEjectNotifications(mGroupID, selected_members);
+
LLGroupMgr::getInstance()->sendGroupMemberEjects(mGroupID,
selected_members);
}
+void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members)
+{
+ LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
+
+ if (group_data)
+ {
+ for (std::vector<LLUUID>::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i)
+ {
+ LLSD args;
+ std::string name;
+
+ gCacheName->getFullName(*i, name);
+
+ args["AVATAR_NAME"] = name;
+ args["GROUP_NAME"] = group_data->mName;
+
+ LLNotifications::instance().add(LLNotification::Params("EjectAvatarFromGroup").substitutions(args));
+ }
+ }
+}
+
void LLPanelGroupMembersSubTab::handleRoleCheck(const LLUUID& role_id,
LLRoleMemberChangeType type)
{
@@ -1544,9 +1568,6 @@ void LLPanelGroupMembersSubTab::updateMembers()
mPendingMemberUpdate = FALSE;
// Rebuild the members list.
- mMembersList->deleteAllItems();
-
- lldebugs << "LLPanelGroupMembersSubTab::updateMembers()" << llendl;
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
@@ -1563,7 +1584,12 @@ void LLPanelGroupMembersSubTab::updateMembers()
{
return;
}
-
+
+ //cleanup list only for first iretation
+ if(mMemberProgress == gdatap->mMembers.begin())
+ mMembersList->deleteAllItems();
+
+
LLGroupMgrGroupData::member_list_t::iterator end = gdatap->mMembers.end();
S32 i = 0;
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index b6e2245e70..bb3c9096cf 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -170,6 +170,7 @@ public:
static void onEjectMembers(void*);
void handleEjectMembers();
+ void sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members);
static void onRoleCheck(LLUICtrl* check, void* user_data);
void handleRoleCheck(const LLUUID& role_id,
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index fa6d16cfb1..405c95fc22 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h"
+#include "llfloaterreg.h"
+
#include "llpanelimcontrolpanel.h"
#include "llagent.h"
@@ -58,7 +60,7 @@ void LLPanelChatControlPanel::onEndCallButtonClicked()
void LLPanelChatControlPanel::onOpenVoiceControlsClicked()
{
- // TODO: implement Voice Control Panel opening
+ LLFloaterReg::showInstance("voice_controls");
}
void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
@@ -120,6 +122,7 @@ LLPanelIMControlPanel::LLPanelIMControlPanel()
LLPanelIMControlPanel::~LLPanelIMControlPanel()
{
+ LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
}
BOOL LLPanelIMControlPanel::postBuild()
@@ -169,7 +172,9 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
LLIMModel& im_model = LLIMModel::instance();
+ LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarID, this);
mAvatarID = im_model.getOtherParticipantID(session_id);
+ LLAvatarTracker::instance().addParticularFriendObserver(mAvatarID, this);
// Disable "Add friend" button for friends.
childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
@@ -198,6 +203,12 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
}
}
+//virtual
+void LLPanelIMControlPanel::changed(U32 mask)
+{
+ childSetEnabled("add_friend_btn", !LLAvatarActions::isFriend(mAvatarID));
+}
+
void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
{
if ( id == mAvatarID )
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 7bfc432ef2..a590232a0b 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -35,6 +35,7 @@
#include "llpanel.h"
#include "llvoicechannel.h"
+#include "llcallingcard.h"
class LLSpeakerMgr;
class LLAvatarList;
@@ -66,7 +67,7 @@ private:
};
-class LLPanelIMControlPanel : public LLPanelChatControlPanel
+class LLPanelIMControlPanel : public LLPanelChatControlPanel, LLFriendObserver
{
public:
LLPanelIMControlPanel();
@@ -76,6 +77,9 @@ public:
void setSessionId(const LLUUID& session_id);
+ // LLFriendObserver trigger
+ virtual void changed(U32 mask);
+
protected:
void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index e24fa14e1e..413d8ed756 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -264,11 +264,14 @@ void LLLandmarksPanel::updateFilteredAccordions()
accordion_tab = *iter;
inventory_list = dynamic_cast<LLInventorySubTreePanel*> (accordion_tab->getAccordionView());
if (NULL == inventory_list) continue;
+ // This doesn't seem to work correctly. Disabling for now. -Seraph
+ /*
LLFolderView* fv = inventory_list->getRootFolder();
-
bool has_descendants = fv->hasFilteredDescendants();
accordion_tab->setVisible(has_descendants);
+ */
+ accordion_tab->setVisible(TRUE);
}
// we have to arrange accordion tabs for cases when filter string is less restrictive but
@@ -457,6 +460,19 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLInvento
mCurrentSelectedList = NULL;
updateVerbs();
}
+
+ // Start background fetch, mostly for My Inventory and Library
+ if (expanded)
+ {
+ const LLUUID &cat_id = inventory_list->getStartFolderID();
+ // Just because the category itself has been fetched, doesn't mean its child folders have.
+ /*
+ if (!gInventory.isCategoryComplete(cat_id))
+ */
+ {
+ gInventory.startBackgroundFetch(cat_id);
+ }
+ }
}
void LLLandmarksPanel::deselectOtherThan(const LLInventorySubTreePanel* inventory_list)
@@ -730,13 +746,14 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
{
return canSelectedBeModified(command_name);
}
- else if ( "sort_by_date" == command_name)
- {
- return mSortByDate;
- }
else if("create_pick" == command_name)
{
- return !LLAgentPicksInfo::getInstance()->isPickLimitReached();
+ std::set<LLUUID> selection;
+ if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) )
+ {
+ return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
+ }
+ return false;
}
else
{
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index bde34302ed..d2a17dbd97 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -226,6 +226,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
+ LLURLSimString::setString(gSavedSettings.getString("LoginLocation"));
std::string sim_string = LLURLSimString::sInstance.mSimString;
if (!sim_string.empty())
{
@@ -893,12 +894,27 @@ void LLPanelLogin::onClickConnect(void *)
LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
std::string combo_text = combo->getSimple();
- if (first.empty() || last.empty())
+ bool has_first_and_last = !(first.empty() || last.empty());
+ bool has_location = false;
+
+ if(combo_text=="<Type region name>" || combo_text =="")
+ {
+ // *NOTE: Mani - Location field is not always committed by this point!
+ // This may be duplicate work, but better than not doing the work!
+ LLURLSimString::sInstance.setString("");
+ }
+ else
+ {
+ // *NOTE: Mani - Location field is not always committed by this point!
+ LLURLSimString::sInstance.setString(combo_text);
+ has_location = true;
+ }
+
+ if(!has_first_and_last)
{
LLNotificationsUtil::add("MustHaveAccountToLogIn");
}
- else if( (combo_text=="<Type region name>" || combo_text =="")
- && LLURLSimString::sInstance.mSimString =="")
+ else if(!has_location)
{
LLNotificationsUtil::add("StartRegionEmpty");
}
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 5bb266a01d..3fa0e7bf8f 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -59,6 +59,8 @@
#include "llfloatermediasettings.h"
#include "llfloatertools.h"
#include "lltrans.h"
+#include "lltextbox.h"
+#include "llpanelmediasettingssecurity.h"
const char *CHECKERBOARD_DATA_URL = "data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%22100%%22 height=%22100%%22 %3E%3Cdefs%3E%3Cpattern id=%22checker%22 patternUnits=%22userSpaceOnUse%22 x=%220%22 y=%220%22 width=%22128%22 height=%22128%22 viewBox=%220 0 128 128%22 %3E%3Crect x=%220%22 y=%220%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3Crect x=%2264%22 y=%2264%22 width=%2264%22 height=%2264%22 fill=%22#ddddff%22 /%3E%3C/pattern%3E%3C/defs%3E%3Crect x=%220%22 y=%220%22 width=%22100%%22 height=%22100%%22 fill=%22url(#checker)%22 /%3E%3C/svg%3E";
@@ -98,10 +100,12 @@ BOOL LLPanelMediaSettingsGeneral::postBuild()
mHomeURL = getChild< LLLineEditor >( LLMediaEntry::HOME_URL_KEY );
mWidthPixels = getChild< LLSpinCtrl >( LLMediaEntry::WIDTH_PIXELS_KEY );
mPreviewMedia = getChild<LLMediaCtrl>("preview_media");
+ mFailWhiteListText = getChild<LLTextBox>( "home_fails_whitelist_label" );
// watch commit action for HOME URL
childSetCommitCallback( LLMediaEntry::HOME_URL_KEY, onCommitHomeURL, this);
childSetCommitCallback( "current_url_reset_btn",onBtnResetCurrentUrl, this);
+
// interrogates controls and updates widgets as required
updateMediaPreview();
@@ -121,6 +125,11 @@ void LLPanelMediaSettingsGeneral::draw()
// housekeeping
LLPanel::draw();
+ // TODO: we need to call this repeatedly until the floater panels are fully
+ // created but once we have a valid answer, we should stop looking here - the
+ // commit callback will handle it
+ checkHomeUrlPassesWhitelist();
+
// enable/disable pixel values image entry based on auto scale checkbox
if ( mAutoScale->getValue().asBoolean() == false )
{
@@ -250,10 +259,6 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_
LLPanelMediaSettingsGeneral *self =(LLPanelMediaSettingsGeneral *)userdata;
self->mMediaEditable = editable;
- //llinfos << "---------------" << llendl;
- //llinfos << ll_pretty_print_sd(media_settings) << llendl;
- //llinfos << "---------------" << llendl;
-
if ( LLPanelMediaSettingsGeneral::isMultiple() )
{
self->clearValues(self, self->mMediaEditable);
@@ -316,7 +321,7 @@ void LLPanelMediaSettingsGeneral::initValues( void* userdata, const LLSD& media_
data_set[ i ].ctrl_ptr->setTentative( media_settings[ tentative_key ].asBoolean() );
};
};
-
+
// interrogates controls and updates widgets as required
self->updateMediaPreview();
}
@@ -355,20 +360,35 @@ void LLPanelMediaSettingsGeneral::onClose(bool app_quitting)
}
////////////////////////////////////////////////////////////////////////////////
+//
+void LLPanelMediaSettingsGeneral::checkHomeUrlPassesWhitelist()
+{
+ // parent floater has not constructed the security panel yet
+ if ( mParent->getPanelSecurity() == 0 )
+ return;
+
+ std::string home_url = getHomeUrl();
+ if ( home_url.empty() || mParent->getPanelSecurity()->urlPassesWhiteList( home_url ) )
+ {
+ // Home URL is empty or passes the white list so hide the warning message
+ mFailWhiteListText->setVisible( false );
+ }
+ else
+ {
+ // Home URL does not pass the white list so show the warning message
+ mFailWhiteListText->setVisible( true );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
// static
void LLPanelMediaSettingsGeneral::onCommitHomeURL( LLUICtrl* ctrl, void *userdata )
{
LLPanelMediaSettingsGeneral* self =(LLPanelMediaSettingsGeneral *)userdata;
- // check url user is trying to enter for home URL will pass whitelist
- // and decline to accept it if it doesn't.
- std::string home_url = self->mHomeURL->getValue().asString();
- if ( ! self->mParent->passesWhiteList( home_url ) )
- {
- LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl");
- return;
- };
-
+ // check home url passes whitelist and display warning if not
+ self->checkHomeUrlPassesWhitelist();
+
self->updateMediaPreview();
}
@@ -392,19 +412,19 @@ void LLPanelMediaSettingsGeneral::preApply()
//
void LLPanelMediaSettingsGeneral::getValues( LLSD &fill_me_in )
{
- fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = mAutoLoop->getValue();
- fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = mAutoPlay->getValue();
- fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = mAutoScale->getValue();
- fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = mAutoZoom->getValue();
- fill_me_in[LLMediaEntry::CONTROLS_KEY] = mControls->getCurrentIndex();
+ fill_me_in[LLMediaEntry::AUTO_LOOP_KEY] = (LLSD::Boolean)mAutoLoop->getValue();
+ fill_me_in[LLMediaEntry::AUTO_PLAY_KEY] = (LLSD::Boolean)mAutoPlay->getValue();
+ fill_me_in[LLMediaEntry::AUTO_SCALE_KEY] = (LLSD::Boolean)mAutoScale->getValue();
+ fill_me_in[LLMediaEntry::AUTO_ZOOM_KEY] = (LLSD::Boolean)mAutoZoom->getValue();
+ fill_me_in[LLMediaEntry::CONTROLS_KEY] = (LLSD::Integer)mControls->getCurrentIndex();
//Don't fill in current URL: this is only supposed to get changed via navigate
// fill_me_in[LLMediaEntry::CURRENT_URL_KEY] = mCurrentURL->getValue();
- fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = mHeightPixels->getValue();
+ fill_me_in[LLMediaEntry::HEIGHT_PIXELS_KEY] = (LLSD::Integer)mHeightPixels->getValue();
// Don't fill in the home URL if it is the special "Multiple Media" string!
if (LLTrans::getString("Multiple Media") != mHomeURL->getValue())
- fill_me_in[LLMediaEntry::HOME_URL_KEY] = mHomeURL->getValue();
- fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = mFirstClick->getValue();
- fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = mWidthPixels->getValue();
+ fill_me_in[LLMediaEntry::HOME_URL_KEY] = (LLSD::String)mHomeURL->getValue();
+ fill_me_in[LLMediaEntry::FIRST_CLICK_INTERACT_KEY] = (LLSD::Boolean)mFirstClick->getValue();
+ fill_me_in[LLMediaEntry::WIDTH_PIXELS_KEY] = (LLSD::Integer)mWidthPixels->getValue();
}
////////////////////////////////////////////////////////////////////////////////
@@ -461,7 +481,7 @@ bool LLPanelMediaSettingsGeneral::navigateHomeSelectedFace(bool only_if_current_
selected_objects->getSelectedTEValue( &functor_navigate_media, all_face_media_navigated );
// Note: we don't update the 'current URL' field until the media data itself changes
-
+
return all_face_media_navigated;
}
@@ -477,7 +497,6 @@ const std::string LLPanelMediaSettingsGeneral::getHomeUrl()
void LLPanelMediaSettingsGeneral::updateCurrentUrl()
{
// Get the current URL from the selection
-
const LLMediaEntry default_media_data;
std::string value_str = default_media_data.getCurrentURL();
struct functor_getter_current_url : public LLSelectedTEGetFunctor< std::string >
diff --git a/indra/newview/llpanelmediasettingsgeneral.h b/indra/newview/llpanelmediasettingsgeneral.h
index f8b8f0d224..7782b25d63 100644
--- a/indra/newview/llpanelmediasettingsgeneral.h
+++ b/indra/newview/llpanelmediasettingsgeneral.h
@@ -42,6 +42,7 @@ class LLLineEditor;
class LLSpinCtrl;
class LLTextureCtrl;
class LLMediaCtrl;
+class LLTextBox;
class LLFloaterMediaSettings;
class LLPanelMediaSettingsGeneral : public LLPanel
@@ -87,6 +88,8 @@ private:
static bool isMultiple();
+ void checkHomeUrlPassesWhitelist();
+
LLComboBox* mControls;
LLCheckBoxCtrl* mAutoLoop;
LLCheckBoxCtrl* mFirstClick;
@@ -98,6 +101,7 @@ private:
LLLineEditor* mHomeURL;
LLLineEditor* mCurrentURL;
LLMediaCtrl* mPreviewMedia;
+ LLTextBox* mFailWhiteListText;
};
#endif // LL_LLPANELMEDIAMEDIASETTINGSGENERAL_H
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index 94e137b0f4..d87c7608d5 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -46,8 +46,10 @@
#include "llsdutil.h"
#include "llselectmgr.h"
#include "llmediaentry.h"
+#include "lltextbox.h"
#include "llfloaterwhitelistentry.h"
#include "llfloatermediasettings.h"
+
////////////////////////////////////////////////////////////////////////////////
//
LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
@@ -55,9 +57,9 @@ LLPanelMediaSettingsSecurity::LLPanelMediaSettingsSecurity() :
{
mCommitCallbackRegistrar.add("Media.whitelistAdd", boost::bind(&LLPanelMediaSettingsSecurity::onBtnAdd, this));
mCommitCallbackRegistrar.add("Media.whitelistDelete", boost::bind(&LLPanelMediaSettingsSecurity::onBtnDel, this));
+
// build dialog from XML
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_media_settings_security.xml");
-
}
////////////////////////////////////////////////////////////////////////////////
@@ -66,6 +68,7 @@ BOOL LLPanelMediaSettingsSecurity::postBuild()
{
mEnableWhiteList = getChild< LLCheckBoxCtrl >( LLMediaEntry::WHITELIST_ENABLE_KEY );
mWhiteListList = getChild< LLScrollListCtrl >( LLMediaEntry::WHITELIST_KEY );
+ mHomeUrlFailsWhiteListText = getChild<LLTextBox>( "home_url_fails_whitelist" );
setDefaultBtn("whitelist_add");
@@ -84,30 +87,6 @@ void LLPanelMediaSettingsSecurity::draw()
{
// housekeeping
LLPanel::draw();
-
- // if list is empty, disable DEL button and checkbox to enable use of list
- if ( mWhiteListList->isEmpty() )
- {
- childSetEnabled( "whitelist_del", false );
- childSetEnabled( LLMediaEntry::WHITELIST_KEY, false );
- childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, false );
- }
- else
- {
- childSetEnabled( "whitelist_del", true );
- childSetEnabled( LLMediaEntry::WHITELIST_KEY, true );
- childSetEnabled( LLMediaEntry::WHITELIST_ENABLE_KEY, true );
- };
-
- // if nothing is selected, disable DEL button
- if ( mWhiteListList->getSelectedValue().asString().empty() )
- {
- childSetEnabled( "whitelist_del", false );
- }
- else
- {
- childSetEnabled( "whitelist_del", true );
- };
}
////////////////////////////////////////////////////////////////////////////////
@@ -179,9 +158,8 @@ void LLPanelMediaSettingsSecurity::initValues( void* userdata, const LLSD& media
LLSD::array_iterator iter = url_list.beginArray();
while( iter != url_list.endArray() )
{
- // TODO: is iter guaranteed to be valid here?
- std::string url = *iter;
- list->addSimpleElement( url );
+ std::string entry = *iter;
+ self->addWhiteListEntry( entry );
++iter;
};
};
@@ -213,18 +191,21 @@ void LLPanelMediaSettingsSecurity::preApply()
//
void LLPanelMediaSettingsSecurity::getValues( LLSD &fill_me_in )
{
- fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = mEnableWhiteList->getValue();
+ fill_me_in[LLMediaEntry::WHITELIST_ENABLE_KEY] = (LLSD::Boolean)mEnableWhiteList->getValue();
// iterate over white list and extract items
- std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
- std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
+ std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData();
+ std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin();
+
// *NOTE: need actually set the key to be an emptyArray(), or the merge
// we do with this LLSD will think there's nothing to change.
fill_me_in[LLMediaEntry::WHITELIST_KEY] = LLSD::emptyArray();
- while( iter != white_list_items.end() )
+ while( iter != whitelist_items.end() )
{
- std::string white_list_url = (*iter)->getValue().asString();
- fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( white_list_url );
+ LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN );
+ std::string whitelist_url = cell->getValue().asString();
+
+ fill_me_in[ LLMediaEntry::WHITELIST_KEY ].append( whitelist_url );
++iter;
};
}
@@ -260,11 +241,8 @@ const std::string LLPanelMediaSettingsSecurity::makeValidUrl( const std::string&
///////////////////////////////////////////////////////////////////////////////
// wrapper for testing a URL against the whitelist. We grab entries from
-// white list list box widget and build a list to test against. Can also
-// optionally pass the URL that you are trying to add to the widget since
-// it won't be added until this call returns.
-bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url,
- const std::string& test_url )
+// white list list box widget and build a list to test against.
+bool LLPanelMediaSettingsSecurity::urlPassesWhiteList( const std::string& test_url )
{
// the checkUrlAgainstWhitelist(..) function works on a vector
// of strings for the white list entries - in this panel, the white list
@@ -273,20 +251,18 @@ bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url
whitelist_strings.clear(); // may not be required - I forget what the spec says.
// step through whitelist widget entries and grab them as strings
- std::vector< LLScrollListItem* > white_list_items = mWhiteListList->getAllData();
- std::vector< LLScrollListItem* >::iterator iter = white_list_items.begin();
- while( iter != white_list_items.end() )
+ std::vector< LLScrollListItem* > whitelist_items = mWhiteListList->getAllData();
+ std::vector< LLScrollListItem* >::iterator iter = whitelist_items.begin();
+ while( iter != whitelist_items.end() )
{
- const std::string whitelist_url = (*iter)->getValue().asString();
+ LLScrollListCell* cell = (*iter)->getColumn( ENTRY_COLUMN );
+ std::string whitelist_url = cell->getValue().asString();
+
whitelist_strings.push_back( whitelist_url );
++iter;
};
- // add in the URL that might be added to the whitelist so we can test that too
- if ( added_url.length() )
- whitelist_strings.push_back( added_url );
-
// possible the URL is just a fragment so we validize it
const std::string valid_url = makeValidUrl( test_url );
@@ -296,32 +272,68 @@ bool LLPanelMediaSettingsSecurity::passesWhiteList( const std::string& added_url
///////////////////////////////////////////////////////////////////////////////
//
-void LLPanelMediaSettingsSecurity::addWhiteListItem(const std::string& url)
+void LLPanelMediaSettingsSecurity::updateWhitelistEnableStatus()
{
- // grab home URL from the general panel (via the parent floater)
+ // get the value for home URL and make it a valid URL
+ const std::string valid_url = makeValidUrl( mParent->getHomeUrl() );
+
+ // now check to see if the home url passes the whitelist in its entirity
+ if ( urlPassesWhiteList( valid_url ) )
+ {
+ mEnableWhiteList->setEnabled( true );
+ mHomeUrlFailsWhiteListText->setVisible( false );
+ }
+ else
+ {
+ mEnableWhiteList->set( false );
+ mEnableWhiteList->setEnabled( false );
+ mHomeUrlFailsWhiteListText->setVisible( true );
+ };
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// Add an entry to the whitelist scrollbox and indicate if the current
+// home URL passes this entry or not using an icon
+void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
+{
+ // grab the home url
std::string home_url( "" );
if ( mParent )
home_url = mParent->getHomeUrl();
- // if the home URL is blank (user hasn't entered it yet) then
- // don't bother to check if it passes the white list
- if ( home_url.empty() )
- {
- mWhiteListList->addSimpleElement( url );
- return;
- };
+ // try to make a valid URL based on what the user entered - missing scheme for example
+ const std::string valid_url = makeValidUrl( home_url );
+
+ // check the home url against this single whitelist entry
+ std::vector< std::string > whitelist_entries;
+ whitelist_entries.push_back( entry );
+ bool home_url_passes_entry = LLMediaEntry::checkUrlAgainstWhitelist( valid_url, whitelist_entries );
- // if the URL passes the white list, add it
- if ( passesWhiteList( url, home_url ) )
+ // build an icon cell based on whether or not the home url pases it or not
+ LLSD row;
+ if ( home_url_passes_entry || home_url.empty() )
{
- mWhiteListList->addSimpleElement( url );
+ row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
+ row[ "columns" ][ ICON_COLUMN ][ "value" ] = "";
+ row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
}
else
- // display a message indicating you can't do that
{
- LLNotificationsUtil::add("WhiteListInvalidatesHomeUrl");
+ row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
+ row[ "columns" ][ ICON_COLUMN ][ "value" ] = "parcel_color_EXP";
+ row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
};
-}
+
+ // always add in the entry itself
+ row[ "columns" ][ ENTRY_COLUMN ][ "type" ] = "text";
+ row[ "columns" ][ ENTRY_COLUMN ][ "value" ] = entry;
+
+ // add to the white list scroll box
+ mWhiteListList->addElement( row );
+
+ // update whitelist enable checkbox based on whether the home url passes the whitelist
+ updateWhitelistEnableStatus();
+};
///////////////////////////////////////////////////////////////////////////////
// static
@@ -337,6 +349,9 @@ void LLPanelMediaSettingsSecurity::onBtnDel( void* userdata )
LLPanelMediaSettingsSecurity *self =(LLPanelMediaSettingsSecurity *)userdata;
self->mWhiteListList->deleteSelectedItems();
+
+ // contents of whitelist changed so recheck it against home url
+ self->updateWhitelistEnableStatus();
}
////////////////////////////////////////////////////////////////////////////////
@@ -345,4 +360,3 @@ void LLPanelMediaSettingsSecurity::setParent( LLFloaterMediaSettings* parent )
{
mParent = parent;
};
-
diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h
index 638664e59d..937bfb1bf9 100644
--- a/indra/newview/llpanelmediasettingssecurity.h
+++ b/indra/newview/llpanelmediasettingssecurity.h
@@ -37,6 +37,7 @@
class LLCheckBoxCtrl;
class LLScrollListCtrl;
+class LLTextBox;
class LLFloaterMediaSettings;
class LLPanelMediaSettingsSecurity : public LLPanel
@@ -58,18 +59,27 @@ public:
static void initValues( void* userdata, const LLSD& media_settings,bool editable );
static void clearValues( void* userdata, bool editable);
- void addWhiteListItem(const std::string& url);
+ void addWhiteListEntry( const std::string& url );
void setParent( LLFloaterMediaSettings* parent );
+ bool urlPassesWhiteList( const std::string& test_url );
const std::string makeValidUrl( const std::string& src_url );
- bool passesWhiteList( const std::string& added_url, const std::string& test_url );
protected:
LLFloaterMediaSettings* mParent;
private:
+ enum ColumnIndex
+ {
+ ICON_COLUMN = 0,
+ ENTRY_COLUMN = 1,
+ };
+
LLCheckBoxCtrl* mEnableWhiteList;
LLScrollListCtrl* mWhiteListList;
-
+ LLTextBox* mHomeUrlFailsWhiteListText;
+
+ void updateWhitelistEnableStatus();
+
static void onBtnAdd(void*);
static void onBtnDel(void*);
};
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 5af26c1ad9..951e74abf9 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -144,16 +144,13 @@ void LLPanelOutfitsInventory::onNew()
{
const std::string& outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
-
- getRootFolder()->setSelectionByID(outfit_folder, TRUE);
- getRootFolder()->setNeedsAutoRename(TRUE);
}
void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
updateListCommands();
updateParent();
- if (getRootFolder()->needsAutoRename())
+ if (getRootFolder()->needsAutoRename() && items.size())
{
getRootFolder()->startRenamingSelectedItem();
getRootFolder()->setNeedsAutoRename(FALSE);
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index 7769a7d172..aa0ab4efbc 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -65,10 +65,12 @@ public:
// Otherwise, return NULL.
LLFolderViewEventListener* getCorrectListenerForAction();
void setParent(LLSidepanelAppearance *parent);
+
+ LLFolderView* getRootFolder();
+
protected:
void updateParent();
bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
- LLFolderView* getRootFolder();
private:
LLSidepanelAppearance* mParent;
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index e6b6ec64bd..6771bb4170 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -73,6 +73,8 @@ static const std::string FRIENDS_TAB_NAME = "friends_panel";
static const std::string GROUP_TAB_NAME = "groups_panel";
static const std::string RECENT_TAB_NAME = "recent_panel";
+static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
+
/** Comparator for comparing avatar items by last interaction date */
class LLAvatarItemRecentComparator : public LLAvatarItemComparator
{
@@ -467,7 +469,7 @@ LLPanelPeople::~LLPanelPeople()
}
-void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list)
+void LLPanelPeople::onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list)
{
if(!avatar_list)
{
@@ -477,6 +479,7 @@ void LLPanelPeople::onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAva
bool expanded = param.asBoolean();
+ setAccordionCollapsedByUser(ctrl, !expanded);
if(!expanded)
{
avatar_list->resetSelection();
@@ -550,11 +553,11 @@ BOOL LLPanelPeople::postBuild()
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>("tab_all");
accordion_tab->setDropDownStateChangedCallback(
- boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mAllFriendList));
+ boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mAllFriendList));
accordion_tab = getChild<LLAccordionCtrlTab>("tab_online");
accordion_tab->setDropDownStateChangedCallback(
- boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList));
+ boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _1, _2, mOnlineFriendList));
buttonSetAction("view_profile_btn", boost::bind(&LLPanelPeople::onViewProfileButtonClicked, this));
buttonSetAction("group_info_btn", boost::bind(&LLPanelPeople::onGroupInfoButtonClicked, this));
@@ -760,7 +763,13 @@ void LLPanelPeople::updateButtons()
LLPanel* cur_panel = mTabContainer->getCurrentPanel();
if (cur_panel)
+ {
cur_panel->childSetEnabled("add_friend_btn", !is_friend);
+ if (friends_tab_active)
+ {
+ cur_panel->childSetEnabled("del_btn", multiple_selected);
+ }
+ }
}
buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
@@ -931,6 +940,9 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
mRecentList->setNameFilter(mFilterSubString);
mGroupList->setNameFilter(mFilterSubString);
+ setAccordionCollapsedByUser("tab_online", false);
+ setAccordionCollapsedByUser("tab_all", false);
+
showFriendsAccordionsIfNeeded();
}
@@ -1309,8 +1321,12 @@ void LLPanelPeople::showAccordion(const std::string name, bool show)
tab->setVisible(show);
if(show)
{
- // expand accordion
- tab->changeOpenClose(false);
+ // don't expand accordion if it was collapsed by user
+ if(!isAccordionCollapsedByUser(tab))
+ {
+ // expand accordion
+ tab->changeOpenClose(false);
+ }
}
}
@@ -1342,3 +1358,44 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
accordion->arrange();
}
+
+void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
+{
+ if(!acc_tab)
+ {
+ llwarns << "Invalid parameter" << llendl;
+ return;
+ }
+
+ LLSD param = acc_tab->getValue();
+ param[COLLAPSED_BY_USER] = collapsed;
+ acc_tab->setValue(param);
+}
+
+void LLPanelPeople::setAccordionCollapsedByUser(const std::string& name, bool collapsed)
+{
+ setAccordionCollapsedByUser(getChild<LLUICtrl>(name), collapsed);
+}
+
+bool LLPanelPeople::isAccordionCollapsedByUser(LLUICtrl* acc_tab)
+{
+ if(!acc_tab)
+ {
+ llwarns << "Invalid parameter" << llendl;
+ return false;
+ }
+
+ LLSD param = acc_tab->getValue();
+ if(!param.has(COLLAPSED_BY_USER))
+ {
+ return false;
+ }
+ return param[COLLAPSED_BY_USER].asBoolean();
+}
+
+bool LLPanelPeople::isAccordionCollapsedByUser(const std::string& name)
+{
+ return isAccordionCollapsedByUser(getChild<LLUICtrl>(name));
+}
+
+// EOF
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index d9dd76f3ac..5ac5bcc1d7 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -127,7 +127,7 @@ private:
const std::vector<LLUUID>& ids,
void*);
- void onFriendsAccordionExpandedCollapsed(const LLSD& param, LLAvatarList* avatar_list);
+ void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);
void showAccordion(const std::string name, bool show);
@@ -135,6 +135,11 @@ private:
void onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param);
+ void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
+ void setAccordionCollapsedByUser(const std::string& name, bool collapsed);
+ bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
+ bool isAccordionCollapsedByUser(const std::string& name);
+
LLFilterEditor* mFilterEditor;
LLTabContainer* mTabContainer;
LLAvatarList* mOnlineFriendList;
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index b17b6d6fe9..b21b1c64b1 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -86,6 +86,9 @@ public:
// parent panels failed to work (picks related code was in my profile panel)
void setProfilePanel(LLPanelProfile* profile_panel);
+protected:
+ /*virtual*/void updateButtons();
+
private:
void onClickDelete();
void onClickTeleport();
@@ -125,7 +128,6 @@ private:
bool callbackDeleteClassified(const LLSD& notification, const LLSD& response);
bool callbackTeleport(const LLSD& notification, const LLSD& response);
- void updateButtons();
virtual void onDoubleClickPickItem(LLUICtrl* item);
virtual void onDoubleClickClassifiedItem(LLUICtrl* item);
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 71c1b0cbb9..e86123d565 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -66,10 +66,6 @@
glh::matrix4f glh_get_current_modelview();
glh::matrix4f glh_get_current_projection();
-const F32 ZOOM_NEAR_PADDING = 1.0f;
-const F32 ZOOM_MEDIUM_PADDING = 1.15f;
-const F32 ZOOM_FAR_PADDING = 1.5f;
-
// Warning: make sure these two match!
const LLPanelPrimMediaControls::EZoomLevel LLPanelPrimMediaControls::kZoomLevels[] = { ZOOM_NONE, ZOOM_MEDIUM };
const int LLPanelPrimMediaControls::kNumZoomLevels = 2;
@@ -86,7 +82,13 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mUpdateSlider(true),
mClearFaceOnFade(false),
mCurrentRate(0.0),
- mMovieDuration(0.0)
+ mMovieDuration(0.0),
+ mTargetObjectID(LLUUID::null),
+ mTargetObjectFace(0),
+ mTargetImplID(LLUUID::null),
+ mTargetObjectNormal(LLVector3::zero),
+ mZoomObjectID(LLUUID::null),
+ mZoomObjectFace(0)
{
mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -152,6 +154,11 @@ BOOL LLPanelPrimMediaControls::postBuild()
mRightBookend = getChild<LLUICtrl>("right_bookend");
mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
LLStringUtil::convertToF32(getString("skip_step"), mSkipStep);
+ LLStringUtil::convertToS32(getString("min_width"), mMinWidth);
+ LLStringUtil::convertToS32(getString("min_height"), mMinHeight);
+ LLStringUtil::convertToF32(getString("zoom_near_padding"), mZoomNearPadding);
+ LLStringUtil::convertToF32(getString("zoom_medium_padding"), mZoomMediumPadding);
+ LLStringUtil::convertToF32(getString("zoom_far_padding"), mZoomFarPadding);
// These are currently removed...but getChild creates a "dummy" widget.
// This class handles them missing.
@@ -257,9 +264,6 @@ LLPluginClassMedia* LLPanelPrimMediaControls::getTargetMediaPlugin()
void LLPanelPrimMediaControls::updateShape()
{
- const S32 MIN_HUD_WIDTH=400;
- const S32 MIN_HUD_HEIGHT=120;
-
LLViewerMediaImpl* media_impl = getTargetMediaImpl();
LLViewerObject* objectp = getTargetObject();
@@ -279,7 +283,7 @@ void LLPanelPrimMediaControls::updateShape()
bool can_navigate = parcel->getMediaAllowNavigate();
bool enabled = false;
- bool is_zoomed = (mCurrentZoom != ZOOM_NONE);
+ bool is_zoomed = (mCurrentZoom != ZOOM_NONE) && (mTargetObjectID == mZoomObjectID) && (mTargetObjectFace == mZoomObjectFace);
// There is no such thing as "has_focus" being different from normal controls set
// anymore (as of user feedback from bri 10/09). So we cheat here and force 'has_focus'
// to 'true' (or, actually, we use a setting)
@@ -309,7 +313,7 @@ void LLPanelPrimMediaControls::updateShape()
mStopCtrl->setVisible(false);
mHomeCtrl->setVisible(has_focus);
mZoomCtrl->setVisible(!is_zoomed);
- mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+ mUnzoomCtrl->setVisible(is_zoomed);
mOpenCtrl->setVisible(true);
mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -332,13 +336,12 @@ void LLPanelPrimMediaControls::updateShape()
if(media_plugin && media_plugin->pluginSupportsMediaTime())
{
- mReloadCtrl->setEnabled(FALSE);
- mReloadCtrl->setVisible(FALSE);
+ mReloadCtrl->setEnabled(false);
+ mReloadCtrl->setVisible(false);
mMediaStopCtrl->setVisible(has_focus);
- mHomeCtrl->setVisible(FALSE);
- // No nav controls
- mBackCtrl->setVisible(FALSE);
- mFwdCtrl->setEnabled(FALSE);
+ mHomeCtrl->setVisible(has_focus);
+ mBackCtrl->setVisible(false);
+ mFwdCtrl->setVisible(false);
mMediaAddressCtrl->setVisible(false);
mMediaAddressCtrl->setEnabled(false);
mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
@@ -416,7 +419,6 @@ void LLPanelPrimMediaControls::updateShape()
mPlayCtrl->setVisible(FALSE);
mPauseCtrl->setEnabled(TRUE);
mPauseCtrl->setVisible(has_focus);
- mMediaStopCtrl->setEnabled(TRUE);
break;
case LLPluginClassMediaOwner::MEDIA_PAUSED:
@@ -425,7 +427,6 @@ void LLPanelPrimMediaControls::updateShape()
mPauseCtrl->setVisible(FALSE);
mPlayCtrl->setEnabled(TRUE);
mPlayCtrl->setVisible(has_focus);
- mMediaStopCtrl->setEnabled(FALSE);
break;
}
}
@@ -508,12 +509,10 @@ void LLPanelPrimMediaControls::updateShape()
{
mMediaProgressPanel->setVisible(true);
mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
- gFocusMgr.setTopCtrl(mMediaProgressPanel);
}
- else if (mMediaProgressPanel->getVisible())
+ else
{
mMediaProgressPanel->setVisible(false);
- gFocusMgr.setTopCtrl(NULL);
}
}
@@ -599,12 +598,12 @@ void LLPanelPrimMediaControls::updateShape()
}
LLCoordGL screen_min;
- screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (min.mV[VX] + 1.f) * 0.5f);
- screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (min.mV[VY] + 1.f) * 0.5f);
+ screen_min.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (min.mV[VX] + 1.f) * 0.5f);
+ screen_min.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (min.mV[VY] + 1.f) * 0.5f);
LLCoordGL screen_max;
- screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthRaw() * (max.mV[VX] + 1.f) * 0.5f);
- screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightRaw() * (max.mV[VY] + 1.f) * 0.5f);
+ screen_max.mX = llround((F32)gViewerWindow->getWorldViewWidthScaled() * (max.mV[VX] + 1.f) * 0.5f);
+ screen_max.mY = llround((F32)gViewerWindow->getWorldViewHeightScaled() * (max.mV[VY] + 1.f) * 0.5f);
// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
LLRect media_controls_rect;
@@ -613,14 +612,15 @@ void LLPanelPrimMediaControls::updateShape()
media_controls_rect.mBottom -= mMediaRegion->getRect().mBottom;
media_controls_rect.mTop += getRect().getHeight() - mMediaRegion->getRect().mTop;
media_controls_rect.mRight += getRect().getWidth() - mMediaRegion->getRect().mRight;
-
- LLRect old_hud_rect = media_controls_rect;
+
// keep all parts of HUD on-screen
media_controls_rect.intersectWith(getParent()->getLocalRect());
+ if (mCurrentZoom != ZOOM_NONE)
+ media_controls_rect.mBottom -= mMediaControlsStack->getRect().getHeight() + mMediaProgressPanel->getRect().getHeight();
// clamp to minimum size, keeping centered
media_controls_rect.setCenterAndSize(media_controls_rect.getCenterX(), media_controls_rect.getCenterY(),
- llmax(MIN_HUD_WIDTH, media_controls_rect.getWidth()), llmax(MIN_HUD_HEIGHT, media_controls_rect.getHeight()));
+ llmax(mMinWidth, media_controls_rect.getWidth()), llmax(mMinHeight, media_controls_rect.getHeight()));
setShape(media_controls_rect, true);
@@ -968,17 +968,17 @@ void LLPanelPrimMediaControls::updateZoom()
}
case ZOOM_FAR:
{
- zoom_padding = ZOOM_FAR_PADDING;
+ zoom_padding = mZoomFarPadding;
break;
}
case ZOOM_MEDIUM:
{
- zoom_padding = ZOOM_MEDIUM_PADDING;
+ zoom_padding = mZoomMediumPadding;
break;
}
case ZOOM_NEAR:
{
- zoom_padding = ZOOM_NEAR_PADDING;
+ zoom_padding = mZoomNearPadding;
break;
}
default:
@@ -988,9 +988,16 @@ void LLPanelPrimMediaControls::updateZoom()
}
}
- if (zoom_padding > 0.0f)
+ if (zoom_padding > 0.0f)
+ {
LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+ }
+
+ // Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
+ mZoomObjectID = mTargetObjectID;
+ mZoomObjectFace = mTargetObjectFace;
}
+
void LLPanelPrimMediaControls::onScrollUp(void* user_data)
{
LLPanelPrimMediaControls* this_panel = static_cast<LLPanelPrimMediaControls*> (user_data);
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index accfb72a04..fe8f100abe 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -160,6 +160,11 @@ private:
LLUICtrl *mRightBookend;
LLUIImage* mBackgroundImage;
F32 mSkipStep;
+ S32 mMinWidth;
+ S32 mMinHeight;
+ F32 mZoomNearPadding;
+ F32 mZoomMediumPadding;
+ F32 mZoomFarPadding;
LLUICtrl *mMediaPanelScroll;
LLButton *mScrollUpCtrl;
@@ -190,6 +195,9 @@ private:
S32 mTargetObjectFace;
LLUUID mTargetImplID;
LLVector3 mTargetObjectNormal;
+
+ LLUUID mZoomObjectID;
+ S32 mZoomObjectFace;
};
#endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index b82b994540..327048d4f3 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -52,6 +52,8 @@
// Used to limit time spent for items list update per frame.
static const U32 ADD_LIMIT = 50;
+static const std::string COLLAPSED_BY_USER = "collapsed_by_user";
+
class LLTeleportHistoryFlatItem : public LLPanel
{
public:
@@ -254,6 +256,10 @@ BOOL LLTeleportHistoryPanel::postBuild()
LLAccordionCtrlTab* tab = (LLAccordionCtrlTab*)*iter;
tab->setRightMouseDownCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionTabRightClick, this, _1, _2, _3, _4));
tab->setDisplayChildren(false);
+ tab->setDropDownStateChangedCallback(boost::bind(&LLTeleportHistoryPanel::onAccordionExpand, this, _1, _2));
+
+ // All accordion tabs are collapsed initially
+ setAccordionCollapsedByUser(tab, true);
mItemContainers.put(tab);
@@ -270,10 +276,18 @@ BOOL LLTeleportHistoryPanel::postBuild()
// Open first 2 accordion tabs
if (mItemContainers.size() > 1)
- mItemContainers.get(mItemContainers.size() - 1)->setDisplayChildren(true);
+ {
+ LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1);
+ tab->setDisplayChildren(true);
+ setAccordionCollapsedByUser(tab, false);
+ }
if (mItemContainers.size() > 2)
- mItemContainers.get(mItemContainers.size() - 2)->setDisplayChildren(true);
+ {
+ LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 2);
+ tab->setDisplayChildren(true);
+ setAccordionCollapsedByUser(tab, false);
+ }
}
getChild<LLPanel>("bottom_panel")->childSetAction("gear_btn",boost::bind(&LLTeleportHistoryPanel::onGearButtonClicked, this));
@@ -491,6 +505,18 @@ void LLTeleportHistoryPanel::refresh()
LLAccordionCtrlTab* tab = mItemContainers.get(mItemContainers.size() - 1 - tab_idx);
tab->setVisible(true);
+ // Expand all accordion tabs when filtering
+ if(!mFilterSubString.empty())
+ {
+ tab->setDisplayChildren(true);
+ }
+ // Restore each tab's expand state when not filtering
+ else
+ {
+ bool collapsed = isAccordionCollapsedByUser(tab);
+ tab->setDisplayChildren(!collapsed);
+ }
+
curr_flat_view = getFlatListViewFromTab(tab);
}
@@ -775,3 +801,26 @@ void LLTeleportHistoryPanel::onGearButtonClicked()
LLMenuGL::showPopup(this, menu, menu_x, menu_y);
}
+void LLTeleportHistoryPanel::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
+{
+ LLSD param = acc_tab->getValue();
+ param[COLLAPSED_BY_USER] = collapsed;
+ acc_tab->setValue(param);
+}
+
+bool LLTeleportHistoryPanel::isAccordionCollapsedByUser(LLUICtrl* acc_tab)
+{
+ LLSD param = acc_tab->getValue();
+ if(!param.has("acc_collapsed"))
+ {
+ return false;
+ }
+ return param[COLLAPSED_BY_USER].asBoolean();
+}
+
+void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param)
+{
+ bool expanded = param.asBoolean();
+ // Save accordion tab state to restore it in refresh()
+ setAccordionCollapsedByUser(ctrl, !expanded);
+}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index a31ff34cb6..f646fea355 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -98,6 +98,10 @@ private:
LLFlatListView* getFlatListViewFromTab(LLAccordionCtrlTab *);
void onGearButtonClicked();
+ void setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed);
+ bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
+ void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param);
+
LLTeleportHistoryStorage* mTeleportHistory;
LLAccordionCtrl* mHistoryAccordion;
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 4ee9cba69c..07a1214b4f 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -47,10 +47,11 @@
#if LL_MSVC
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
-LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list):
+LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/):
mSpeakerMgr(data_source),
mAvatarList(avatar_list),
mSortOrder(E_SORT_BY_NAME)
+, mParticipantListMenu(NULL)
{
mSpeakerAddListener = new SpeakerAddListener(*this);
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
@@ -68,8 +69,15 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
// Set onAvatarListDoubleClicked as default on_return action.
mAvatarList->setReturnCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, mAvatarList));
- mParticipantListMenu = new LLParticipantListMenu(*this);
- mAvatarList->setContextMenu(mParticipantListMenu);
+ if (use_context_menu)
+ {
+ mParticipantListMenu = new LLParticipantListMenu(*this);
+ mAvatarList->setContextMenu(mParticipantListMenu);
+ }
+ else
+ {
+ mAvatarList->setContextMenu(NULL);
+ }
//Lets fill avatarList with existing speakers
LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
@@ -79,12 +87,13 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
{
const LLPointer<LLSpeaker>& speakerp = *it;
- group_members.push_back(speakerp->mID);
+ addAvatarIDExceptAgent(group_members, speakerp->mID);
if ( speakerp->mIsModerator )
{
mModeratorList.insert(speakerp->mID);
}
}
+ mAvatarList->setDirty(true);
sort();
}
@@ -183,7 +192,7 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co
return true;
}
- group_members.push_back(uu_id);
+ addAvatarIDExceptAgent(group_members, uu_id);
// Mark AvatarList as dirty one
mAvatarList->setDirty();
sort();
@@ -251,6 +260,15 @@ void LLParticipantList::sort()
}
}
+// static
+void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id)
+{
+ if (gAgent.getID() != avatar_id)
+ {
+ existing_list.push_back(avatar_id);
+ }
+}
+
//
// LLParticipantList::SpeakerAddListener
//
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index 5e26c39fc8..460cf4b9ef 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -43,7 +43,7 @@ class LLParticipantList
{
LOG_CLASS(LLParticipantList);
public:
- LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list);
+ LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true);
~LLParticipantList();
void setSpeakingIndicatorsVisible(BOOL visible);
@@ -132,6 +132,11 @@ class LLParticipantList
void onAvatarListDoubleClicked(LLAvatarList* list);
void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
+ /**
+ * Adds specified avatar ID to the existing list if it is not Agent's ID
+ */
+ static void addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id);
+
LLSpeakerMgr* mSpeakerMgr;
LLAvatarList* mAvatarList;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 4394271ec4..1605838b94 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
// file include
+#define LLSELECTMGR_CPP
#include "llselectmgr.h"
// library includes
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 57e0ee4e0e..6641be335a 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -324,7 +324,9 @@ private:
typedef LLSafeHandle<LLObjectSelection> LLObjectSelectionHandle;
// Build time optimization, generate this once in .cpp file
-//extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
+#ifndef LLSELECTMGR_CPP
+extern template class LLSelectMgr* LLSingleton<class LLSelectMgr>::getInstance();
+#endif
class LLSelectMgr : public LLEditMenuHandler, public LLSingleton<LLSelectMgr>
{
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index ee5fa46c9c..ee62d689b5 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -583,6 +583,17 @@ void LLSideTray::expandSideBar()
mActiveTab->onOpen(key);
reflectCollapseChange();
+
+
+ std::string name = mActiveTab->getName();
+ std::map<std::string,LLButton*>::const_iterator btn_it =
+ mTabButtons.find(name);
+ if (btn_it != mTabButtons.end())
+ {
+ LLButton* btn = btn_it->second;
+ btn->setImageOverlay( mActiveTab->mImageSelected );
+ }
+
}
void LLSideTray::highlightFocused()
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 54f776ca6a..5edc4804ca 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -32,19 +32,14 @@
#include "llviewerprecompiledheaders.h" // must be first include
-#include "llagent.h"
-#include "llbottomtray.h"
+#include "llbutton.h"
#include "llfloaterreg.h"
-#include "llvoiceclient.h"
-#include "llvoicecontrolpanel.h"
-#include "lltransientfloatermgr.h"
-#include "llavatariconctrl.h"
-#include "llbutton.h"
-#include "llpanel.h"
-#include "lltextbox.h"
+#include "llagent.h"
+#include "llbottomtray.h"
+#include "llcallfloater.h"
#include "lloutputmonitorctrl.h"
-#include "llgroupmgr.h"
+#include "lltransientfloatermgr.h"
#include "llspeakbutton.h"
@@ -72,7 +67,6 @@ void LLSpeakButton::draw()
LLSpeakButton::LLSpeakButton(const Params& p)
: LLUICtrl(p)
-, mPrivateCallPanel(NULL)
, mOutputMonitor(NULL)
, mSpeakBtn(NULL)
, mShowBtn(NULL)
@@ -102,8 +96,8 @@ LLSpeakButton::LLSpeakButton(const Params& p)
addChild(mShowBtn);
LLTransientFloaterMgr::getInstance()->addControlView(mShowBtn);
- mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
- mShowBtn->setToggleState(FALSE);
+// mShowBtn->setClickedCallback(boost::bind(&LLSpeakButton::onClick_ShowBtn, this));
+// mShowBtn->setToggleState(FALSE);
static const S32 MONITOR_RIGHT_PAD = 2;
@@ -175,42 +169,3 @@ void LLSpeakButton::onMouseUp_SpeakBtn()
gVoiceClient->inputUserControlState(down);
}
-void LLSpeakButton::onClick_ShowBtn()
-{
- if(!mShowBtn->getToggleState())
- {
- mPrivateCallPanel->onClickClose(mPrivateCallPanel);
- delete mPrivateCallPanel;
- mPrivateCallPanel = NULL;
- mShowBtn->setToggleState(FALSE);
- return;
- }
-
- S32 x = mSpeakBtn->getRect().mLeft;
- S32 y = 0;
-
- localPointToScreen(x, y, &x, &y);
-
- mPrivateCallPanel = new LLVoiceControlPanel;
- getRootView()->addChild(mPrivateCallPanel);
-
- y = LLBottomTray::getInstance()->getRect().getHeight() + mPrivateCallPanel->getRect().getHeight();
-
- LLRect rect;
- rect.setLeftTopAndSize(x, y, mPrivateCallPanel->getRect().getWidth(), mPrivateCallPanel->getRect().getHeight());
- mPrivateCallPanel->setRect(rect);
-
-
- LLAvatarListItem* item = new LLAvatarListItem();
- item->showLastInteractionTime(false);
- item->showInfoBtn(true);
- item->showSpeakingIndicator(true);
- item->reshape(mPrivateCallPanel->getRect().getWidth(), item->getRect().getHeight(), FALSE);
-
- mPrivateCallPanel->addItem(item);
- mPrivateCallPanel->setVisible(TRUE);
- mPrivateCallPanel->setFrontmost(TRUE);
-
- mShowBtn->setToggleState(TRUE);
-}
-
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index 424ee5357a..6660b50240 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -36,7 +36,7 @@
#include "llinitparam.h"
#include "lluictrl.h"
-class LLVoiceControlPanel;
+class LLCallFloater;
class LLButton;
class LLOutputMonitorCtrl;
@@ -86,12 +86,10 @@ protected:
void onMouseDown_SpeakBtn();
void onMouseUp_SpeakBtn();
- void onClick_ShowBtn();
-
private:
LLButton* mSpeakBtn;
LLButton* mShowBtn;
- LLVoiceControlPanel* mPrivateCallPanel;
+ LLHandle<LLFloater> mPrivateCallPanel;
LLOutputMonitorCtrl* mOutputMonitor;
};
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index e7fe85bdf0..db8bda008e 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -101,7 +101,6 @@
#include "llfeaturemanager.h"
#include "llfirstuse.h"
#include "llfloaterchat.h"
-#include "llfloatergesture.h"
#include "llfloaterhud.h"
#include "llfloaterland.h"
#include "llfloaterpreference.h"
@@ -299,23 +298,6 @@ namespace
};
}
-class LLGestureInventoryFetchObserver : public LLInventoryFetchObserver
-{
-public:
- LLGestureInventoryFetchObserver() {}
- virtual void done()
- {
- // we've downloaded all the items, so repaint the dialog
- LLFloaterGesture* floater = LLFloaterReg::findTypedInstance<LLFloaterGesture>("gestures");
- if (floater)
- {
- floater->refreshAll();
- }
- gInventory.removeObserver(this);
- delete this;
- }
-};
-
void update_texture_fetch()
{
LLAppViewer::getTextureCache()->update(1); // unpauses the texture cache thread
@@ -1825,11 +1807,8 @@ bool idle_startup()
item_ids.push_back(item_id);
}
}
-
- LLGestureInventoryFetchObserver* fetch = new LLGestureInventoryFetchObserver();
- fetch->fetchItems(item_ids);
- // deletes itself when done
- gInventory.addObserver(fetch);
+ // no need to add gesture to inventory observer, it's already made in constructor
+ LLGestureManager::instance().fetchItems(item_ids);
}
}
gDisplaySwapBuffers = TRUE;
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index dc22a243eb..4915720036 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -42,6 +42,7 @@
#include "llfloaterbuycurrency.h"
#include "llfloaterchat.h"
#include "llfloaterlagmeter.h"
+#include "llfloatervolumepulldown.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
#include "llhudicon.h"
@@ -159,6 +160,7 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
+ mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
@@ -203,7 +205,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
addChild(mSGPacketLoss);
childSetActionTextbox("stat_btn", onClickStatGraph);
-
}
LLStatusBar::~LLStatusBar()
@@ -244,7 +245,6 @@ BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL LLStatusBar::postBuild()
{
-
gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
return TRUE;
@@ -506,6 +506,13 @@ static void onClickScriptDebug(void*)
LLFloaterScriptDebug::show(LLUUID::null);
}
+//static
+void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl)
+{
+ // show the master volume pull-down
+ LLFloaterReg::showInstance("volume_pulldown");
+}
+
static void onClickVolume(void* data)
{
// toggle the master mute setting
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index bdaacce981..f77cc1acb8 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -47,6 +47,7 @@ class LLUICtrl;
class LLUUID;
class LLFrameTimer;
class LLStatGraph;
+class LLPanelVolumePulldown;
class LLStatusBar
: public LLPanel
@@ -92,8 +93,8 @@ private:
void onVolumeChanged(const LLSD& newvalue);
+ static void onMouseEnterVolume(LLUICtrl* ctrl);
static void onClickStatGraph(void* data);
-
private:
LLTextBox *mTextHealth;
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index a90f3ee181..8d3dcf8a99 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -689,24 +689,24 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
}
}
+ LLGLSUIDefault gls_ui;
+ LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
+ gGL.setColorMask(true, true);
+
+ // clear buffer area to ensure we don't pick up UI elements
+ {
+ gGL.flush();
+ LLGLDisable no_alpha(GL_ALPHA_TEST);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.color4f( 0.f, 0.f, 0.f, 1.f );
+
+ gl_rect_2d_simple( width, height );
+
+ gGL.flush();
+ }
+
if (mIsVisible)
{
- LLGLSUIDefault gls_ui;
- LLGLDepthTest gls_depth(GL_FALSE, GL_FALSE);
- gGL.setColorMask(true, true);
-
- // clear buffer area to ensure we don't pick up UI elements
- {
- gGL.flush();
- LLGLDisable no_alpha(GL_ALPHA_TEST);
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.color4f( 0.f, 0.f, 0.f, 1.f );
-
- gl_rect_2d_simple( width, height );
-
- gGL.flush();
- }
-
// composite color layers
for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
@@ -723,6 +723,21 @@ BOOL LLTexLayerSet::render( S32 x, S32 y, S32 width, S32 height )
stop_glerror();
}
+ else
+ {
+ gGL.flush();
+
+ gGL.setSceneBlendType(LLRender::BT_REPLACE);
+ LLGLDisable no_alpha(GL_ALPHA_TEST);
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+ gGL.color4f( 0.f, 0.f, 0.f, 0.f );
+
+ gl_rect_2d_simple( width, height );
+ gGL.setSceneBlendType(LLRender::BT_ALPHA);
+
+ gGL.flush();
+
+ }
return success;
}
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 266fa4dd74..2d0a14dc70 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -31,53 +31,37 @@
*/
#include "llviewerprecompiledheaders.h"
-
-#include "message.h"
#include "lltooldraganddrop.h"
// library headers
-#include "llfloaterreg.h"
-#include "llinstantmessage.h"
-#include "lldir.h"
#include "llnotificationsutil.h"
-
// project headers
#include "llagent.h"
+#include "llagentui.h"
#include "llagentwearables.h"
-#include "llviewercontrol.h"
+#include "llappearancemgr.h"
+#include "lldictionary.h"
#include "llfirstuse.h"
-#include "llfloater.h"
+#include "llfloaterreg.h"
#include "llfloatertools.h"
-#include "llfocusmgr.h"
#include "llgesturemgr.h"
-#include "llhudeffecttrail.h"
#include "llhudmanager.h"
+#include "llhudeffecttrail.h"
+#include "llimview.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
#include "llmutelist.h"
-#include "llnotify.h"
#include "llpreviewnotecard.h"
#include "llrecentpeople.h"
+#include "llrootview.h"
#include "llselectmgr.h"
#include "lltoolmgr.h"
#include "lltooltip.h"
#include "lltrans.h"
-#include "llui.h"
-#include "llviewertexturelist.h"
-#include "llviewerinventory.h"
-#include "llviewerobject.h"
#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
-#include "llvolume.h"
#include "llworld.h"
-#include "object_flags.h"
-#include "llimview.h"
-#include "llrootview.h"
-#include "llagentui.h"
-#include "llappearancemgr.h"
// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES
// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a
@@ -358,134 +342,51 @@ void LLCategoryDropDescendentsObserver::done()
delete this;
}
-// This array is used to more easily control what happens when a 3d
-// drag and drop event occurs. Since there's an array of drop target
-// and cargo type, it's implemented as an array of pointers to member
-// functions which correctly carry out the actual drop.
-LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::sDragAndDrop3d[DAD_COUNT][LLToolDragAndDrop::DT_COUNT] =
-{
- // Source: DAD_NONE
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND
- },
- // Source: DAD_TEXTURE
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dTextureObject, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_SOUND
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_CALLINGCARD
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND
- },
- // Source: DAD_LANDMARK
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_SCRIPT
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dRezScript, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_CLOTHING
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_OBJECT
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dRezAttachmentFromInv, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventoryObject, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dRezObjectOnObject, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dRezObjectOnLand, // Dest: DT_LAND
- },
- // Source: DAD_NOTECARD
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_CATEGORY
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dWearCategory, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventoryCategory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventoryCategory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dCategoryOnLand, // Dest: DT_LAND
- },
- // Source: DAD_ROOT
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_LAND
- },
- // Source: DAD_BODYPART
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dWearItem, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_ANIMATION
- // TODO: animation on self could play it? edit it?
+LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none,
+ dragOrDrop3dImpl f_self,
+ dragOrDrop3dImpl f_avatar,
+ dragOrDrop3dImpl f_object,
+ dragOrDrop3dImpl f_land) :
+ LLDictionaryEntry("")
+{
+ mFunctions[DT_NONE] = f_none;
+ mFunctions[DT_SELF] = f_self;
+ mFunctions[DT_AVATAR] = f_avatar;
+ mFunctions[DT_OBJECT] = f_object;
+ mFunctions[DT_LAND] = f_land;
+}
+
+LLToolDragAndDrop::dragOrDrop3dImpl LLToolDragAndDrop::LLDragAndDropDictionary::get(EDragAndDropType dad_type, LLToolDragAndDrop::EDropTarget drop_target)
+{
+ const DragAndDropEntry *entry = lookup(dad_type);
+ if (entry)
{
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_GESTURE
+ return (entry->mFunctions[(U8)drop_target]);
+ }
+ return &LLToolDragAndDrop::dad3dNULL;
+}
+
+LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
+{
+ // DT_NONE DT_SELF DT_AVATAR DT_OBJECT DT_LAND
+ // |--------------|---------------------------|---------------------------|-------------------------------|--------------|
+ addEntry(DAD_NONE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CALLINGCARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CLOTHING, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_OBJECT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dRezAttachmentFromInv, &LLToolDragAndDrop::dad3dGiveInventoryObject, &LLToolDragAndDrop::dad3dRezObjectOnObject, &LLToolDragAndDrop::dad3dRezObjectOnLand));
+ addEntry(DAD_NOTECARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearCategory, &LLToolDragAndDrop::dad3dGiveInventoryCategory,&LLToolDragAndDrop::dad3dUpdateInventoryCategory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_ROOT_CATEGORY, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_BODYPART, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dWearItem, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_ANIMATION, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_GESTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dActivateGesture, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
+ addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
+ // TODO: animation on self could play it? edit it?
// TODO: gesture on self could play it? edit it?
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dActivateGesture, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dGiveInventory, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dUpdateInventory, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
- // Source: DAD_LINK
- {
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_NONE
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_SELF
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_AVATAR
- &LLToolDragAndDrop::dad3dNULL, // Dest: DT_OBJECT
- &LLToolDragAndDrop::dad3dNULL,//dad3dAssetOnLand, // Dest: DT_LAND
- },
};
LLToolDragAndDrop::LLToolDragAndDrop()
@@ -928,7 +829,7 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep
if (mDrop)
{
// don't allow drag and drop onto transparent objects
- pickCallback(gViewerWindow->pickImmediate(x, y, FALSE));
+ pick(gViewerWindow->pickImmediate(x, y, FALSE));
}
else
{
@@ -941,6 +842,14 @@ void LLToolDragAndDrop::dragOrDrop3D( S32 x, S32 y, MASK mask, BOOL drop, EAccep
void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
{
+ if (getInstance() != NULL)
+ {
+ getInstance()->pick(pick_info);
+ }
+}
+
+void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
+{
EDropTarget target = DT_NONE;
S32 hit_face = -1;
@@ -948,31 +857,30 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
LLSelectMgr::getInstance()->unhighlightAll();
// Treat attachments as part of the avatar they are attached to.
- if (hit_obj)
+ if (hit_obj != NULL)
{
// don't allow drag and drop on grass, trees, etc.
- if(pick_info.mPickType == LLPickInfo::PICK_FLORA)
+ if (pick_info.mPickType == LLPickInfo::PICK_FLORA)
{
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO;
- gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor );
+ mCursor = UI_CURSOR_NO;
+ gViewerWindow->getWindow()->setCursor( mCursor );
return;
}
- if(hit_obj->isAttachment() && !hit_obj->isHUDAttachment())
+ if (hit_obj->isAttachment() && !hit_obj->isHUDAttachment())
{
LLVOAvatar* avatar = LLVOAvatar::findAvatarFromAttachment( hit_obj );
if( !avatar )
{
- LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO;
- LLToolDragAndDrop::getInstance()->mCursor = UI_CURSOR_NO;
- gViewerWindow->getWindow()->setCursor( LLToolDragAndDrop::getInstance()->mCursor );
+ mLastAccept = ACCEPT_NO;
+ mCursor = UI_CURSOR_NO;
+ gViewerWindow->getWindow()->setCursor( mCursor );
return;
}
-
hit_obj = avatar;
}
- if(hit_obj->isAvatar())
+ if (hit_obj->isAvatar())
{
if(((LLVOAvatar*) hit_obj)->isSelf())
{
@@ -991,9 +899,9 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
hit_face = pick_info.mObjectFace;
// if any item being dragged will be applied to the object under our cursor
// highlight that object
- for (S32 i = 0; i < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size(); i++)
+ for (S32 i = 0; i < (S32)mCargoIDs.size(); i++)
{
- if (LLToolDragAndDrop::getInstance()->mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
+ if (mCargoTypes[i] != DAD_OBJECT || (pick_info.mKeyMask & MASK_CONTROL))
{
LLSelectMgr::getInstance()->highlightObjectAndFamily(hit_obj);
break;
@@ -1001,55 +909,54 @@ void LLToolDragAndDrop::pickCallback(const LLPickInfo& pick_info)
}
}
}
- else if(pick_info.mPickType == LLPickInfo::PICK_LAND)
+ else if (pick_info.mPickType == LLPickInfo::PICK_LAND)
{
target = DT_LAND;
hit_face = -1;
}
- LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_YES_MULTI;
+ mLastAccept = ACCEPT_YES_MULTI;
- for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0; LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();
- LLToolDragAndDrop::getInstance()->mCurItemIndex++)
+ for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
+ const S32 item_index = mCurItemIndex;
+ const EDragAndDropType dad_type = mCargoTypes[item_index];
// Call the right implementation function
- LLToolDragAndDrop::getInstance()->mLastAccept = (EAcceptance)llmin(
- (U32)LLToolDragAndDrop::getInstance()->mLastAccept,
- (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),
- LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target])
- (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
+ mLastAccept = (EAcceptance)llmin(
+ (U32)mLastAccept,
+ (U32)callMemberFunction(*this,
+ LLDragAndDropDictionary::instance().get(dad_type, target))
+ (hit_obj, hit_face, pick_info.mKeyMask, FALSE));
}
- if (LLToolDragAndDrop::getInstance()->mDrop &&
- (U32)LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_SINGLE)
+ if (mDrop && ((U32)mLastAccept >= ACCEPT_YES_COPY_SINGLE))
{
// if target allows multi-drop or there is only one item being dropped, go ahead
- if (LLToolDragAndDrop::getInstance()->mLastAccept >= ACCEPT_YES_COPY_MULTI ||
- LLToolDragAndDrop::getInstance()->mCargoIDs.size() == 1)
+ if ((mLastAccept >= ACCEPT_YES_COPY_MULTI) || (mCargoIDs.size() == 1))
{
// Target accepts multi, or cargo is a single-drop
- for (LLToolDragAndDrop::getInstance()->mCurItemIndex = 0;
- LLToolDragAndDrop::getInstance()->mCurItemIndex < (S32)LLToolDragAndDrop::getInstance()->mCargoIDs.size();
- LLToolDragAndDrop::getInstance()->mCurItemIndex++)
+ for (mCurItemIndex = 0; mCurItemIndex < (S32)mCargoIDs.size(); mCurItemIndex++)
{
+ const S32 item_index = mCurItemIndex;
+ const EDragAndDropType dad_type = mCargoTypes[item_index];
// Call the right implementation function
- (U32)callMemberFunction((*LLToolDragAndDrop::getInstance()),
- LLToolDragAndDrop::getInstance()->sDragAndDrop3d[LLToolDragAndDrop::getInstance()->mCargoTypes[LLToolDragAndDrop::getInstance()->mCurItemIndex]][target])
+ (U32)callMemberFunction(*this,
+ LLDragAndDropDictionary::instance().get(dad_type, target))
(hit_obj, hit_face, pick_info.mKeyMask, TRUE);
}
}
else
{
// Target does not accept multi, but cargo is multi
- LLToolDragAndDrop::getInstance()->mLastAccept = ACCEPT_NO;
+ mLastAccept = ACCEPT_NO;
}
}
- ECursorType cursor = LLToolDragAndDrop::getInstance()->acceptanceToCursor( LLToolDragAndDrop::getInstance()->mLastAccept );
+ ECursorType cursor = acceptanceToCursor( mLastAccept );
gViewerWindow->getWindow()->setCursor( cursor );
- LLToolDragAndDrop::getInstance()->mLastHitPos = pick_info.mPosGlobal;
- LLToolDragAndDrop::getInstance()->mLastCameraPos = gAgent.getCameraPositionGlobal();
+ mLastHitPos = pick_info.mPosGlobal;
+ mLastCameraPos = gAgent.getCameraPositionGlobal();
}
// static
@@ -1923,10 +1830,11 @@ BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item)
EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item)
{
// check the basics
- if(!item || !obj) return ACCEPT_NO;
+ if (!item || !obj) return ACCEPT_NO;
// HACK: downcast
LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item;
- if(!vitem->isComplete()) return ACCEPT_NO;
+ if (!vitem->isComplete()) return ACCEPT_NO;
+ if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links
// deny attempts to drop from an object onto itself. This is to
// help make sure that drops that are from an object to an object
@@ -1936,7 +1844,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
{
return ACCEPT_NO;
}
-
+
//BOOL copy = (perm.allowCopyBy(gAgent.getID(),
// gAgent.getGroupID())
// && (obj->mPermModify || obj->mFlagAllowInventoryAdd));
@@ -2575,24 +2483,30 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dUpdateInventoryCategory()" << llendl;
- if (NULL==obj)
+ if (obj == NULL)
{
llwarns << "obj is NULL; aborting func with ACCEPT_NO" << llendl;
return ACCEPT_NO;
}
- if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
+ if ((mSource != SOURCE_AGENT) && (mSource != SOURCE_LIBRARY))
{
return ACCEPT_NO;
}
- if(obj->isAttachment()) return ACCEPT_NO_LOCKED;
- LLViewerInventoryItem* item;
- LLViewerInventoryCategory* cat;
+ if (obj->isAttachment())
+ {
+ return ACCEPT_NO_LOCKED;
+ }
+
+ LLViewerInventoryItem* item = NULL;
+ LLViewerInventoryCategory* cat = NULL;
locateInventory(item, cat);
- if(!cat) return ACCEPT_NO;
- EAcceptance rv = ACCEPT_NO;
+ if (!cat)
+ {
+ return ACCEPT_NO;
+ }
- // find all the items in the category
+ // Find all the items in the category
LLDroppableItem droppable(!obj->permYouOwner());
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -2602,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLInventoryModel::EXCLUDE_TRASH,
droppable);
cats.put(cat);
- if(droppable.countNoCopy() > 0)
+ if (droppable.countNoCopy() > 0)
{
llwarns << "*** Need to confirm this step" << llendl;
}
@@ -2616,46 +2530,57 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
}
}
+ EAcceptance rv = ACCEPT_NO;
+
// Check for accept
- S32 i;
- S32 count = cats.count();
- for(i = 0; i < count; ++i)
+ for (LLInventoryModel::cat_array_t::const_iterator cat_iter = cats.begin();
+ cat_iter != cats.end();
+ ++cat_iter)
{
- rv = gInventory.isCategoryComplete(cats.get(i)->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
+ const LLViewerInventoryCategory *cat = (*cat_iter);
+ rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
if(rv < ACCEPT_YES_SINGLE)
{
- lldebugs << "Category " << cats.get(i)->getUUID()
- << "is not complete." << llendl;
+ lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl;
break;
}
}
- if(ACCEPT_YES_COPY_SINGLE <= rv)
+ if (ACCEPT_YES_COPY_SINGLE <= rv)
{
- count = items.count();
- for(i = 0; i < count; ++i)
+ for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
{
- rv = willObjectAcceptInventory(root_object, items.get(i));
- if(rv < ACCEPT_YES_COPY_SINGLE)
+ LLViewerInventoryItem *item = (*item_iter);
+ /*
+ // Pass the base objects, not the links.
+ if (item && item->getIsLinkType())
+ {
+ item = item->getLinkedItem();
+ (*item_iter) = item;
+ }
+ */
+ rv = willObjectAcceptInventory(root_object, item);
+ if (rv < ACCEPT_YES_COPY_SINGLE)
{
- lldebugs << "Object will not accept "
- << items.get(i)->getUUID() << llendl;
+ lldebugs << "Object will not accept " << item->getUUID() << llendl;
break;
}
}
}
- // if every item is accepted, go ahead and send it on.
- if(drop && (ACCEPT_YES_COPY_SINGLE <= rv))
+ // If every item is accepted, send it on
+ if (drop && (ACCEPT_YES_COPY_SINGLE <= rv))
{
- S32 count = items.count();
LLInventoryFetchObserver::item_ref_t ids;
- for(i = 0; i < count; ++i)
+ for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
{
- //dropInventory(root_object, items.get(i), mSource, mSourceID);
- ids.push_back(items.get(i)->getUUID());
+ const LLViewerInventoryItem *item = (*item_iter);
+ ids.push_back(item->getUUID());
}
- LLCategoryDropObserver* dropper;
- dropper = new LLCategoryDropObserver(obj->getID(), mSource);
+ LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource);
dropper->fetchItems(ids);
if(dropper->isEverythingComplete())
{
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index e1536acf75..79b2bc32a3 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -33,6 +33,7 @@
#ifndef LL_TOOLDRAGANDDROP_H
#define LL_TOOLDRAGANDDROP_H
+#include "lldictionary.h"
#include "lltool.h"
#include "llview.h"
#include "lluuid.h"
@@ -102,6 +103,7 @@ protected:
DT_COUNT = 5
};
+protected:
// dragOrDrop3dImpl points to a member of LLToolDragAndDrop that
// takes parameters (LLViewerObject* obj, S32 face, MASK, BOOL
// drop) and returns a BOOL if drop is ok
@@ -112,7 +114,9 @@ protected:
EAcceptance* acceptance);
void dragOrDrop3D(S32 x, S32 y, MASK mask, BOOL drop,
EAcceptance* acceptance);
+
static void pickCallback(const LLPickInfo& pick_info);
+ void pick(const LLPickInfo& pick_info);
protected:
@@ -137,10 +141,6 @@ protected:
enddrag_signal_t mEndDragSignal;
- // array of pointers to functions that implement the logic to
- // dragging and dropping into the simulator.
- static dragOrDrop3dImpl sDragAndDrop3d[DAD_COUNT][DT_COUNT];
-
protected:
// 3d drop functions. these call down into the static functions
// named drop<ThingToDrop> if drop is TRUE and permissions allow
@@ -272,6 +272,25 @@ public:
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept);
+
+ // Classes used for determining 3d drag and drop types.
+private:
+ struct DragAndDropEntry : public LLDictionaryEntry
+ {
+ DragAndDropEntry(dragOrDrop3dImpl f_none,
+ dragOrDrop3dImpl f_self,
+ dragOrDrop3dImpl f_avatar,
+ dragOrDrop3dImpl f_object,
+ dragOrDrop3dImpl f_land);
+ dragOrDrop3dImpl mFunctions[DT_COUNT];
+ };
+ class LLDragAndDropDictionary : public LLSingleton<LLDragAndDropDictionary>,
+ public LLDictionary<EDragAndDropType, DragAndDropEntry>
+ {
+ public:
+ LLDragAndDropDictionary();
+ dragOrDrop3dImpl get(EDragAndDropType dad_type, EDropTarget drop_target);
+ };
};
// utility functions
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index 221db2defa..bd4f172907 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -32,6 +32,7 @@
#include "llviewerprecompiledheaders.h"
+#define LLVIEWERCAMERA_CPP
#include "llviewercamera.h"
// Viewer includes
diff --git a/indra/newview/llviewercamera.h b/indra/newview/llviewercamera.h
index bf561c3e4d..cd67af5fef 100644
--- a/indra/newview/llviewercamera.h
+++ b/indra/newview/llviewercamera.h
@@ -53,7 +53,9 @@ const BOOL FOR_SELECTION = TRUE;
const BOOL NOT_FOR_SELECTION = FALSE;
// Build time optimization, generate this once in .cpp file
-//extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance();
+#ifndef LLVIEWERCAMERA_CPP
+extern template class LLViewerCamera* LLSingleton<class LLViewerCamera>::getInstance();
+#endif
class LLViewerCamera : public LLCamera, public LLSingleton<LLViewerCamera>
{
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index aebc97ab7d..b5454e7298 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -38,6 +38,7 @@
#include "llviewerfloaterreg.h"
#include "llcompilequeue.h"
+#include "llcallfloater.h"
#include "llfloaterabout.h"
#include "llfloateractivespeakers.h"
#include "llfloateranimpreview.h"
@@ -105,6 +106,7 @@
#include "llfloateruipreview.h"
#include "llfloaterurldisplay.h"
#include "llfloatervoicedevicesettings.h"
+#include "llfloatervolumepulldown.h"
#include "llfloaterwater.h"
#include "llfloaterwhitelistentry.h"
#include "llfloaterwindlight.h"
@@ -174,7 +176,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("impanel", "floater_im_session.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloater>);
LLFloaterReg::add("im_container", "floater_im_container.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIMFloaterContainer>);
- LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
LLFloaterReg::add("incoming_call", "floater_incoming_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLIncomingCallDialog>);
LLFloaterReg::add("inventory", "floater_inventory.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInventory>);
LLFloaterReg::add("inspect", "floater_inspect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterInspect>);
@@ -234,6 +235,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("script_debug", "floater_script_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebug>);
LLFloaterReg::add("script_debug_output", "floater_script_debug_panel.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptDebugOutput>);
+ LLFloaterReg::add("script_floater", "floater_script.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLScriptFloater>);
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
@@ -247,7 +249,9 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_image", "floater_image_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterImagePreview>, "upload");
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
+ LLFloaterReg::add("volume_pulldown", "floater_volume_pulldown.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVolumePulldown>);
LLFloaterReg::add("voice_call", "floater_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCall>);
+ LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index f2ddb0b1f1..608c5c2097 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -171,7 +171,16 @@ public:
else
if(status == 404)
{
- // Treat 404s like an html page.
+ // 404 is content not found - sites often have bespoke 404 pages so
+ // treat them like an html page.
+ completeAny(status, "text/html");
+ }
+ else
+ if(status == 406)
+ {
+ // 406 means the server sent something that we didn't indicate was acceptable
+ // Eventually we should send what we accept in the headers but for now,
+ // treat 406s like an html page.
completeAny(status, "text/html");
}
else
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index fd74c9c2fc..f639c841e7 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -138,15 +138,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
}
else
{
- if(mFocusedImplID.notNull())
- {
- if(mMediaControls.get())
- {
- // Don't reset camera zoom by default, just tell the controls they're no longer controlling zoom.
- mMediaControls.get()->resetZoomLevel(false);
- }
- }
-
if(hasFocus())
{
gFocusMgr.setKeyboardFocus(NULL);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 4307002980..34d07f3284 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6221,6 +6221,7 @@ BOOL object_selected_and_point_valid()
return (selection->getRootObjectCount() == 1) &&
(selection->getFirstRootObject()->getPCode() == LL_PCODE_VOLUME) &&
selection->getFirstRootObject()->permYouOwner() &&
+ selection->getFirstRootObject()->flagObjectMove() &&
!((LLViewerObject*)selection->getFirstRootObject()->getRoot())->isAvatar() &&
(selection->getFirstRootObject()->getNVPair("AssetContainer") == NULL);
}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index e491e11960..3c79045cc5 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -2767,22 +2767,23 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
// I don't think there's a better way to do this without calculating distance per-poly
F32 range = sqrt(dx*dx + dy*dy + dz*dz) - min_scale/2;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
if (range < 0.001f || isHUDAttachment()) // range == zero
{
mAppAngle = 180.f;
- mPixelArea = (F32)LLViewerCamera::getInstance()->getScreenPixelArea();
+ mPixelArea = (F32)camera->getScreenPixelArea();
}
else
{
mAppAngle = (F32) atan2( max_scale, range) * RAD_TO_DEG;
- F32 pixels_per_meter = LLViewerCamera::getInstance()->getPixelMeterRatio() / range;
+ F32 pixels_per_meter = camera->getPixelMeterRatio() / range;
mPixelArea = (pixels_per_meter * max_scale) * (pixels_per_meter * mid_scale);
- if (mPixelArea > LLViewerCamera::getInstance()->getScreenPixelArea())
+ if (mPixelArea > camera->getScreenPixelArea())
{
mAppAngle = 180.f;
- mPixelArea = (F32)LLViewerCamera::getInstance()->getScreenPixelArea();
+ mPixelArea = (F32)camera->getScreenPixelArea();
}
}
}
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 01b213a87d..266c40d493 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -457,6 +457,7 @@ public:
inline BOOL flagAnimSource() const { return ((mFlags & FLAGS_ANIM_SOURCE) != 0); }
inline BOOL flagCameraSource() const { return ((mFlags & FLAGS_CAMERA_SOURCE) != 0); }
inline BOOL flagCameraDecoupled() const { return ((mFlags & FLAGS_CAMERA_DECOUPLED) != 0); }
+ inline BOOL flagObjectMove() const { return ((mFlags & FLAGS_OBJECT_MOVE) != 0); }
bool getIncludeInSearch() const;
void setIncludeInSearch(bool include_in_search);
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 9896adad97..9de1ef7190 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -808,6 +808,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
S32 drawn = 0;
F32* vertexp;
U8* colorp;
+ bool render_hidden = LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build");
const F32 PROPERTY_LINE_CLIP_DIST = 256.f;
@@ -849,7 +850,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
gGL.end();
- if (LLSelectMgr::sRenderHiddenSelections && LLFloaterReg::instanceVisible("build"))
+ if (render_hidden)
{
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_GREATER);
diff --git a/indra/newview/llviewerpartsim.cpp b/indra/newview/llviewerpartsim.cpp
index cfb8340462..841a7ccc5e 100644
--- a/indra/newview/llviewerpartsim.cpp
+++ b/indra/newview/llviewerpartsim.cpp
@@ -71,9 +71,9 @@ const F32 LLViewerPartSim::PART_ADAPT_RATE_MULT_RECIP = 1.0f/PART_ADAPT_RATE_MUL
U32 LLViewerPart::sNextPartID = 1;
-F32 calc_desired_size(LLVector3 pos, LLVector2 scale)
+F32 calc_desired_size(LLViewerCamera* camera, LLVector3 pos, LLVector2 scale)
{
- F32 desired_size = (pos-LLViewerCamera::getInstance()->getOrigin()).magVec();
+ F32 desired_size = (pos - camera->getOrigin()).magVec();
desired_size /= 4;
return llclamp(desired_size, scale.magVec()*0.5f, PART_SIM_BOX_SIDE*2);
}
@@ -273,6 +273,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
LLViewerPartSim::checkParticleCount(mParticles.size());
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
LLViewerRegion *regionp = getRegion();
S32 end = (S32) mParticles.size();
for (S32 i = 0 ; i < (S32)mParticles.size();)
@@ -394,7 +395,7 @@ void LLViewerPartGroup::updateParticles(const F32 lastdt)
}
else
{
- F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
+ F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale);
if (!posInGroup(part->mPosAgent, desired_size))
{
// Transfer particles between groups
@@ -557,7 +558,8 @@ LLViewerPartGroup *LLViewerPartSim::put(LLViewerPart* part)
}
else
{
- F32 desired_size = calc_desired_size(part->mPosAgent, part->mScale);
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ F32 desired_size = calc_desired_size(camera, part->mPosAgent, part->mScale);
S32 count = (S32) mViewerPartGroups.size();
for (S32 i = 0; i < count; i++)
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 9882dcd6af..a9194c0c3b 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -3621,6 +3621,16 @@ void LLVOAvatar::updateVisibility()
mVisible = visible;
}
+// private
+bool LLVOAvatar::shouldAlphaMask()
+{
+ const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
+ && !LLDrawPoolAvatar::sSkipTransparent;
+
+ return should_alpha_mask;
+
+}
+
//-----------------------------------------------------------------------------
// renderSkinned()
//-----------------------------------------------------------------------------
@@ -3754,9 +3764,8 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
if (pass == AVATAR_RENDER_PASS_SINGLE)
{
- const bool should_alpha_mask = mSupportsAlphaLayers && !LLDrawPoolAlpha::sShowDebugAlpha // Don't alpha mask if "Highlight Transparent" checked
- && !LLDrawPoolAvatar::sSkipTransparent;
+ bool should_alpha_mask = shouldAlphaMask();
LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
if (should_alpha_mask)
@@ -3825,6 +3834,15 @@ U32 LLVOAvatar::renderTransparent(BOOL first_pass)
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
}
+ bool should_alpha_mask = shouldAlphaMask();
+
+ LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
+
+ if (should_alpha_mask)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
+ }
+
if (isTextureVisible(TEX_HEAD_BAKED))
{
num_indices += mMeshLOD[MESH_ID_EYELASH]->render(mAdjustedPixelArea, first_pass, mIsDummy);
@@ -3868,11 +3886,21 @@ U32 LLVOAvatar::renderRigid()
return 0;
}
+ bool should_alpha_mask = shouldAlphaMask();
+ LLGLState test(GL_ALPHA_TEST, should_alpha_mask);
+
+ if (should_alpha_mask)
+ {
+ gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.5f);
+ }
+
if (isTextureVisible(TEX_EYES_BAKED) || mIsDummy)
{
num_indices += mMeshLOD[MESH_ID_EYEBALL_LEFT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
num_indices += mMeshLOD[MESH_ID_EYEBALL_RIGHT]->render(mAdjustedPixelArea, TRUE, mIsDummy);
}
+
+ gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
return num_indices;
}
@@ -5943,6 +5971,9 @@ void LLVOAvatar::updateMeshTextures()
}
+ // Turn on alpha masking correctly for yourself and other avatars on 1.23+
+ mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR];
+
// Baked textures should be requested from the sim this avatar is on. JC
const LLHost target_host = getObjectHost();
if (!target_host.isOk())
@@ -5981,7 +6012,7 @@ void LLVOAvatar::updateMeshTextures()
}
else if (mBakedTextureDatas[i].mTexLayerSet
&& !other_culled
- && (i != BAKED_HAIR || is_layer_baked[i] || isSelf())) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers.
+ && (i != BAKED_HAIR || mSupportsAlphaLayers)) // ! BACKWARDS COMPATIBILITY ! workaround for old viewers.
{
mBakedTextureDatas[i].mTexLayerSet->createComposite();
mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( TRUE );
@@ -5992,10 +6023,10 @@ void LLVOAvatar::updateMeshTextures()
}
}
}
-
+
// ! BACKWARDS COMPATIBILITY !
// Workaround for viewing avatars from old viewers that haven't baked hair textures.
- if (!is_layer_baked[BAKED_HAIR] || self_customizing)
+ if (!mSupportsAlphaLayers)
{
const LLColor4 color = mTexHairColor ? mTexHairColor->getColor() : LLColor4(1,1,1,1);
LLViewerTexture* hair_img = getImage( TEX_HAIR, 0 );
@@ -6006,8 +6037,6 @@ void LLVOAvatar::updateMeshTextures()
}
}
- // Turn on alpha masking correctly for yourself and other avatars on 1.23+
- mSupportsAlphaLayers = isSelf() || is_layer_baked[BAKED_HAIR];
for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
@@ -6510,7 +6539,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
}
- if( !mFirstTEMessageReceived )
+ if( !is_first_appearance_message )
{
onFirstTEMessageReceived();
}
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index 4b3e850e7a..a5815df20a 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -347,6 +347,8 @@ public:
BOOL mIsDummy; // for special views
S32 mSpecialRenderMode; // special lighting
private:
+ bool shouldAlphaMask();
+
BOOL mNeedsSkin; // avatar has been animated and verts have not been updated
S32 mUpdatePeriod;
S32 mNumInitFaces; //number of faces generated when creating the avatar drawable, does not inculde splitted faces due to long vertex buffer.
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index f3e787ae7e..7d6401acde 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -918,9 +918,9 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
//-----------------------------------------------------------------------------
// updatedWearable( EWearableType type )
// forces an update to any baked textures relevant to type.
-// Should be called only on saving the wearable
+// will force an upload of the resulting bake if the second parameter is TRUE
//-----------------------------------------------------------------------------
-void LLVOAvatarSelf::wearableUpdated( EWearableType type )
+void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
{
for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
@@ -939,7 +939,7 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type )
{
if (mBakedTextureDatas[index].mTexLayerSet)
{
- invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, TRUE);
+ invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result);
}
break;
}
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index e376e5e9ef..6bf4ef5496 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -270,7 +270,7 @@ protected:
public:
/*virtual*/ BOOL isWearingWearableType(EWearableType type) const;
- void wearableUpdated(EWearableType type);
+ void wearableUpdated(EWearableType type, BOOL upload_result);
protected:
U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const;
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 639585de55..fe0114d687 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -52,7 +52,7 @@ public:
STATE_CONNECTED
} EState;
- typedef boost::function<void(const EState& old_state, const EState& new_state)> state_changed_callback_t;
+ typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state)> state_changed_signal_t;
// on current channel changed signal
typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
@@ -78,7 +78,8 @@ public:
virtual BOOL callStarted();
const std::string& getSessionName() const { return mSessionName; }
- void setStateChangedCallback(state_changed_callback_t callback) { mStateChangedCallback = callback; }
+ boost::signals2::connection setStateChangedCallback(const state_changed_signal_t::slot_type& callback)
+ { return mStateChangedCallback.connect(callback); }
const LLUUID getSessionID() { return mSessionID; }
EState getState() { return mState; }
@@ -124,7 +125,7 @@ protected:
static BOOL sSuspended;
private:
- state_changed_callback_t mStateChangedCallback;
+ state_changed_signal_t mStateChangedCallback;
};
class LLVoiceChannelGroup : public LLVoiceChannel
@@ -175,6 +176,9 @@ public:
void setSessionHandle(const std::string& handle, const std::string &inURI);
+ // returns TRUE if call is incoming and FALSE otherwise
+ BOOL isIncomingCall() { return mReceivedCall; }
+
protected:
virtual void setState(EState state);
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index d677634be6..7e1e7c940f 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -63,6 +63,7 @@
#include "llparcel.h"
#include "llviewerparcelmgr.h"
#include "llfirstuse.h"
+#include "lltrans.h"
#include "llviewerwindow.h"
#include "llviewercamera.h"
#include "llvoavatarself.h"
@@ -1161,11 +1162,12 @@ LLVoiceClient::LLVoiceClient() :
mVoiceEnabled(false),
mWriteInProgress(false),
- mLipSyncEnabled(false),
- mAPIVersion("Unknown")
+ mLipSyncEnabled(false)
{
gVoiceClient = this;
+ mAPIVersion = LLTrans::getString("NotConnected");
+
#if LL_DARWIN || LL_LINUX || LL_SOLARIS
// HACK: THIS DOES NOT BELONG HERE
// When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.
diff --git a/indra/newview/llvoicevisualizer.cpp b/indra/newview/llvoicevisualizer.cpp
index e777d7362f..4794cab32e 100644
--- a/indra/newview/llvoicevisualizer.cpp
+++ b/indra/newview/llvoicevisualizer.cpp
@@ -369,8 +369,9 @@ void LLVoiceVisualizer::render()
//-------------------------------------------------------------
// create coordinates of the geometry for the dot
//-------------------------------------------------------------
- LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * DOT_SIZE;
- LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * DOT_SIZE;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
+ LLVector3 l = camera->getLeftAxis() * DOT_SIZE;
+ LLVector3 u = camera->getUpAxis() * DOT_SIZE;
LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u;
LLVector3 bottomRight = mSoundSymbol.mPosition - l - u;
@@ -496,8 +497,8 @@ void LLVoiceVisualizer::render()
F32 width = i * WAVE_WIDTH_SCALE * mSoundSymbol.mWaveExpansion[i];
F32 height = i * WAVE_HEIGHT_SCALE * mSoundSymbol.mWaveExpansion[i];
- LLVector3 l = LLViewerCamera::getInstance()->getLeftAxis() * width;
- LLVector3 u = LLViewerCamera::getInstance()->getUpAxis() * height;
+ LLVector3 l = camera->getLeftAxis() * width;
+ LLVector3 u = camera->getUpAxis() * height;
LLVector3 bottomLeft = mSoundSymbol.mPosition + l - u;
LLVector3 bottomRight = mSoundSymbol.mPosition - l - u;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 9dd0b598dc..139d2fbd88 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -386,6 +386,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
mFaceList.clear();
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
for (LLSpatialGroup::element_iter i = group->getData().begin(); i != group->getData().end(); ++i)
{
LLDrawable* drawablep = *i;
@@ -415,7 +416,7 @@ void LLParticlePartition::addGeometryCount(LLSpatialGroup* group, U32& vertex_co
}
count++;
- facep->mDistance = (facep->mCenterLocal - LLViewerCamera::getInstance()->getOrigin()) * LLViewerCamera::getInstance()->getAtAxis();
+ facep->mDistance = (facep->mCenterLocal - camera->getOrigin()) * camera->getAtAxis();
obj->mDepth += facep->mDistance;
mFaceList.push_back(facep);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 48bd387022..1ee0811ba6 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -622,6 +622,7 @@ void LLVOVolume::updateTextureVirtualSize()
const S32 num_faces = mDrawable->getNumFaces();
F32 min_vsize=999999999.f, max_vsize=0.f;
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
for (S32 i = 0; i < num_faces; i++)
{
LLFace* face = mDrawable->getFace(i);
@@ -638,7 +639,7 @@ void LLVOVolume::updateTextureVirtualSize()
if (isHUDAttachment())
{
- F32 area = (F32) LLViewerCamera::getInstance()->getScreenPixelArea();
+ F32 area = (F32) camera->getScreenPixelArea();
vsize = area;
imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);
face->setPixelArea(area); // treat as full screen
@@ -704,9 +705,9 @@ void LLVOVolume::updateTextureVirtualSize()
//if the sculpty very close to the view point, load first
{
- LLVector3 lookAt = getPositionAgent() - LLViewerCamera::getInstance()->getOrigin();
+ LLVector3 lookAt = getPositionAgent() - camera->getOrigin();
F32 dist = lookAt.normVec() ;
- F32 cos_angle_to_view_dir = lookAt * LLViewerCamera::getInstance()->getXAxis() ;
+ F32 cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
mSculptTexture->setAdditionalDecodePriority(0.8f * LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist)) ;
}
}
@@ -741,7 +742,7 @@ void LLVOVolume::updateTextureVirtualSize()
F32 rad = getLightRadius();
mLightTexture->addTextureStats(gPipeline.calcPixelArea(getPositionAgent(),
LLVector3(rad,rad,rad),
- *LLViewerCamera::getInstance()));
+ *camera));
}
}
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 807434c397..3cb0ec4bad 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -704,7 +704,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )
}
avatar->updateVisualParams();
- avatar->wearableUpdated(type);
+ avatar->wearableUpdated(type, TRUE);
// if( upload_bake )
// {
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index f908a015df..21b297c4ee 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -3768,9 +3768,10 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
gGL.setColorMask(true, false);
gPipeline.resetDrawOrders();
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
for (std::set<LLViewerObject*>::iterator iter = objects.begin(); iter != objects.end(); ++iter)
{
- stateSort((*iter)->mDrawable, *LLViewerCamera::getInstance());
+ stateSort((*iter)->mDrawable, *camera);
}
LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_SELECT);
@@ -6248,6 +6249,7 @@ void LLPipeline::renderDeferredLighting()
{
LLFastTimer ftm(FTM_RENDER_DEFERRED);
+ LLViewerCamera* camera = LLViewerCamera::getInstance();
{
LLGLDepthTest depth(GL_TRUE);
mDeferredDepth.copyContents(mDeferredScreen, 0, 0, mDeferredScreen.getWidth(), mDeferredScreen.getHeight(),
@@ -6641,7 +6643,7 @@ void LLPipeline::renderDeferredLighting()
continue;
}
- if (LLViewerCamera::getInstance()->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0)
+ if (camera->AABBInFrustumNoFarClip(center, LLVector3(s,s,s)) == 0)
{
continue;
}
@@ -6665,12 +6667,12 @@ void LLPipeline::renderDeferredLighting()
v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
- if (LLViewerCamera::getInstance()->getOrigin().mV[0] > c[0] + s + 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[0] < c[0] - s - 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[1] > c[1] + s + 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[1] < c[1] - s - 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[2] > c[2] + s + 0.2f ||
- LLViewerCamera::getInstance()->getOrigin().mV[2] < c[2] - s - 0.2f)
+ if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
+ camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
+ camera->getOrigin().mV[1] > c[1] + s + 0.2f ||
+ camera->getOrigin().mV[1] < c[1] - s - 0.2f ||
+ camera->getOrigin().mV[2] > c[2] + s + 0.2f ||
+ camera->getOrigin().mV[2] < c[2] - s - 0.2f)
{ //draw box if camera is outside box
if (render_local)
{
@@ -6685,7 +6687,7 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(LLViewerCamera::getInstance(), center));
+ GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
stop_glerror();
}
}
@@ -6750,7 +6752,7 @@ void LLPipeline::renderDeferredLighting()
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
glColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
- GL_UNSIGNED_BYTE, get_box_fan_indices(LLViewerCamera::getInstance(), center));
+ GL_UNSIGNED_BYTE, get_box_fan_indices(camera, center));
}
gDeferredSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
unbindDeferredShader(gDeferredSpotLightProgram);
@@ -8684,7 +8686,8 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
sShadowRender = TRUE;
sImpostorRender = TRUE;
- markVisible(avatar->mDrawable, *LLViewerCamera::getInstance());
+ LLViewerCamera* viewer_camera = LLViewerCamera::getInstance();
+ markVisible(avatar->mDrawable, *viewer_camera);
LLVOAvatar::sUseImpostors = FALSE;
LLVOAvatar::attachment_map_t::iterator iter;
@@ -8699,7 +8702,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
{
if (LLViewerObject* attached_object = (*attachment_iter))
{
- markVisible(attached_object->mDrawable->getSpatialBridge(), *LLViewerCamera::getInstance());
+ markVisible(attached_object->mDrawable->getSpatialBridge(), *viewer_camera);
}
}
}
@@ -8709,9 +8712,9 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
const LLVector3* ext = avatar->mDrawable->getSpatialExtents();
LLVector3 pos(avatar->getRenderPosition()+avatar->getImpostorOffset());
- LLCamera camera = *LLViewerCamera::getInstance();
+ LLCamera camera = *viewer_camera;
- camera.lookAt(LLViewerCamera::getInstance()->getOrigin(), pos, LLViewerCamera::getInstance()->getUpAxis());
+ camera.lookAt(viewer_camera->getOrigin(), pos, viewer_camera->getUpAxis());
LLVector2 tdim;
@@ -8754,7 +8757,7 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
glClearStencil(0);
// get the number of pixels per angle
- F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * LLViewerCamera::getInstance()->getView());
+ F32 pa = gViewerWindow->getWindowHeightRaw() / (RAD_TO_DEG * viewer_camera->getView());
//get resolution based on angle width and height of impostor (double desired resolution to prevent aliasing)
U32 resY = llmin(nhpo2((U32) (fov*pa)), (U32) 512);
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index eb8ec00bb9..85cb145dbc 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -81,7 +81,7 @@
<color
name="AgentChatColor"
- reference="LtGray" />
+ reference="White" />
<color
name="AlertBoxColor"
value="0.24 0.24 0.24 1" />
@@ -270,10 +270,10 @@
reference="White" />
<color
name="FilterBackgroundColor"
- reference="DkGray" />
+ reference="MouseGray" />
<color
name="FilterTextColor"
- value="1 0.78 0.27 1" />
+ value="0.38 0.69 0.57 1" />
<color
name="FloaterButtonImageColor"
reference="LtGray" />
@@ -459,7 +459,7 @@
value="0 0.5 0 1" />
<color
name="MenuPopupBgColor"
- reference="DkGray_66" />
+ reference="DkGray2" />
<color
name="MultiSliderDisabledThumbColor"
reference="Unused?" />
@@ -669,7 +669,7 @@
reference="LtGray" />
<color
name="UserChatColor"
- reference="LtGray" />
+ reference="White" />
<color
name="llOwnerSayChatColor"
reference="LtGray" />
@@ -684,5 +684,8 @@
<color
name="SysWellItemSelected"
value="0.3 0.3 0.3 1.0" />
+ <color
+ name="ChatToastAgentNameColor"
+ value="1.0 0.3 1.0 1.0" />
</colors>
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 3576b6ed77..7703b9f0ab 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -53,6 +53,9 @@ with the same filename but different name
<texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
<texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+ <texture name="Arrow_Up" file_name="widgets/Arrow_Up.png" preload="true" />
+ <texture name="Arrow_Down" file_name="widgets/Arrow_Down.png" preload="true" />
+
<texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
<texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
<texture name="Arrow_Small_Right" file_name="widgets/Arrow_Small_Right.png" preload="true" />
@@ -140,6 +143,7 @@ with the same filename but different name
<texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index a2b6dec91c..d1fca8984d 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est">
- for ca. US$ [USD]
+ for ca. [LOCALAMOUNT]
</text>
<text name="getting_data">
Henter data...
@@ -63,6 +63,6 @@ og prøv igen.
<button label="Annullér" name="cancel_btn" />
<button label="Køb" name="buy_btn" />
<string name="buy_currency">
- Køb L$ [LINDENS] for ca. US$ [USD]
+ Køb L$ [LINDENS] for ca. [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index 05750a1782..56b7868c33 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est">
- für ca. [USD] US$
+ für ca. [LOCALAMOUNT]
</text>
<text name="getting_data">
Daten werden geladen...
@@ -63,6 +63,6 @@ Kaufen Sie mehr.
<button label="Kaufen" name="buy_btn" />
<button label="Abbrechen" name="cancel_btn" />
<text name="buy_currency">
- [LINDENS] L$ für ca. [USD] US$ kaufen
+ [LINDENS] L$ für ca. [LOCALAMOUNT] kaufen
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index 30eacec060..6598c95c0e 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -1,34 +1,53 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- height="400"
+ legacy_header_height="18"
+ can_minimize="false"
+ can_tear_off="false"
+ can_resize="true"
+ can_drag_on_left="false"
+ can_close="true"
+ can_dock="true"
+ bevel_style="in"
+ height="300"
layout="topleft"
- name="floater_aaa"
- can_resize="true"
- width="500">
- <text_editor
- enabled="false"
- follows="all"
- height="390"
- bg_readonly_color="Transparent"
- left="5"
- text_color="LtGray"
- max_length="65536"
- name="credits_editor"
- top="5"
- width="490"
- word_wrap="true">
- Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
-
- Thank you to the following residents for helping to ensure that this is the best version yet: (in progress)
-
-
-
-
-
-
-
-
- It is a rare mind indeed that can render the hitherto non-existent blindingly obvious. The cry 'I could have thought of that' is a very popular and misleading one, for the fact is that they didn't, and a very significant and revealing fact it is too.
- -- Douglas Adams
- </text_editor>
+ name="Test Floater"
+ save_rect="true"
+ title="TEST FLOATER"
+ save_dock_state="true"
+ save_visibility="true"
+ single_instance="true"
+ width="320">
+ <chat_history
+ allow_html="true"
+ bg_readonly_color="ChatHistoryBgColor"
+ bg_writeable_color="ChatHistoryBgColor"
+ border_visible="true"
+ follows="all"
+ font="SansSerif"
+ left="1"
+ top="20"
+ layout="topleft"
+ height="260"
+ name="chat_history"
+ parse_highlights="true"
+ text_color="ChatHistoryTextColor"
+ text_readonly_color="ChatHistoryTextColor"
+ width="320">
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+Really long line that is long enough to wrap once with jyg descenders.
+ </chat_history>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
index bb45e51137..a8f875754e 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="556"
+ height="610"
layout="topleft"
name="Animation Preview"
help_topic="animation_preview"
@@ -508,21 +508,21 @@ Maximum animation length is [MAX_LENGTH] seconds.
We recommend BVH files exported from Poser 4.
</text>
<button
- bottom="546"
- follows="bottom|right"
+ top="580"
+ follows="bottom|left"
height="23"
- label="Cancel"
+ label="Upload (L$[AMOUNT])"
layout="topleft"
- name="cancel_btn"
- right="265"
- width="123" />
+ left="10"
+ name="ok_btn"
+ width="128" />
<button
+ top="580"
follows="bottom|left"
height="23"
- label="Upload (L$[AMOUNT])"
+ label="Cancel"
layout="topleft"
- left_delta="-129"
- name="ok_btn"
- top_delta="0"
- width="123" />
+ name="cancel_btn"
+ left="142"
+ width="128" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 69f9f6a2f8..d378b427f1 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -12,6 +12,7 @@
help_topic="camera_floater"
save_rect="true"
save_visibility="true"
+ single_instance="true"
width="150">
<floater.string
name="rotate_tooltip">
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index dca1692e4a..ff9f0daee6 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -11,7 +11,7 @@
help_topic="inventory"
save_rect="true"
save_visibility="true"
- single_instance="true"
+ single_instance="false"
title="INVENTORY"
width="467">
<floater.string
diff --git a/indra/newview/skins/default/xui/en/floater_test_textbox.xml b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
index 3aeb7c93e7..310ad13dac 100644
--- a/indra/newview/skins/default/xui/en/floater_test_textbox.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_textbox.xml
@@ -2,11 +2,11 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="450"
+ height="600"
layout="topleft"
name="floater_test_textbox"
help_topic="floater_test_textbox"
- width="600">
+ width="800">
<text
type="string"
length="1"
@@ -21,128 +21,171 @@ Third line of multiple lines
Fourth line of multiple lines
Fifth line of multiple lines
</text>
- <text
- top_pad="10"
- left="10"
- right="-10"
- height="20"
- follows="top|left"
- font.name="SansSerifSmall"
- name="test_text10"
- tool_tip="text">
- SansSerifSmall
-The 华文细黑 brown fox ヒラキjumped over the lazy dog.
- </text>
- <text
- top_pad="10"
- left="10"
- right="-10"
- height="25"
- follows="top|left"
- font.name="SansSerifMedium"
- name="test_text11"
- tool_tip="text">
- SansSerif
-The 华文细黑 brown fox ヒラキjumped over the lazy dog.
- </text>
- <text
- top_pad="10"
- left="10"
- right="-10"
- follows="top|left"
- height="26"
- font.name="SansSerifLarge"
- name="test_text12"
- tool_tip="text">
- SansSerifLarge
-The 华文细黑 brown fox ヒラキjumped over the lazy dog.
- </text>
- <text
- top_pad="10"
- left="10"
- height="35"
- right="-10"
- follows="top|left"
- font.name="SansSerifHuge"
- name="test_text13"
- tool_tip="text">
- SansSerifHuge
-The 华文细黑 brown fox ヒラキjumped over the lazy dog.
- </text>
- <text
- type="string"
- length="1"
- font="SansSerif"
- font.style="BOLD"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="40"
- width="300">
- SansSerif BOLD
- </text>
- <text
- type="string"
- length="1"
- font="SansSerif"
- font.style="BOLD|UNDERLINE"
- height="10"
- layout="topleft"
- left_delta="0"
- top_pad="10"
- width="300">
- SansSerif BOLD UNDERLINE
- </text>
- <text
- type="string"
- length="1"
- bottom="390"
- label="N"
+
+ <text
+ font="SansSerif"
+ font.style="BOLD"
+ height="10"
layout="topleft"
- left="10"
- name="right_aligned_text"
- width="380"
- halign="right"
- top_pad="10">
+ left_delta="0"
+ top_pad="40"
+ width="300">
+ SansSerif BOLD
+ </text>
+ <text
+ font="SansSerif"
+ font.style="BOLD|UNDERLINE"
+ height="10"
+ layout="topleft"
+ left_delta="0"
+ top_pad="10"
+ width="300">
+ SansSerif BOLD UNDERLINE
+ </text>
+ <text
+ bottom="390"
+ left="10"
+ name="right_aligned_text"
+ width="300"
+ halign="right"
+ top_pad="10">
Right aligned text
</text>
<text
- type="string"
- length="1"
bottom="390"
- label="N"
- layout="topleft"
left="10"
name="centered_text"
- width="380"
+ width="300"
halign="center"
top_pad="10">
Centered text
</text>
<text
- type="string"
- length="1"
- height="60"
- label="N"
- layout="topleft"
left="10"
name="left_aligned_text"
- width="380"
+ width="300"
halign="left"
top_pad="10">
Left aligned text
</text>
<text
- type="string"
- length="1"
- bottom="390"
- label="N"
- layout="topleft"
+ left="10"
+ name="v_pad_text"
+ height="40"
+ width="300"
+ halign="left"
+ top_pad="10"
+ v_pad="10">
+ v_pad = 10, height = 40
+ </text>
+ <text
+ left="10"
+ name="v_pad_text"
+ height="40"
+ width="300"
+ halign="left"
+ top_pad="10"
+ h_pad="30">
+ h_pad = 30, height = 40
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ right="-10"
+ height="20"
+ follows="top|left"
+ font.name="SansSerifSmall"
+ name="test_text10"
+ tool_tip="text">
+ SansSerifSmall
+ The 华文细黑 brown fox ヒラキjumped over the lazy dog.
+ </text>
+ <text
+ top_pad="10"
left="10"
- name="floater_map_north"
- right="30"
- top="370">
- N
+ right="-10"
+ height="25"
+ follows="top|left"
+ font.name="SansSerifMedium"
+ name="test_text11"
+ tool_tip="text">
+ SansSerif
+ The 华文细黑 brown fox ヒラキjumped over the lazy dog.
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ right="-10"
+ follows="top|left"
+ height="26"
+ font.name="SansSerifLarge"
+ name="test_text12"
+ tool_tip="text">
+ SansSerifLarge
+ The 华文细黑 brown fox ヒラキjumped over the lazy dog.
+ </text>
+ <text
+ top_pad="10"
+ left="10"
+ height="35"
+ right="-10"
+ follows="top|left"
+ font.name="SansSerifHuge"
+ name="test_text13"
+ tool_tip="text">
+ SansSerifHuge
+ The 华文细黑 brown fox ヒラキjumped over the lazy dog.
+ </text>
+
+<!-- next column -->
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left="400"
+ name="test_text_editor"
+ tool_tip="text editor"
+ top="25"
+ width="200">
+ Text Editor
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left_delta="0"
+ name="long_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200">
+Text Editor
+with multiple
+lines of text
+and hence a
+scroll bar
+ </text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ left_delta="0"
+ max_length="65536"
+ name="blob_text_editor"
+ tool_tip="text editor"
+ top_pad="10"
+ width="200"
+ word_wrap="true">
+Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
+ </text_editor>
+ <text
+ height="40"
+ follows="top|left|bottom"
+ layout="topleft"
+ name="test_text_box"
+ tool_tip="text box"
+ top_pad="5"
+ width="200">
+Text box
+with
+multiple lines
+and too many lines
+to actually fit
</text>
-
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 636e9d465a..e3851de8e7 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -303,7 +303,7 @@
name="checkbox snap to grid"
width="134" />
<combo_box
- height="19"
+ height="23"
layout="topleft"
follows="left|top"
name="combobox grid mode"
@@ -2338,16 +2338,16 @@ even though the user gets a free copy.
left="10"
name="tex gen"
top_pad="5"
- width="87">
+ width="85">
Mapping
</text>
<combo_box
- height="22"
+ height="23"
layout="topleft"
left_delta="0"
name="combobox texgen"
top_pad="4"
- width="60">
+ width="85">
<combo_box.item
label="Default"
name="Default"
@@ -2364,18 +2364,18 @@ even though the user gets a free copy.
height="10"
layout="topleft"
name="label shininess"
- left_pad="5"
+ left_pad="4"
top_pad="-36"
- width="60">
+ width="85">
Shininess
</text>
<combo_box
- height="22"
+ height="23"
layout="topleft"
left_delta="0"
name="combobox shininess"
top_pad="4"
- width="60">
+ width="85">
<combo_box.item
label="None"
name="None"
@@ -2399,19 +2399,19 @@ even though the user gets a free copy.
follows="left|top"
height="10"
layout="topleft"
- left_pad="5"
+ left_pad="4"
name="label bumpiness"
top_pad="-36"
- width="87">
+ width="85">
Bumpiness
</text>
<combo_box
- height="22"
+ height="23"
layout="topleft"
left_delta="0"
name="combobox bumpiness"
top_pad="4"
- width="87">
+ width="85">
<combo_box.item
label="None"
name="None"
@@ -2604,7 +2604,7 @@ even though the user gets a free copy.
width="170" />
<button
follows="left|top"
- height="19"
+ height="23"
label="Apply"
label_selected="Apply"
layout="topleft"
@@ -2739,13 +2739,14 @@ even though the user gets a free copy.
decouple_texture_size="true" />
<button
follows="left|top"
- height="19"
+ height="23"
label="Align"
label_selected="Align Media"
layout="topleft"
left="10"
name="button align"
top_pad="5"
+ tool_tip="Align media texture (must load first)"
width="100" />
</panel>
</panel>
@@ -2780,7 +2781,7 @@ even though the user gets a free copy.
width="130" />
<panel_inventory_object
follows="left|top"
- height="210"
+ height="325"
layout="topleft"
left="10"
name="contents_inventory"
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
new file mode 100644
index 0000000000..04696ca2e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="true"
+ height="300"
+ layout="topleft"
+ name="floater_voice_controls"
+ title="Voice Controls"
+ save_visibility="true"
+ single_instance="true"
+ width="282">
+ <string
+ name="title_nearby">
+ NEARBY VOICE
+ </string>
+ <string
+ name="title_group">
+ Group Call with [GROUP]
+ </string>
+ <string
+ name="title_adhoc">
+ Conference Call
+ </string>
+ <string
+ name="no_one_near">
+ No one near
+ </string>
+ <panel
+ bevel_style="in"
+ follows="left|right|top"
+ height="62"
+ layout="topleft"
+ left="0"
+ name="control_panel"
+ width="282">
+ <panel
+ height="18"
+ follows="top|left|right"
+ layout="topleft"
+ left="10"
+ name="my_panel"
+ width="263">
+ <avatar_icon
+ enabled="false"
+ follows="left|top"
+ height="18"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left="0"
+ name="user_icon"
+ top="0"
+ width="18" />
+ <text
+ follows="top|left|right"
+ font="SansSerifSmallBold"
+ height="16"
+ layout="topleft"
+ left_pad="10"
+ name="user_text"
+ text_color="white"
+ top="4"
+ use_ellipses="true"
+ value="Mya Avatar:"
+ width="210" />
+ <output_monitor
+ auto_update="true"
+ draw_border="false"
+ follows="right"
+ height="16"
+ layout="topleft"
+ name="speaking_indicator"
+ right="-1"
+ top="2"
+ visible="true"
+ width="20" />
+ </panel>
+ <layout_stack
+ bottom="10"
+ clip="false"
+ follows="left|right|top"
+ height="24"
+ layout="bottomleft"
+ orientation="horizontal"
+ width="262">
+ <layout_panel
+ follows="left"
+ layout="topleft"
+ min_width="24"
+ top="0"
+ user_resize="false"
+ width="24">
+ <icon
+ height="24"
+ image_name="Microphone_On"
+ layout="topleft"
+ name="Microphone_On"
+ top="0"
+ width="24" />
+ </layout_panel>
+ <layout_panel
+ layout="topleft"
+ top="0"
+ user_resize="false"
+ width="258">
+ <slider_bar
+ control_name="AudioLevelMic"
+ follows="left|right|top"
+ height="24"
+ increment="0.05"
+ layout="topleft"
+ left="0"
+ max_val="2"
+ name="volume_slider_bar"
+ tool_tip="Master Volume"
+ top="0"
+ value="0.75"
+ width="258" />
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ <avatar_list
+ follows="all"
+ height="197"
+ ignore_online_status="true"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="speakers_list"
+ width="282" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index f48af2f97e..3929e3277a 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -4,106 +4,100 @@
Single instance - only have one at a time, recycle it each spawn
-->
<floater
- legacy_header_height="18"
+ legacy_header_height="25"
bevel_style="in"
bg_opaque_image="Inspector_Background"
can_close="false"
can_minimize="false"
- height="138"
+ height="148"
layout="topleft"
name="inspect_group"
single_instance="true"
sound_flags="0"
visible="true"
- width="245">
+ width="228">
<string name="PrivateGroup">Private group</string>
<string name="FreeToJoin">Free to join</string>
<string name="CostToJoin">L$[AMOUNT] to join</string>
<string name="YouAreMember">You are a member</string>
<text
follows="all"
- font="SansSerifLargeBold"
- height="18"
+ font="SansSerifLarge"
+ height="16"
left="8"
name="group_name"
- top="5"
- text_color="white"
+ top="10"
+ text_color="White"
use_ellipses="true"
- width="240"
+ width="175"
word_wrap="false">
Grumpity&apos;s Grumpy Group of Moose
</text>
<text
follows="all"
- font="SansSerifSmallBold"
+ font="SansSerifSmall"
text_color="White"
- height="18"
+ height="16"
left="8"
name="group_subtitle"
use_ellipses="true"
- top_pad="0"
- width="170">
+ width="175">
123 members
</text>
<text
follows="all"
- height="50"
+ height="45"
left="8"
name="group_details"
- top_pad="0"
- width="170"
+ top_pad="6"
+ width="220"
word_wrap="true">
A group of folks charged with creating a room with a moose.
Fear the moose! Fear it! And the mongoose too!
</text>
<text
follows="all"
- height="15"
+ height="13"
left="8"
name="group_cost"
- top_pad="2"
- width="170">
+ top_pad="3"
+ width="220">
L$123 to join
</text>
<icon
follows="all"
height="38"
- right="-25"
+ right="-10"
mouse_opaque="true"
name="group_icon"
- top="24"
- width="38" />
- <!-- Must be tab_stop="true" so something can hold focus even when the
- other buttons are disabled or invisible, otherwise inspector closes -->
- <button
- follows="top|left"
- height="18"
- image_disabled="ForwardArrow_Disabled"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
- name="view_profile_btn"
- right="-8"
- top="35"
- left_delta="110"
- tab_stop="true"
- width="18"
- commit_callback.function="InspectGroup.ViewProfile" />
+ top="10"
+ width="38"
+ bevel_style="in" />
<button
follows="bottom|left"
height="23"
label="Join"
left="8"
- top="246"
+ top="266"
name="join_btn"
- width="100"
+ width="103"
commit_callback.function="InspectGroup.Join"/>
<button
follows="bottom|left"
height="23"
label="Leave"
left="8"
- top="246"
+ top="266"
name="leave_btn"
- width="100"
+ width="103"
commit_callback.function="InspectGroup.Leave"/>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="View Profile"
+ name="view_profile_btn"
+ top="266"
+ left="117"
+ width="103"
+ commit_callback.function="InspectGroup.ViewProfile" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index cf4b486561..f9a97ede67 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -586,20 +586,7 @@ To place the media on only one face, choose Select Texture and click on the desi
notext="Cancel"
yestext="OK"/>
</notification>
-
- <notification
- icon="alertmodal.tga"
- name="WhiteListInvalidatesHomeUrl"
- type="alertmodal">
-Adding this entry to the whitelist will invalidate the home URL you
-specified for this instance of media. You are not allowed to do this
-so the entry cannot be added to the whitelist.
- <usetemplate
- name="okbutton"
- yestext="Ok"/>
- </notification>
-
-
+
<notification
icon="alertmodal.tga"
name="MustBeInParcel"
@@ -1172,6 +1159,13 @@ Eject [AVATAR_NAME] from your land?
<notification
icon="alertmodal.tga"
+ name="EjectAvatarFromGroup"
+ type="notify">
+You ejected [AVATAR_NAME] from group [GROUP_NAME]
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="AcquireErrorTooManyObjects"
type="alertmodal">
ACQUIRE ERROR: Too many objects selected.
@@ -2375,15 +2369,15 @@ Please choose the male or female avatar. You can change your mind later.
<notification
icon="alertmodal.tga"
name="GrantedModifyRights"
- type="alertmodal">
-[FIRST_NAME] [LAST_NAME] has given you permission to edit their objects.
+ type="notify">
+[NAME] has given you permission to edit their objects.
</notification>
<notification
icon="alertmodal.tga"
name="RevokedModifyRights"
- type="alertmodal">
-Your privilege to modify [FIRST_NAME] [LAST_NAME]&apos;s objects has been revoked
+ type="notify">
+Your privilege to modify [NAME]&apos;s objects has been revoked
</notification>
<notification
@@ -5776,6 +5770,26 @@ Server Error: Media update or get failed.
yestext="OK"/>
</notification>
+ <notification
+ icon="alertmodal.tga"
+ name="TextChatIsMutedByModerator"
+ type="alertmodal">
+Your text chat has been muted by moderator.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="VoiceIsMutedByModerator"
+ type="alertmodal">
+Your voice has been muted by moderator.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
<notification
icon="alertmodal.tga"
name="ConfirmClearTeleportHistory"
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index 368ab17689..f5fce65c73 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -48,7 +48,6 @@
visible="false"
width="100" />
<button
- enabled="false"
follows="all"
bottom="10"
height="20"
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 2eaa3a94ee..45f9d9c7b6 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -7,6 +7,18 @@
name="avatar_list_item"
top="0"
width="320">
+ <!--
+ Strings used to localize last interaction time.
+ See last_interaction textbox below.
+ -->
+ <string name="FormatSeconds">[COUNT]s</string>
+ <string name="FormatMinutes">[COUNT]m</string>
+ <string name="FormatHours">[COUNT]h</string>
+ <string name="FormatDays">[COUNT]d</string>
+ <string name="FormatWeeks">[COUNT]w</string>
+ <string name="FormatMonths">[COUNT]mon</string>
+ <string name="FormatYears">[COUNT]y</string>
+
<icon
follows="top|right|left"
height="24"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index da8006d545..ec3f7ea7c5 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -72,7 +72,13 @@
left="0"
name="talk"
top="4"
- width="100" />
+ width="100">
+ <show_button>
+ <show_button.init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="voice_controls" />
+ </show_button>
+ </talk_button>
</layout_panel>
<icon
auto_resize="false"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_item.xml b/indra/newview/skins/default/xui/en/panel_chat_item.xml
index ce4e4701b6..34c6e02684 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_item.xml
@@ -2,85 +2,26 @@
<!-- All our XML is utf-8 encoded. -->
<panel
name="instant_message"
- width="300"
+ width="315"
height="180"
follows="all">
- <panel
- width="290"
- height="24"
- background_visible="true"
- background_opaque="false"
- bg_alpha_color="Black"
- left="5"
- name="msg_caption">
- <avatar_icon
- follows="left"
- height="18"
- image_name="Generic_Person"
- layout="topleft"
- left="3"
- mouse_opaque="true"
- name="avatar_icon"
- top="3"
- width="18" />
- <text
- font.style="BOLD"
- height="12"
- layout="topleft"
- left_pad="5"
- top="7"
- text_color="white"
- word_wrap="false"
- use_ellipses="true"
- mouse_opaque="true"
- name="sender_name"
- width="150">
- Jerry Knight
- </text>
-<!-- <icon
- top="22"
- left="215"
- width="15"
- height="15"
- follows="top|right"
- image_name="icn_voice-pvtfocus.tga"
- visible="false"
- name="msg_inspector" />
--->
-<!-- <icon
- top="22"
- left="215"
- width="10"
- height="10"
- follows="top|right"
- image_name="speaking_indicator.tga"
- name="msg_icon"/>
--->
- <text
- font="SansSerifSmall"
- follows="right|top"
- halign="right"
- height="13"
- layout="topleft"
- right="-10"
- left="205"
- mouse_opaque="true"
- name="msg_time"
- top="8"
- value="23:30"
- width="50"
- word_wrap="true" />
- </panel>
+ <avatar_icon
+ follows="left|top"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="true"
+ name="avatar_icon"
+ top="3"
+ width="18" />
<text_chat
- top="-35"
- left="10"
- right="-10"
+ top="5"
+ left="30"
height="120"
- follows="left|right|bottom"
text_color="white"
word_wrap="true"
mouse_opaque="true"
name="msg_text">
- To be or not to be, that is the question. Tis a far far better thing I do than I have ever done. Tis a far far better place I go, than I have ever been.
</text_chat>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index 41b210557e..889f29fc53 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -61,7 +61,6 @@
width="125"/>
<button
- enabled="false"
bottom="10"
follows="all"
height="20"
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 0a5812882d..0a3fd1699f 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -76,7 +76,6 @@
visible="false"
width="100" />
<button
- enabled="false"
bottom="10"
height="20"
label="Voice Controls"
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 4b91dc6294..c52b0c83d0 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -6,6 +6,7 @@
layout="topleft"
left="0"
width="380"
+ help_topic="panel_landmarks"
border="true"
background_visible="true"
bg_alpha_color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
index e00f654750..b82a435b41 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_general.xml
@@ -10,17 +10,27 @@
name="Media Settings General"
help_topic = "media_settings_general"
width="365">
-
- <text
- bottom_delta="-17"
- follows="top|left"
- height="15"
- left="10"
+
+ <text
+ bottom_delta="-25"
+ follows="top|left"
+ height="15"
+ left="10"
name="home_label">
Home URL:
</text>
+ <text
+ visible="false"
+ bottom_delta="0"
+ follows="top|left"
+ height="15"
+ left_delta="64"
+ text_color="red"
+ name="home_fails_whitelist_label">
+ (This URL does not pass the specified whitelist)
+ </text>
<line_editor
- bottom_delta="-21"
+ bottom_delta="-24"
enabled="true"
follows="left|top"
font="SansSerif"
@@ -221,12 +231,23 @@
width="50" />
<text bottom_delta="0" follows="top|left" height="15" left_delta="60" name="X_label">
- X
+ X
</text>
- <spinner bottom_delta="0"
- decimal_digits="0" enabled="true" follows="left|top" height="16"
- increment="1" initial_val="256" label="" label_width="0"
- left_delta="20" max_val="2048" min_val="0" mouse_opaque="true"
- name="height_pixels" width="50" />
+ <spinner
+ bottom_delta="0"
+ decimal_digits="0"
+ enabled="true"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_val="256"
+ label=""
+ label_width="0"
+ left_delta="20"
+ max_val="2048"
+ min_val="0"
+ mouse_opaque="true"
+ name="height_pixels"
+ width="50" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
index a26f74844e..7d9350b45f 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
@@ -30,8 +30,28 @@
name="whitelist"
width="315"
enabled="true" />
+ <icon
+ bottom_delta="-23"
+ right="-35"
+ width="16"
+ height="16"
+ image_name="parcel_color_EXP"
+ mouse_opaque="true"
+ follows="top|left"
+ name="parcel_color_EXP"
+ />
+ <text
+ visible="true"
+ follows="top|left"
+ height="15"
+ left="30"
+ bottom_delta="0"
+ text_color="0.4 0.4 0.4 1.0"
+ name="home_url_fails_some_items_in_whitelist">
+ Entries that the home URL fails against are marked:
+ </text>
<button
- bottom_delta="-30"
+ bottom_delta="-36"
follows="top|left"
height="20"
label="Add"
@@ -54,4 +74,17 @@
<button.commit_callback
function="Media.whitelistDelete"/>
</button>
+ <text
+ visible="true"
+ bottom_delta="-75"
+ follows="top|left"
+ height="40"
+ left="30"
+ text_color="0.6 0.0 0.0 1.0"
+ name="home_url_fails_whitelist">
+Warning: the home URL specified in the General tab
+fails to pass this whitelist. It has been disabled
+until a valid entry has been added.
+ </text>
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index bf33b752d9..e8e4a9dbb2 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -153,8 +153,16 @@
layout="topleft"
left="0"
name="favorite"
- image_drag_indication="Arrow_Down"
- chevron_button_tool_tip="Show more of My Favorites"
- bottom="62"
- width="590" />
+ image_drag_indication="arrow_down.tga"
+ bottom="62"
+ width="590">
+ <chevron_button name=">>"
+ image_unselected="TabIcon_Close_Off"
+ image_selected="TabIcon_Close_Off"
+ tab_stop="false"
+ follows="left|bottom"
+ tool_tip="Show more of My Favorites"
+ width="15"
+ height="15"/>
+ </favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index ca84c9147b..4f0d155876 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -27,6 +27,7 @@
There are no picks/classifieds here
</text>
<accordion
+ fit_parent="true"
follows="all"
height="465"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
index af4c01185a..8b86067b03 100644
--- a/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/en/panel_prim_media_controls.xml
@@ -9,6 +9,11 @@
width="800">
<string name="control_background_image_name">Inspector_Background</string>
<string name="skip_step">0.2</string>
+ <string name="min_width">400</string>
+ <string name="min_height">120</string>
+ <string name="zoom_near_padding">1.0</string>
+ <string name="zoom_medium_padding">1.25</string>
+ <string name="zoom_far_padding">1.5</string>
<panel
name="media_region"
bottom="125"
@@ -20,7 +25,7 @@
name="media_controls"
follows="left|right"
animate="false"
- height="32"
+ height="26"
layout="topleft"
left="0"
orientation="horizontal"
@@ -235,18 +240,17 @@
width="190"
min_width="90">
<!--
- RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
-
-<combo_box
-name="media_address_url"
-allow_text_entry="true"
-height="22"
-layout="topleft"
-max_chars="1024"
-tool_tip = "Media URL"
-<combo_box.commit_callback
-function="MediaCtrl.CommitURL" />
-</combo_box>
+ RE-ENABLE THIS WHEN WE HAVE A HISTORY DROP-DOWN AGAIN
+ <combo_box
+ name="media_address_url"
+ allow_text_entry="true"
+ height="22"
+ layout="topleft"
+ max_chars="1024"
+ tool_tip = "Media URL">
+ <combo_box.commit_callback
+ function="MediaCtrl.CommitURL" />
+ </combo_box>
-->
<line_editor
name="media_address_url"
@@ -304,17 +308,17 @@ function="MediaCtrl.CommitURL" />
user_resize="false"
follows="left|right|top|bottom"
layout="topleft"
+ height="16"
min_width="100"
width="200">
<slider_bar
name="media_play_slider"
follows="left|right|top"
- height="22"
+ height="16"
increment="0.05"
initial_value="0.5"
layout="topleft"
tool_tip="Movie play progress"
- top="8"
min_width="100"
width="200">
<slider_bar.commit_callback
@@ -619,7 +623,7 @@ function="MediaCtrl.CommitURL" />
</layout_stack>
<layout_stack
follows="left|right|bottom"
- height="32"
+ height="20"
layout="topleft"
animate="false"
left="0"
@@ -632,7 +636,7 @@ function="MediaCtrl.CommitURL" />
user_resize="false" />
<panel
name="media_progress_indicator"
- height="22"
+ height="20"
layout="topleft"
left="0"
top="0"
@@ -644,6 +648,7 @@ function="MediaCtrl.CommitURL" />
name="media_progress_bar"
color_bar="1 1 1 0.96"
follows="left|right|top"
+ top="5"
height="8"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 65bc48265d..5dcee9e965 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -42,28 +42,27 @@
<button
auto_resize="true"
halign="right"
- follows="right|bottom"
+ follows="right|top"
image_selected="BuyArrow_Over"
image_unselected="BuyArrow_Off"
image_pressed="BuyArrow_Press"
height="16"
- left="-200"
+ right="-120"
name="buycurrency"
pad_right="20px"
tool_tip="My Balance: Click to buy more L$"
- top="1"
+ top="0"
width="90" />
<text
type="string"
- length="1"
font="SansSerifSmall"
text_readonly_color="TimeTextColor"
follows="right|bottom"
halign="right"
height="16"
- top="5"
+ top="4"
layout="topleft"
- left_pad="-5"
+ left_pad="-7"
name="TimeText"
text_color="TimeTextColor"
tool_tip="Current time (Pacific)"
@@ -76,11 +75,22 @@
image_selected="parcel_drk_VoiceNo"
image_unselected="parcel_drk_Voice"
is_toggle="true"
- left_pad="5"
+ left_pad="18"
top="1"
name="volume_btn"
tool_tip="Global Volume Control"
width="16" />
+ <panel
+ class="panel_volume_pulldown"
+ follows="all"
+ height="533"
+ layout="topleft"
+ left="0"
+ name="volume_pulldown"
+ top="5"
+ visible="false"
+ width="313" />
+
<text
enabled="true"
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 01204ba779..32fc9fce01 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="Teleport History" bottom="0" height="326" left="0" width="380"
+ help_topic="panel_teleport_history"
border="true" follows="left|top|right|bottom">
<accordion
follows="left|top|right|bottom"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index d44bdee947..e795c8e241 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -267,6 +267,7 @@
<string name="ChangePermissions">Change its permissions</string>
<string name="TrackYourCamera">Track your camera</string>
<string name="ControlYourCamera">Control your camera</string>
+ <string name="NotConnected">Not Connected</string>
<!-- Sim Access labels -->
<string name="SIM_ACCESS_PG">General</string>
@@ -2263,22 +2264,17 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Attached">Attached</string>
<string name="Attached Earlobes">Attached Earlobes</string>
-<string name="Back Bangs">Back Bangs</string>
-<string name="Back Bangs Down">Back Bangs Down</string>
-<string name="Back Bangs Up">Back Bangs Up</string>
+
<string name="Back Fringe">Back Fringe</string>
-<string name="Back Hair">Back Hair</string>
-<string name="Back Hair Down">Back Hair Down</string>
-<string name="Back Hair Up">Back Hair Up</string>
+
<string name="Baggy">Baggy</string>
<string name="Bangs">Bangs</string>
-<string name="Bangs Down">Bangs Down</string>
-<string name="Bangs Up">Bangs Up</string>
+
<string name="Beady Eyes">Beady Eyes</string>
<string name="Belly Size">Belly Size</string>
<string name="Big">Big</string>
<string name="Big Butt">Big Butt</string>
-<string name="Big Eyeball">Big Eyeball</string>
+
<string name="Big Hair Back">Big Hair: Back</string>
<string name="Big Hair Front">Big Hair: Front</string>
<string name="Big Hair Top">Big Hair: Top</string>
@@ -2348,20 +2344,20 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Corner Down">Corner Down</string>
-<string name="Corner Normal">Corner Normal</string>
+
<string name="Corner Up">Corner Up</string>
<string name="Creased">Creased</string>
<string name="Crooked Nose">Crooked Nose</string>
-<string name="Cropped Hair">Cropped Hair</string>
+
<string name="Cuff Flare">Cuff Flare</string>
<string name="Dark">Dark</string>
<string name="Dark Green">Dark Green</string>
<string name="Darker">Darker</string>
<string name="Deep">Deep</string>
<string name="Default Heels">Default Heels</string>
-<string name="Default Toe">Default Toe</string>
+
<string name="Dense">Dense</string>
-<string name="Dense hair">Dense hair</string>
+
<string name="Double Chin">Double Chin</string>
<string name="Downturned">Downturned</string>
<string name="Duffle Bag">Duffle Bag</string>
@@ -2377,7 +2373,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Eye Pop">Eye Pop</string>
<string name="Eye Size">Eye Size</string>
<string name="Eye Spacing">Eye Spacing</string>
-<string name="Eyeball Size">Eyeball Size</string>
+
<string name="Eyebrow Arc">Eyebrow Arc</string>
<string name="Eyebrow Density">Eyebrow Density</string>
@@ -2388,27 +2384,22 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Eyelash Length">Eyelash Length</string>
<string name="Eyeliner">Eyeliner</string>
<string name="Eyeliner Color">Eyeliner Color</string>
-<string name="Eyes Back">Eyes Back</string>
+
<string name="Eyes Bugged">Eyes Bugged</string>
-<string name="Eyes Forward">Eyes Forward</string>
-<string name="Eyes Long Head">Eyes Long Head</string>
+
+
<string name="Eyes Shear Left Up">Eyes Shear Left Up</string>
<string name="Eyes Shear Right Up">Eyes Shear Right Up</string>
-<string name="Eyes Short Head">Eyes Short Head</string>
-<string name="Eyes Spread">Eyes Spread</string>
-<string name="Eyes Sunken">Eyes Sunken</string>
-<string name="Eyes Together">Eyes Together</string>
+
+
+
+
<string name="Face Shear">Face Shear</string>
<string name="Facial Definition">Facial Definition</string>
<string name="Far Set Eyes">Far Set Eyes</string>
-<string name="Fat">Fat</string>
-<string name="Fat Head">Fat Head</string>
+
<string name="Fat Lips">Fat Lips</string>
-<string name="Fat Lower">Fat Lower</string>
-<string name="Fat Lower Lip">Fat Lower Lip</string>
-<string name="Fat Torso">Fat Torso</string>
-<string name="Fat Upper">Fat Upper</string>
-<string name="Fat Upper Lip">Fat Upper Lip</string>
+
<string name="Female">Female</string>
<string name="Fingerless">Fingerless</string>
<string name="Fingers">Fingers</string>
@@ -2421,12 +2412,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Forehead Angle">Forehead Angle</string>
<string name="Forehead Heavy">Forehead Heavy</string>
<string name="Freckles">Freckles</string>
-<string name="Front Bangs Down">Front Bangs Down</string>
-<string name="Front Bangs Up">Front Bangs Up</string>
+
<string name="Front Fringe">Front Fringe</string>
-<string name="Front Hair">Front Hair</string>
-<string name="Front Hair Down">Front Hair Down</string>
-<string name="Front Hair Up">Front Hair Up</string>
+
<string name="Full Back">Full Back</string>
<string name="Full Eyeliner">Full Eyeliner</string>
<string name="Full Front">Full Front</string>
@@ -2525,7 +2513,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Long Ponytail">Long Ponytail</string>
<string name="Long Torso">Long Torso</string>
<string name="Long arms">Long arms</string>
-<string name="Longcuffs">Longcuffs</string>
+
<string name="Loose Pants">Loose Pants</string>
<string name="Loose Shirt">Loose Shirt</string>
@@ -2585,7 +2573,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="No Blush">No Blush</string>
<string name="No Eyeliner">No Eyeliner</string>
<string name="No Eyeshadow">No Eyeshadow</string>
-<string name="No Heels">No Heels</string>
+
<string name="No Lipgloss">No Lipgloss</string>
<string name="No Lipstick">No Lipstick</string>
<string name="No Part">No Part</string>
@@ -2606,7 +2594,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Nostril Division">Nostril Division</string>
<string name="Nostril Width">Nostril Width</string>
-<string name="Old">Old</string>
+
<string name="Opaque">Opaque</string>
<string name="Open">Open</string>
<string name="Open Back">Open Back</string>
@@ -2643,7 +2631,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Platform Width">Platform Width</string>
<string name="Pointy">Pointy</string>
<string name="Pointy Heels">Pointy Heels</string>
-<string name="Pointy Toe">Pointy Toe</string>
+
<string name="Ponytail">Ponytail</string>
<string name="Poofy Skirt">Poofy Skirt</string>
<string name="Pop Left Eye">Pop Left Eye</string>
@@ -2652,30 +2640,30 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Puffy Eyelids">Puffy Eyelids</string>
<string name="Rainbow Color">Rainbow Color</string>
<string name="Red Hair">Red Hair</string>
-<string name="Red Skin">Red Skin</string>
+
<string name="Regular">Regular</string>
-<string name="Regular Muscles">Regular Muscles</string>
+
<string name="Right Part">Right Part</string>
<string name="Rosy Complexion">Rosy Complexion</string>
<string name="Round">Round</string>
-<string name="Round Forehead">Round Forehead</string>
+
<string name="Ruddiness">Ruddiness</string>
<string name="Ruddy">Ruddy</string>
<string name="Rumpled Hair">Rumpled Hair</string>
<string name="Saddle Bags">Saddle Bags</string>
-<string name="Saddlebags">Saddlebags</string>
-<string name="Scrawny">Scrawny</string>
+
+
<string name="Scrawny Leg">Scrawny Leg</string>
<string name="Separate">Separate</string>
-<string name="Shading">Shading</string>
-<string name="Shadow hair">Shadow hair</string>
+
+
<string name="Shallow">Shallow</string>
<string name="Shear Back">Shear Back</string>
<string name="Shear Face">Shear Face</string>
<string name="Shear Front">Shear Front</string>
-<string name="Shear Left">Shear Left</string>
+
<string name="Shear Left Up">Shear Left Up</string>
-<string name="Shear Right">Shear Right</string>
+
<string name="Shear Right Up">Shear Right Up</string>
<string name="Sheared Back">Sheared Back</string>
<string name="Sheared Front">Sheared Front</string>
@@ -2699,16 +2687,14 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Short Torso">Short Torso</string>
<string name="Short hips">Short hips</string>
<string name="Shoulders">Shoulders</string>
-<string name="Side Bangs">Side Bangs</string>
-<string name="Side Bangs Down">Side Bangs Down</string>
-<string name="Side Bangs Up">Side Bangs Up</string>
+
<string name="Side Fringe">Side Fringe</string>
<string name="Sideburns">Sideburns</string>
<string name="Sides Hair">Sides Hair</string>
<string name="Sides Hair Down">Sides Hair Down</string>
<string name="Sides Hair Up">Sides Hair Up</string>
-<string name="Skinny">Skinny</string>
+
<string name="Skinny Neck">Skinny Neck</string>
<string name="Skirt Fit">Skirt Fit</string>
<string name="Skirt Length">Skirt Length</string>
@@ -2729,7 +2715,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Smooth Hair">Smooth Hair</string>
<string name="Socks Length">Socks Length</string>
-<string name="Some">Some</string>
+
<string name="Soulpatch">Soulpatch</string>
<string name="Sparse">Sparse</string>
@@ -2737,24 +2723,21 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Square">Square</string>
<string name="Square Toe">Square Toe</string>
<string name="Squash Head">Squash Head</string>
-<string name="Squash/Stretch Head">Squash/Stretch Head</string>
+
<string name="Stretch Head">Stretch Head</string>
<string name="Sunken">Sunken</string>
<string name="Sunken Chest">Sunken Chest</string>
<string name="Sunken Eyes">Sunken Eyes</string>
<string name="Sweep Back">Sweep Back</string>
<string name="Sweep Forward">Sweep Forward</string>
-<string name="Swept Back">Swept Back</string>
-<string name="Swept Back Hair">Swept Back Hair</string>
-<string name="Swept Forward">Swept Forward</string>
-<string name="Swept Forward Hair">Swept Forward Hair</string>
+
<string name="Tall">Tall</string>
<string name="Taper Back">Taper Back</string>
<string name="Taper Front">Taper Front</string>
<string name="Thick Heels">Thick Heels</string>
<string name="Thick Neck">Thick Neck</string>
<string name="Thick Toe">Thick Toe</string>
-<string name="Thickness">Thickness</string>
+
<string name="Thin">Thin</string>
<string name="Thin Eyebrows">Thin Eyebrows</string>
<string name="Thin Lips">Thin Lips</string>
@@ -2765,8 +2748,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="Tight Shirt">Tight Shirt</string>
<string name="Tight Skirt">Tight Skirt</string>
<string name="Tight Sleeves">Tight Sleeves</string>
-<string name="Tilt Left">Tilt Left</string>
-<string name="Tilt Right">Tilt Right</string>
+
<string name="Toe Shape">Toe Shape</string>
<string name="Toe Thickness">Toe Thickness</string>
<string name="Torso Length">Torso Length</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
index 08c337455c..c0e1944f56 100644
--- a/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/widgets/accordion_tab.xml
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<accordion_tab
- font="SansSerifBold"
header_bg_color="DkGray2"
header_collapse_img="Accordion_ArrowClosed_Off"
header_collapse_img_pressed="Accordion_ArrowClosed_Press"
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index ea78f6d0dd..d32952b04f 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -53,35 +53,40 @@
name="voice_icon"
width="22"
height="18"
- top="21"
+ top="21"
+ follows="right|top"
image_name="parcel_lght_VoiceNo"
/>
<fly_icon
name="fly_icon"
width="22"
height="18"
- top="21"
+ top="21"
+ follows="right|top"
image_name="parcel_lght_FlyNo"
/>
<push_icon
name="push_icon"
width="22"
height="18"
- top="21"
+ top="21"
+ follows="right|top"
image_name="parcel_lght_PushNo"
/>
<build_icon
name="build_icon"
width="22"
height="18"
- top="21"
+ top="21"
+ follows="right|top"
image_name="parcel_lght_BuildNo"
/>
<scripts_icon
name="scripts_icon"
width="22"
height="18"
- top="21"
+ top="21"
+ follows="right|top"
image_name="parcel_lght_ScriptsNo"
/>
<!-- NOTE: Placeholder icon, there is no dark grayscale version -->
@@ -89,7 +94,8 @@
name="damage_icon"
width="22"
height="18"
- top="21"
+ top="21"
+ follows="right|top"
image_name="parcel_lght_Damage"
/>
<!-- Default text color is invisible on top of nav bar background -->
@@ -98,6 +104,7 @@
width="35"
height="18"
top="16"
+ follows="right|top"
halign="right"
font="SansSerifSmall"
text_color="TextFgColor"
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index af542acbce..eb25493adc 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est" width="138" left_delta="68">
- L$ por, aprox., [USD] US$
+ por, aprox., [LOCALAMOUNT]
</text>
<text name="getting_data">
Obteniendo los datos...
@@ -63,6 +63,6 @@ Aumente la cantidad a comprar.
<button label="Cancelar" name="cancel_btn"/>
<button label="Comprar" name="buy_btn"/>
<string name="buy_currency">
- Compre [LINDENS] L$ por, aprox., [USD] US$
+ Compre [LINDENS] L$ por, aprox., [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index 4417006fc6..a4ad14294e 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -114,12 +114,13 @@ La longueur maximale est de [MAX_LENGTH] secondes.
</text>
<spinner label="Priorité" name="priority" tool_tip="Contrôle quelles animations peuvent êtres écrasées par cette animation."/>
<check_box label="Boucle" left="6" name="loop_check" tool_tip="Joue cette animation en boucle."/>
- <spinner label="Début (%)" label_width="55" left="76" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart." width="105"/>
- <spinner label="Fin (%)" left="195" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
- <text name="hand_label" width="110">
- Mouvement de main
+ <spinner label="Début (%)" label_width="65" name="loop_in_point" tool_tip="Définit le moment de l&apos;animation où la boucle repart." width="105"/>
+ <spinner label="Fin (%)" name="loop_out_point" tool_tip="Définit le moment de l&apos;animation où la boucle finit."/>
+ <text name="hand_label">
+ Mouvement de
+main
</text>
- <combo_box label="" left_delta="116" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation" width="124">
+ <combo_box label="" name="hand_pose_combo" tool_tip="Contrôle le mouvement des mains au cours de l&apos;animation">
<combo_box.item label="Doigts écartés" name="Spread"/>
<combo_box.item label="Détendues" name="Relaxed"/>
<combo_box.item label="Pointer (les deux)" name="PointBoth"/>
@@ -137,7 +138,7 @@ La longueur maximale est de [MAX_LENGTH] secondes.
<text name="emote_label">
Expression
</text>
- <combo_box label="" left_delta="116" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation." width="124">
+ <combo_box label="" name="emote_combo" tool_tip="Contrôle l&apos;expression du visage au cours de l&apos;animation.">
<combo_box.item label="None]" name="[None]"/>
<combo_box.item label="Aaaaah" name="Aaaaah"/>
<combo_box.item label="Effrayé" name="Afraid"/>
@@ -159,27 +160,25 @@ La longueur maximale est de [MAX_LENGTH] secondes.
<combo_box.item label="Clin d&apos;œil" name="Wink"/>
<combo_box.item label="Soucis" name="Worry"/>
</combo_box>
- <text name="preview_label" width="110">
- Prévisualiser pendant
+ <text name="preview_label">
+ Prévisualiser
+pendant
</text>
- <combo_box label="" left_delta="116" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales." width="124">
+ <combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
<combo_box.item label="Debout" name="Standing"/>
<combo_box.item label="En train de marcher" name="Walking"/>
<combo_box.item label="Assis" name="Sitting"/>
<combo_box.item label="En train de voler" name="Flying"/>
</combo_box>
- <spinner label="Transition
-début (s)" label_width="65" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
- <spinner label="Transition
-fin (s)" label_width="65" left="160" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." width="125"/>
- <button bottom_delta="-48" label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>
+ <spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation s&apos;intègre au mouvement."/>
+ <spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) pendant laquelle l&apos;animation disparaît du mouvement." />
+ <button label="" name="play_btn" tool_tip="Jouer/Arrêter votre animation."/>
<button label="" name="stop_btn" tool_tip="Arrêter le playback"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
Impossible de lire le fichier d&apos;animation.
-Nous recommandons les fichiers BVH extraits de
-Poser 4.
+Nous recommandons les fichiers BVH extraits de Poser 4.
</text>
<button label="Annuler" name="cancel_btn"/>
<button label="Charger ([AMOUNT] L$)" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 9112d30be2..603b7587b4 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est" width="138" left_delta="68">
- L$ pour environ [USD] US$
+ pour environ [LOCALAMOUNT]
</text>
<text name="getting_data" width="138">
Obtention des données...
@@ -64,6 +64,6 @@ Veuillez saisir un montant plus élevé.
<button label="Acheter" name="buy_btn"/>
<button label="Annuler" name="cancel_btn"/>
<string name="buy_currency">
- Acheter [LINDENS] L$ pour environ [USD] US$
+ Acheter [LINDENS] L$ pour environ [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml
index 1f76202dee..ddb868b04a 100644
--- a/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -1,71 +1,68 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="worldmap" title="CARTE DU MONDE">
- <tab_container name="maptab" width="955">
- <panel label="Objets" name="objects_mapview" width="953"/>
- <panel label="Terrain" name="terrain_mapview" width="953"/>
- </tab_container>
- <icon left="973" name="self"/>
+ <panel name="objects_mapview" width="542"/>
+ <icon name="self" left="-270"/>
<text name="you_label">
Vous
</text>
- <icon left="1033" name="home"/>
+ <icon name="home"/>
<text name="home_label">
Domicile
</text>
- <icon left="973" name="square2"/>
+ <icon name="square2" left="-270"/>
<text name="auction_label">
Terrain aux enchères
</text>
- <icon left="1105" name="square"/>
+ <icon name="square" left_delta="130"/>
<text name="land_for_sale_label">
Terrain à vendre
</text>
- <button label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
- <icon left="977" name="person"/>
+ <button left="-120" width="108" label="Aller chez moi" label_selected="Aller chez moi" name="Go Home" tool_tip="Vous téléporte à votre domicile"/>
+ <icon left="-262" name="person"/>
<check_box label="Résident" name="people_chk"/>
- <icon left="973" name="infohub"/>
+ <icon left="-266" name="infohub"/>
<check_box label="Infohub" name="infohub_chk"/>
- <icon left="973" name="telehub"/>
+ <icon left="-266" name="telehub"/>
<check_box label="Téléhub" name="telehubchk"/>
- <icon left="973" name="landforsale"/>
+ <icon left="-266" name="landforsale"/>
<check_box label="Terrain à vendre" name="land_for_sale_chk"/>
- <text name="events_label" left="1099">
+ <text name="events_label" left="-144">
Événements :
</text>
- <icon left="1121" name="event"/>
+ <icon left="-132" name="event"/>
<check_box label="PG" name="event_chk"/>
- <icon left="1121" name="events_mature_icon"/>
+ <icon left="-132" name="events_mature_icon"/>
<check_box label="Mature" name="event_mature_chk"/>
- <icon left="1121" name="events_adult_icon"/>
+ <icon left="-132" name="events_adult_icon"/>
<check_box label="Adult" name="event_adult_chk"/>
- <icon left="973" name="avatar_icon"/>
+ <icon left="-270" name="avatar_icon"/>
<combo_box label="Amis connectés" name="friend combo" tool_tip="Ami à afficher sur la carte" width="232">
<combo_box.item name="item1" label="Amis connectés" />
</combo_box>
- <icon left="973" name="landmark_icon"/>
+ <icon left="-270" name="landmark_icon"/>
<combo_box label="Repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
<combo_box.item name="item1" label="Repères" />
</combo_box>
- <icon left="973" name="location_icon"/>
+ <icon left="-270" name="location_icon"/>
<line_editor label="Rechercher par nom de région" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155"/>
<button label="Rechercher" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/>
- <text left="973" name="search_label">
+ <text left="-270" name="search_label">
Résultats de la recherche :
</text>
- <scroll_list left="973" name="search_results" width="252">
+ <scroll_list left="-270" name="search_results" width="252">
<column label="" name="icon"/>
<column label="" name="sim_name"/>
</scroll_list>
- <text left="973" name="location_label">
+ <text left="-270" name="location_label">
Emplacement :
</text>
- <spinner left="1078" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
+ <spinner left_delta="100" name="spin x" tool_tip="Coordonnées des X du lieu à afficher sur la carte"/>
<spinner name="spin y" tool_tip="Coordonnées des Y du lieu à afficher sur la carte"/>
<spinner name="spin z" tool_tip="Coordonnées des Z du lieu à afficher sur la carte"/>
<button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
<button label="Afficher la destination" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
<button label="Effacer" label_selected="Effacer" left="-270" name="Clear" tool_tip="Arrêter de suivre"/>
<button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de votre avatar" width="165"/>
- <button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLurl pour l&apos;utiliser sur le Web." width="262"/>
+ <button label="Copier la SLurl dans le presse-papiers" left="-270" name="copy_slurl" tool_tip="Copier l&apos;emplacement actuel comme SLurl pour l&apos;utiliser sur le Web." />
<slider label="Zoom" left="-270" name="zoom slider"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 6b881683f1..a22850bc4b 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est">
- L$ per circa [USD]US$
+ per circa [LOCALAMOUNT]
</text>
<text name="getting_data">
Dati in ricezione...
@@ -64,6 +64,6 @@ Devi aumentare l&apos;importo da acquistare.
<button label="Cancella" name="cancel_btn"/>
<button label="Acquista" name="buy_btn"/>
<string name="buy_currency">
- acquistare [LINDENS] L$ per circa [USD] US$
+ acquistare [LINDENS]L$ per circa [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index 9d5aea612b..35516301fc 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est">
- 約US$ [USD]
+ 約[LOCALAMOUNT]
</text>
<text name="getting_data" left_delta="3">
データを取得しています...
@@ -63,6 +63,6 @@
<button label="購入" name="buy_btn" />
<button label="取り消し" name="cancel_btn" />
<text name="buy_currency">
- 約US$ [USD]でL$ [LINDENS]を購入
+ 約[LOCALAMOUNT]でL$ [LINDENS]を購入
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
index b6fc743abe..6ee5cc5341 100644
--- a/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/nl/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est" left_delta="80">
- voor ong. US$ [USD]
+ voor ong. [LOCALAMOUNT]
</text>
<text name="getting_data">
Data ophalen…
@@ -63,6 +63,6 @@ Verhoog de hoeveelheid die gekocht moet worden.
<button label="Annuleren" name="cancel_btn"/>
<button label="Kopen" name="buy_btn"/>
<string name="buy_currency">
- Koop L$ [LINDENS] voor ong. US$ [USD]
+ Koop L$ [LINDENS] voor ong. [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index b0b8935433..5e59482883 100755
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est">
- L$ za [USD]US$
+ za [LOCALAMOUNT]
</text>
<text name="getting_data">
Otrzymywanie danych...
@@ -64,6 +64,6 @@ Proszę zwiększyć ilość.
<button label="Anuluj" name="cancel_btn" />
<button label="Kup" name="buy_btn" />
<string name="buy_currency">
- Kup [LINDENS]L$ za [USD]US$
+ Kup [LINDENS]L$ za [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index ceeb070c4e..aac8438fdc 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -29,7 +29,7 @@
1234
</line_editor>
<text name="currency_est" left_delta="72">
- por aproxim. US$ [USD]
+ por aproxim. [LOCALAMOUNT]
</text>
<text name="getting_data">
Obtendo dados...
@@ -63,6 +63,6 @@ Aumente a quantidade de compra.
<button label="Fechar" name="cancel_btn"/>
<button label="Adquirir" name="buy_btn"/>
<string name="buy_currency">
- Comprar L$ [LINDENS] por aproximadamente US$ [USD]
+ Comprar L$ [LINDENS] por aproxim. [LOCALAMOUNT]
</string>
</floater>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 4193343d64..4133315480 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -278,10 +278,12 @@ class WindowsManifest(ViewerManifest):
# Vivox runtimes
self.path("SLVoice.exe")
- self.path("alut.dll")
self.path("vivoxsdk.dll")
self.path("ortp.dll")
- self.path("wrap_oal.dll")
+ self.path("libsndfile-1.dll")
+ self.path("zlib1.dll")
+ self.path("vivoxplatform.dll")
+ self.path("vivoxoal.dll")
# For google-perftools tcmalloc allocator.
try:
@@ -537,10 +539,11 @@ class DarwinManifest(ViewerManifest):
self.path("zh-Hans.lproj")
# SLVoice and vivox lols
- self.path("vivox-runtime/universal-darwin/libalut.dylib", "libalut.dylib")
- self.path("vivox-runtime/universal-darwin/libopenal.dylib", "libopenal.dylib")
+ self.path("vivox-runtime/universal-darwin/libsndfile.dylib", "libsndfile.dylib")
+ self.path("vivox-runtime/universal-darwin/libvivoxoal.dylib", "libvivoxoal.dylib")
self.path("vivox-runtime/universal-darwin/libortp.dylib", "libortp.dylib")
self.path("vivox-runtime/universal-darwin/libvivoxsdk.dylib", "libvivoxsdk.dylib")
+ self.path("vivox-runtime/universal-darwin/libvivoxplatform.dylib", "libvivoxplatform.dylib")
self.path("vivox-runtime/universal-darwin/SLVoice", "SLVoice")
libdir = "../../libraries/universal-darwin/lib_release"
@@ -839,7 +842,10 @@ class Linux_i686Manifest(LinuxManifest):
self.end_prefix()
if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
self.path("libortp.so")
+ self.path("libsndfile.so.1")
+ self.path("libvivoxoal.so.1")
self.path("libvivoxsdk.so")
+ self.path("libvivoxplatform.so")
self.end_prefix("lib")
class Linux_x86_64Manifest(LinuxManifest):