summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt8
-rw-r--r--indra/newview/app_settings/logcontrol.xml1
-rw-r--r--indra/newview/app_settings/settings.xml57
-rwxr-xr-xindra/newview/linux_tools/wrapper.sh2
-rw-r--r--indra/newview/llagent.cpp7
-rw-r--r--indra/newview/llagentlistener.cpp2
-rw-r--r--indra/newview/llagentwearables.cpp191
-rw-r--r--indra/newview/llagentwearables.h6
-rw-r--r--indra/newview/llappearancemgr.cpp422
-rw-r--r--indra/newview/llappearancemgr.h76
-rw-r--r--indra/newview/llappviewer.cpp4
-rw-r--r--indra/newview/llassetuploadresponders.cpp2
-rw-r--r--indra/newview/llavataractions.cpp3
-rw-r--r--indra/newview/llavatariconctrl.cpp10
-rw-r--r--indra/newview/llavatariconctrl.h3
-rw-r--r--indra/newview/llavatarlistitem.cpp15
-rw-r--r--indra/newview/llavatarlistitem.h2
-rw-r--r--indra/newview/llbottomtray.cpp529
-rw-r--r--indra/newview/llbottomtray.h65
-rw-r--r--indra/newview/llcallingcard.cpp2
-rw-r--r--indra/newview/llchannelmanager.cpp9
-rw-r--r--indra/newview/llchannelmanager.h7
-rw-r--r--indra/newview/llchatbar.cpp5
-rw-r--r--indra/newview/llchathistory.cpp58
-rw-r--r--indra/newview/llchathistory.h8
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp57
-rw-r--r--indra/newview/llchatitemscontainerctrl.h6
-rw-r--r--indra/newview/llchatmsgbox.cpp4
-rw-r--r--indra/newview/llchatmsgbox.h2
-rw-r--r--indra/newview/llchiclet.cpp61
-rw-r--r--indra/newview/llchiclet.h3
-rw-r--r--indra/newview/llexpandabletextbox.cpp4
-rw-r--r--indra/newview/llexpandabletextbox.h2
-rw-r--r--indra/newview/llfavoritesbar.cpp23
-rw-r--r--indra/newview/llfavoritesbar.h1
-rw-r--r--indra/newview/llfloaterbuy.cpp4
-rw-r--r--indra/newview/llfloaterbuycontents.cpp6
-rw-r--r--indra/newview/llfloatercamera.cpp92
-rw-r--r--indra/newview/llfloatercamera.h3
-rw-r--r--indra/newview/llfloatergesture.cpp255
-rw-r--r--indra/newview/llfloatergesture.h13
-rw-r--r--indra/newview/llfloaterproperties.cpp1
-rw-r--r--indra/newview/llfloatersearch.cpp16
-rw-r--r--indra/newview/llfloatertestinspectors.cpp3
-rw-r--r--indra/newview/llfloatertools.cpp29
-rw-r--r--indra/newview/llfloatertools.h1
-rw-r--r--indra/newview/llfloaterworldmap.cpp1
-rw-r--r--indra/newview/llfolderview.cpp6
-rw-r--r--indra/newview/llfoldervieweventlistener.h2
-rw-r--r--indra/newview/llfolderviewitem.cpp5
-rw-r--r--indra/newview/llfolderviewitem.h2
-rw-r--r--indra/newview/llfriendcard.cpp311
-rw-r--r--indra/newview/llfriendcard.h49
-rw-r--r--indra/newview/llgesturemgr.cpp31
-rw-r--r--indra/newview/llgesturemgr.h32
-rw-r--r--indra/newview/llimfloater.cpp20
-rw-r--r--indra/newview/llimpanel.cpp7
-rw-r--r--indra/newview/llimview.cpp138
-rw-r--r--indra/newview/llimview.h22
-rw-r--r--indra/newview/llinspectgroup.cpp3
-rw-r--r--indra/newview/llinspectremoteobject.cpp200
-rw-r--r--indra/newview/llinspectremoteobject.h40
-rw-r--r--indra/newview/llinventorybridge.cpp44
-rw-r--r--indra/newview/llinventorybridge.h10
-rw-r--r--indra/newview/llinventorymodel.cpp613
-rw-r--r--indra/newview/llinventorymodel.h265
-rw-r--r--indra/newview/llinventoryobserver.cpp564
-rw-r--r--indra/newview/llinventoryobserver.h249
-rw-r--r--indra/newview/llinventorypanel.cpp172
-rw-r--r--indra/newview/llinventorypanel.h2
-rw-r--r--indra/newview/lljoystickbutton.cpp25
-rw-r--r--indra/newview/lljoystickbutton.h8
-rw-r--r--indra/newview/lllandmarkactions.cpp4
-rw-r--r--indra/newview/lllandmarkactions.h2
-rw-r--r--indra/newview/lllocationinputctrl.cpp2
-rw-r--r--indra/newview/lllogininstance.cpp9
-rw-r--r--indra/newview/llnearbychat.cpp116
-rw-r--r--indra/newview/llnearbychat.h7
-rw-r--r--indra/newview/llnearbychatbar.cpp45
-rw-r--r--indra/newview/llnearbychatbar.h10
-rw-r--r--indra/newview/llnearbychathandler.cpp25
-rw-r--r--indra/newview/llnotificationgrouphandler.cpp14
-rw-r--r--indra/newview/llnotificationhandler.h3
-rw-r--r--indra/newview/llnotificationofferhandler.cpp9
-rw-r--r--indra/newview/llnotificationtiphandler.cpp1
-rw-r--r--indra/newview/llpanelappearancetab.h4
-rw-r--r--indra/newview/llpanelavatar.cpp29
-rw-r--r--indra/newview/llpanelavatar.h12
-rw-r--r--indra/newview/llpanelclassified.cpp25
-rw-r--r--indra/newview/llpanelclassified.h9
-rw-r--r--indra/newview/llpanelgrouproles.cpp6
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp24
-rw-r--r--indra/newview/llpanelmaininventory.cpp5
-rw-r--r--indra/newview/llpanelmaininventory.h3
-rw-r--r--indra/newview/llpanelmediasettingsgeneral.cpp10
-rw-r--r--indra/newview/llpanelobjectinventory.cpp4
-rw-r--r--indra/newview/llpanelpeople.cpp14
-rw-r--r--indra/newview/llpanelpicks.cpp18
-rw-r--r--indra/newview/llpanelplaceprofile.cpp10
-rw-r--r--indra/newview/llpanelplaces.cpp5
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp382
-rw-r--r--indra/newview/llpanelprimmediacontrols.h45
-rw-r--r--indra/newview/llparticipantlist.cpp2
-rw-r--r--indra/newview/llpreview.h2
-rw-r--r--indra/newview/llpreviewscript.h2
-rw-r--r--indra/newview/llscreenchannel.cpp30
-rw-r--r--indra/newview/llscreenchannel.h7
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp1
-rw-r--r--indra/newview/llsidetray.cpp28
-rw-r--r--indra/newview/llsidetray.h10
-rw-r--r--indra/newview/llspatialpartition.cpp2
-rw-r--r--indra/newview/llspeakbutton.cpp10
-rw-r--r--indra/newview/llspeakbutton.h5
-rw-r--r--indra/newview/llspeakers.cpp3
-rw-r--r--indra/newview/llstartup.cpp19
-rw-r--r--indra/newview/llstatusbar.cpp27
-rw-r--r--indra/newview/llstatusbar.h6
-rw-r--r--indra/newview/llsyswellwindow.cpp20
-rw-r--r--indra/newview/lltexturecache.cpp110
-rw-r--r--indra/newview/lltexturectrl.cpp2
-rw-r--r--indra/newview/lltexturefetch.cpp3
-rw-r--r--indra/newview/lltoast.cpp1
-rw-r--r--indra/newview/lltoastimpanel.cpp16
-rw-r--r--indra/newview/lltoastnotifypanel.cpp1
-rw-r--r--indra/newview/lltooldraganddrop.cpp4
-rw-r--r--indra/newview/lltoolpie.cpp2
-rw-r--r--indra/newview/lltracker.cpp1
-rw-r--r--indra/newview/llurldispatcher.cpp6
-rw-r--r--indra/newview/llviewerassettype.cpp1
-rw-r--r--indra/newview/llviewerchat.cpp203
-rw-r--r--indra/newview/llviewerchat.h53
-rw-r--r--indra/newview/llviewerfloaterreg.cpp4
-rw-r--r--indra/newview/llviewerfoldertype.cpp3
-rw-r--r--indra/newview/llviewermedia.cpp189
-rw-r--r--indra/newview/llviewermedia.h13
-rw-r--r--indra/newview/llviewermenu.cpp13
-rw-r--r--indra/newview/llviewermessage.cpp74
-rw-r--r--indra/newview/llviewerparcelmedia.cpp26
-rw-r--r--indra/newview/llviewerparcelmedia.h2
-rw-r--r--indra/newview/llviewertexture.cpp21
-rw-r--r--indra/newview/llviewertexture.h17
-rw-r--r--indra/newview/llviewertexturelist.cpp26
-rw-r--r--indra/newview/llviewertexturelist.h14
-rw-r--r--indra/newview/llviewerwindow.cpp5
-rw-r--r--indra/newview/llvlcomposition.cpp13
-rw-r--r--indra/newview/llvoavatar.cpp123
-rw-r--r--indra/newview/llvoavatarself.cpp15
-rw-r--r--indra/newview/llvoicechannel.cpp62
-rw-r--r--indra/newview/llvoicechannel.h1
-rw-r--r--indra/newview/llvoiceclient.cpp4
-rw-r--r--indra/newview/llvovolume.cpp101
-rw-r--r--indra/newview/llvovolume.h2
-rw-r--r--indra/newview/llwearable.cpp31
-rw-r--r--indra/newview/llworldmipmap.cpp2
-rw-r--r--indra/newview/skins/default/colors.xml2
-rw-r--r--indra/newview/skins/default/textures/textures.xml56
-rw-r--r--indra/newview/skins/default/textures/widgets/Tooltip.pngbin0 -> 2910 bytes
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml70
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_gesture.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_incoming_call.xml40
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_settings.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml81
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_slider.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_tos.xml18
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml2
-rw-r--r--indra/newview/skins/default/xui/en/inspect_remote_object.xml99
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml14
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml7
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_profile_overflow.xml15
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml4
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml33
-rw-r--r--indra/newview/skins/default/xui/en/panel_activeim_row.xml46
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml41
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml60
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml40
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notify.xml194
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml85
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml28
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml36
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml322
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_sys_well_item.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml28
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/avatar_icon.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/slider_bar.xml8
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp1
205 files changed, 5427 insertions, 3209 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 13c381edae..4adef84cd3 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -246,11 +246,13 @@ set(viewer_SOURCE_FILES
llinspectavatar.cpp
llinspectgroup.cpp
llinspectobject.cpp
+ llinspectremoteobject.cpp
llinventorybridge.cpp
llinventoryclipboard.cpp
llinventoryfilter.cpp
llinventoryfunctions.cpp
llinventorymodel.cpp
+ llinventoryobserver.cpp
llinventorypanel.cpp
llinventorysubtreepanel.cpp
lljoystickbutton.cpp
@@ -445,6 +447,7 @@ set(viewer_SOURCE_FILES
llviewerassettype.cpp
llvieweraudio.cpp
llviewercamera.cpp
+ llviewerchat.cpp
llviewercontrol.cpp
llviewercontrollistener.cpp
llviewerdisplay.cpp
@@ -741,11 +744,13 @@ set(viewer_HEADER_FILES
llinspectavatar.h
llinspectgroup.h
llinspectobject.h
+ llinspectremoteobject.h
llinventorybridge.h
llinventoryclipboard.h
llinventoryfilter.h
llinventoryfunctions.h
llinventorymodel.h
+ llinventoryobserver.h
llinventorypanel.h
llinventorysubtreepanel.h
lljoystickbutton.h
@@ -942,6 +947,7 @@ set(viewer_HEADER_FILES
llvieweraudio.h
llviewerbuild.h
llviewercamera.h
+ llviewerchat.h
llviewercontrol.h
llviewercontrollistener.h
llviewerdisplay.h
@@ -1379,7 +1385,7 @@ if (WINDOWS)
${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
--workingdir
${VIEWER_BINARY_NAME}
- "./${CMAKE_CFG_INTDIR}"
+ "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
)
endif (NOT UNATTENDED)
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index d7bb64ce8a..ec80d2d014 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -34,6 +34,7 @@
</array>
<key>classes</key>
<array>
+ <string>LLBottomTray</string>
</array>
<key>files</key>
<array>
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 15c9499bbc..94a2ca16f4 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1132,7 +1132,7 @@
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>500</integer>
+ <integer>512</integer>
</map>
<key>CacheValidateCounter</key>
<map>
@@ -3563,7 +3563,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>400</integer>
+ <integer>305</integer>
</map>
<key>HelpUseLocal</key>
<map>
@@ -4259,7 +4259,29 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>LogMessages</key>
+ <key>LoginSRVTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Duration in seconds of the login SRV request timeout</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>10.0</real>
+ </map>
+ <key>LoginSRVPump</key>
+ <map>
+ <key>Comment</key>
+ <string>Name of the message pump that handles SRV request</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>LLAres</string>
+ </map>
+ <key>LogMessages</key>
<map>
<key>Comment</key>
<string>Log network traffic</string>
@@ -4523,6 +4545,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>MediaPerformanceManagerDebug</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether to show debug data for the media performance manager in the nearby media list.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>MemoryLogFrequency</key>
<map>
<key>Comment</key>
@@ -4895,7 +4928,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>350</integer>
+ <integer>305</integer>
</map>
<key>NotificationToastLifeTime</key>
<map>
@@ -5347,7 +5380,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>0.0</real>
+ <real>1.0</real>
</map>
<key>PluginInstancesLow</key>
<map>
@@ -5363,24 +5396,24 @@
<key>PluginInstancesNormal</key>
<map>
<key>Comment</key>
- <string>Limit on the number of inworld media plugins that will run at "normal" priority</string>
+ <string>Limit on the number of inworld media plugins that will run at "normal" or higher priority</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>4</integer>
+ <integer>2</integer>
</map>
<key>PluginInstancesTotal</key>
<map>
<key>Comment</key>
- <string>Hard limit on the number of plugins that will be instantiated at once</string>
+ <string>Hard limit on the number of plugins that will be instantiated at once for inworld media</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>16</integer>
+ <integer>8</integer>
</map>
<key>PrecachingDelay</key>
<map>
@@ -5501,7 +5534,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>QAMode</key>
<map>
@@ -6282,7 +6315,7 @@
<real>1.0</real>
</map>
- <key>RenderHighlightEnable</key>
+ <key>RenderHoverGlowEnable</key>
<map>
<key>Comment</key>
<string>Show glow effect when hovering on interactive objects.</string>
@@ -6291,7 +6324,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>RenderHighlightFadeTime</key>
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index 3209654498..f84102e1fb 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -118,7 +118,7 @@ if [ -n "$LL_TCMALLOC" ]; then
fi
fi
-export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"`pwd`"/app_settings/mozilla-runtime-linux-i686:"${LD_LIBRARY_PATH}"'
+export SL_ENV='LD_LIBRARY_PATH="`pwd`"/lib:"${LD_LIBRARY_PATH}"'
export SL_CMD='$LL_WRAPPER bin/do-not-directly-run-secondlife-bin'
export SL_OPT="`cat etc/gridargs.dat` $@"
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index d2c8558f0b..1257cf9789 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -107,6 +107,7 @@
#include "llnavigationbar.h" //to show/hide navigation bar when changing mouse look state
#include "llagentui.h"
+#include "llchannelmanager.h"
using namespace LLVOAvatarDefines;
@@ -2166,6 +2167,7 @@ void LLAgent::setBusy()
{
gBusyMenu->setLabel(LLTrans::getString("AvatarSetNotBusy"));
}
+ LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(true);
}
//-----------------------------------------------------------------------------
@@ -2179,6 +2181,7 @@ void LLAgent::clearBusy()
{
gBusyMenu->setLabel(LLTrans::getString("AvatarSetBusy"));
}
+ LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(false);
}
//-----------------------------------------------------------------------------
@@ -3080,10 +3083,6 @@ void LLAgent::updateCamera()
mOrbitLeftKey > 0.f, // right
mOrbitDownKey > 0.f); // bottom
- camera_floater->mZoom->setToggleState(
- mOrbitInKey > 0.f, // top
- mOrbitOutKey > 0.f); // bottom
-
camera_floater->mTrack->setToggleState(
mPanLeftKey > 0.f, // left
mPanUpKey > 0.f, // top
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index 3da6a4e3f4..b3ed7c353e 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -48,7 +48,7 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const
params.append(event_data["y"]);
params.append(event_data["z"]);
LLCommandDispatcher::dispatch("teleport", params, LLSD(), NULL, true);
- // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "objectim", "parcel", "login", login_refresh", "balance", "chat"
+ // *TODO - lookup other LLCommandHandlers for "agent", "classified", "event", "group", "floater", "parcel", "login", login_refresh", "balance", "chat"
// should we just compose LLCommandHandler and LLDispatchListener?
}
else
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 9938c3db2b..6cb96d1336 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -35,10 +35,11 @@
#include "llagent.h"
#include "llagentwearables.h"
+#include "llcallbacklist.h"
#include "llfloatercustomize.h"
#include "llfloaterinventory.h"
#include "llinventorybridge.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llnotify.h"
#include "llviewerregion.h"
@@ -82,6 +83,28 @@ public:
protected:
void processWearablesMessage();
+ void processContents();
+ static void onIdle(void *userdata);
+};
+
+class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
+{
+public:
+ enum ELibraryOutfitFetchStep {
+ LOFS_FOLDER = 0,
+ LOFS_OUTFITS,
+ LOFS_CONTENTS
+ };
+ LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false) {}
+ ~LLLibraryOutfitsFetch() {}
+ virtual void done();
+protected:
+ void folderDone(void);
+ void outfitsDone(void);
+ void contentsDone(void);
+ enum ELibraryOutfitFetchStep mCurrFetchStep;
+ std::vector< std::pair< LLUUID, std::string > > mOutfits;
+ bool mOutfitsPopulated;
};
LLAgentWearables gAgentWearables;
@@ -887,9 +910,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
lldebugs << " " << LLWearableDictionary::getTypeLabel(type) << llendl;
}
- // What we do here is get the complete information on the items in
- // the inventory, and set up an observer that will wait for that to
- // happen.
+ // Get the complete information on the items in the inventory and set up an observer
+ // that will trigger when the complete information is fetched.
LLInventoryFetchDescendentsObserver::folder_ref_t folders;
folders.push_back(current_outfit_id);
outfit->fetchDescendents(folders);
@@ -904,6 +926,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
// will call done for us when everything is here.
gInventory.addObserver(outfit);
}
+
+ gAgentWearables.populateMyOutfitsFolder();
}
}
@@ -1262,7 +1286,7 @@ LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
LLFolderType::FT_OUTFIT,
new_folder_name);
- LLAppearanceManager::shallowCopyCategory(LLAppearanceManager::getCOF(),folder_id, NULL);
+ LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, NULL);
#if 0 // BAP - fix to go into rename state automatically after outfit is created.
LLViewerInventoryCategory *parent_category = gInventory.getCategory(parent_id);
@@ -1392,7 +1416,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
const LLUUID &item_id = getWearableItemID(type,i);
popWearable(type,i);
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- LLAppearanceManager::removeItemLinks(item_id,false);
+ LLAppearanceManager::instance().removeItemLinks(item_id,false);
//queryWearableCache(); // moved below
if (old_wearable)
@@ -1409,7 +1433,7 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
const LLUUID &item_id = getWearableItemID(type,index);
popWearable(type, index);
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- LLAppearanceManager::removeItemLinks(item_id,false);
+ LLAppearanceManager::instance().removeItemLinks(item_id,false);
//queryWearableCache(); // moved below
@@ -2003,11 +2027,158 @@ void LLAgentWearables::updateServer()
gAgent.sendAgentSetAppearance();
}
+void LLAgentWearables::populateMyOutfitsFolder(void)
+{
+ LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();
+
+ // What we do here is get the complete information on the items in
+ // the inventory, and set up an observer that will wait for that to
+ // happen.
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ const LLUUID my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ folders.push_back(my_outfits_id);
+ outfits->fetchDescendents(folders);
+ if(outfits->isEverythingComplete())
+ {
+ // everything is already here - call done.
+ outfits->done();
+ }
+ else
+ {
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(outfits);
+ }
+}
+
+void LLLibraryOutfitsFetch::done()
+{
+ switch (mCurrFetchStep){
+ case LOFS_FOLDER:
+ mCurrFetchStep = LOFS_OUTFITS;
+ folderDone();
+ break;
+ case LOFS_OUTFITS:
+ mCurrFetchStep = LOFS_CONTENTS;
+ outfitsDone();
+ break;
+ case LOFS_CONTENTS:
+ // No longer need this observer hanging around.
+ gInventory.removeObserver(this);
+ contentsDone();
+ break;
+ default:
+ gInventory.removeObserver(this);
+ delete this;
+ return;
+ }
+ if (mOutfitsPopulated)
+ {
+ delete this;
+ }
+}
+
+void LLLibraryOutfitsFetch::folderDone(void)
+{
+ // Early out if we already have items in My Outfits.
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ if (cat_array.count() > 0 || wearable_array.count() > 0)
+ {
+ mOutfitsPopulated = true;
+ gInventory.removeObserver(this);
+ return;
+ }
+
+ // Get the UUID of the library's clothing folder
+ const LLUUID library_clothing_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+
+ mCompleteFolders.clear();
+
+ // What we do here is get the complete information on the items in
+ // the inventory, and set up an observer that will wait for that to
+ // happen.
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(library_clothing_id);
+ fetchDescendents(folders);
+ if(isEverythingComplete())
+ {
+ // everything is already here - call done.
+ outfitsDone();
+ }
+}
+
+void LLLibraryOutfitsFetch::outfitsDone(void)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ gInventory.collectDescendents(mCompleteFolders.front(), cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ for(S32 i = 0; i < cat_array.count(); ++i)
+ {
+ if (cat_array.get(i)->getName() != "More Outfits" && cat_array.get(i)->getName() != "Ruth"){
+ folders.push_back(cat_array.get(i)->getUUID());
+ mOutfits.push_back( std::make_pair(cat_array.get(i)->getUUID(), cat_array.get(i)->getName() ));
+ }
+ }
+ mCompleteFolders.clear();
+ fetchDescendents(folders);
+ if(isEverythingComplete())
+ {
+ // everything is already here - call done.
+ contentsDone();
+ }
+}
+
+void LLLibraryOutfitsFetch::contentsDone(void)
+{
+ for(S32 i = 0; i < (S32)mOutfits.size(); ++i)
+ {
+ // First, make a folder in the My Outfits directory.
+ const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLUUID folder_id = gInventory.createNewCategory(parent_id,
+ LLFolderType::FT_OUTFIT,
+ mOutfits[i].second);
+
+ LLAppearanceManager::getInstance()->shallowCopyCategory(mOutfits[i].first, folder_id, NULL);
+ gInventory.notifyObservers();
+ }
+ mOutfitsPopulated = true;
+}
+
+//--------------------------------------------------------------------
+// InitialWearablesFetch
+//
+// This grabs contents from the COF and processes them.
+// The processing is handled in idle(), i.e. outside of done(),
+// to avoid gInventory.notifyObservers recursion.
+//--------------------------------------------------------------------
+
+// virtual
void LLInitialWearablesFetch::done()
{
- // No longer need this observer hanging around.
+ // Delay processing the actual results of this so it's not handled within
+ // gInventory.notifyObservers. The results will be handled in the next
+ // idle tick instead.
gInventory.removeObserver(this);
+ gIdleCallbacks.addFunction(onIdle, this);
+}
+
+// static
+void LLInitialWearablesFetch::onIdle(void *data)
+{
+ gIdleCallbacks.deleteFunction(onIdle, data);
+ LLInitialWearablesFetch *self = reinterpret_cast<LLInitialWearablesFetch*>(data);
+ self->processContents();
+}
+void LLInitialWearablesFetch::processContents()
+{
// Fetch the wearable items from the Current Outfit Folder
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t wearable_array;
@@ -2015,7 +2186,7 @@ void LLInitialWearablesFetch::done()
gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array,
LLInventoryModel::EXCLUDE_TRASH, is_wearable);
- LLAppearanceManager::setAttachmentInvLinkEnable(true);
+ LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
if (wearable_array.count() > 0)
{
LLAppearanceManager::instance().updateAppearanceFromCOF();
@@ -2023,6 +2194,8 @@ void LLInitialWearablesFetch::done()
else
{
processWearablesMessage();
+ // Create links for attachments that may have arrived before the COF existed.
+ LLAppearanceManager::instance().linkRegisteredAttachments();
}
delete this;
}
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index 9017c25fc6..8f3a16501e 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -169,9 +169,11 @@ public:
const LLDynamicArray<S32>& attachments_to_include,
BOOL rename_clothing);
- // Note: wearables_to_include should be a list of EWearableType types
- // attachments_to_include should be a list of attachment points
LLUUID makeNewOutfitLinks(const std::string& new_folder_name);
+
+ // Should only be called if we *know* we've never done so before, since users may
+ // not want the Library outfits to stay in their quick outfit selector and can delete them.
+ void populateMyOutfitsFolder(void);
private:
void makeNewOutfitDone(S32 type, U32 index);
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index d14de1c301..80ac9e4085 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -32,18 +32,20 @@
#include "llviewerprecompiledheaders.h"
+#include "llagent.h"
+#include "llagentwearables.h"
#include "llappearancemgr.h"
-#include "llinventorymodel.h"
-#include "llnotifications.h"
+#include "llfloatercustomize.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
-#include "llwearablelist.h"
-#include "llagentwearables.h"
-#include "llagent.h"
+#include "llinventoryobserver.h"
+#include "llnotifications.h"
+#include "llpanelappearance.h"
+#include "llsidetray.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
#include "llviewerregion.h"
-#include "llfloatercustomize.h"
+#include "llwearablelist.h"
class LLWearInventoryCategoryCallback : public LLInventoryCallback
{
@@ -72,7 +74,7 @@ protected:
// If the inventory callback manager goes away, we're shutting down, no longer want the callback.
if( LLInventoryCallbackManager::is_instantiated() )
{
- LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+ LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
}
else
{
@@ -171,7 +173,7 @@ void LLOutfitObserver::done()
else
{
// Wear the inventory category.
- LLAppearanceManager::wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+ LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
}
}
@@ -251,7 +253,7 @@ public:
virtual ~LLUpdateAppearanceOnDestroy()
{
- LLAppearanceManager::updateAppearanceFromCOF();
+ LLAppearanceManager::instance().updateAppearanceFromCOF();
}
/* virtual */ void fire(const LLUUID& inv_item)
@@ -296,7 +298,7 @@ struct LLWearableHoldingPattern
bool append;
};
-/* static */ void removeDuplicateItems(LLInventoryModel::item_array_t& items)
+static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
{
LLInventoryModel::item_array_t new_items;
std::set<LLUUID> items_seen;
@@ -323,175 +325,44 @@ struct LLWearableHoldingPattern
items = new_items;
}
-void removeDuplicateItems(LLInventoryModel::item_array_t& dst, const LLInventoryModel::item_array_t& src)
+static void onWearableAssetFetch(LLWearable* wearable, void* data)
{
- LLInventoryModel::item_array_t new_dst;
- std::set<LLUUID> mark_inventory;
-
- S32 inventory_dups = 0;
+ LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
+ bool append = holder->append;
- for (LLInventoryModel::item_array_t::const_iterator src_pos = src.begin();
- src_pos != src.end();
- ++src_pos)
- {
- LLUUID src_item_id = (*src_pos)->getLinkedUUID();
- mark_inventory.insert(src_item_id);
- }
-
- for (LLInventoryModel::item_array_t::const_iterator dst_pos = dst.begin();
- dst_pos != dst.end();
- ++dst_pos)
+ if(wearable)
{
- LLUUID dst_item_id = (*dst_pos)->getLinkedUUID();
-
- if (mark_inventory.find(dst_item_id) == mark_inventory.end())
- {
- // Item is not already present in COF.
- new_dst.put(*dst_pos);
- mark_inventory.insert(dst_item_id);
- }
- else
+ for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
+ iter != holder->mFoundList.end(); ++iter)
{
- inventory_dups++;
+ LLFoundData* data = *iter;
+ if(wearable->getAssetID() == data->mAssetID)
+ {
+ data->mWearable = wearable;
+ break;
+ }
}
}
- llinfos << "removeDups, original " << dst.count() << " final " << new_dst.count()
- << " inventory dups " << inventory_dups << llendl;
-
- dst = new_dst;
+ holder->mResolved += 1;
+ if(holder->mResolved >= (S32)holder->mFoundList.size())
+ {
+ LLAppearanceManager::instance().updateAgentWearables(holder, append);
+ }
}
-/* static */
LLUUID LLAppearanceManager::getCOF()
{
return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
}
// Update appearance from outfit folder.
-/* static */
void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
{
if (!proceed)
return;
-
-#if 1
- updateCOF(category,append);
-#else
- if (append)
- {
- updateCOFFromCategory(category, append); // append is true - add non-duplicates to COF.
- }
- else
- {
- LLViewerInventoryCategory* catp = gInventory.getCategory(category);
- if (catp->getPreferredType() == LLFolderType::FT_NONE ||
- LLFolderType::lookupIsEnsembleType(catp->getPreferredType()))
- {
- updateCOFFromCategory(category, append); // append is false - rebuild COF.
- }
- else if (catp->getPreferredType() == LLFolderType::FT_OUTFIT)
- {
- rebuildCOFFromOutfit(category);
- }
- }
-#endif
+ LLAppearanceManager::instance().updateCOF(category,append);
}
-// Append to current COF contents by recursively traversing a folder.
-/* static */
-void LLAppearanceManager::updateCOFFromCategory(const LLUUID& category, bool append)
-{
- // BAP consolidate into one "get all 3 types of descendents" function, use both places.
- LLInventoryModel::item_array_t wear_items;
- LLInventoryModel::item_array_t obj_items;
- LLInventoryModel::item_array_t gest_items;
- bool follow_folder_links = false;
- getUserDescendents(category, wear_items, obj_items, gest_items, follow_folder_links);
-
- // Find all the wearables that are in the category's subtree.
- lldebugs << "appendCOFFromCategory()" << llendl;
- if( !wear_items.count() && !obj_items.count() && !gest_items.count())
- {
- LLNotifications::instance().add("CouldNotPutOnOutfit");
- return;
- }
-
- const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
- // Processes that take time should show the busy cursor
- //inc_busy_count();
-
- LLInventoryModel::cat_array_t cof_cats;
- LLInventoryModel::item_array_t cof_items;
- gInventory.collectDescendents(current_outfit_id, cof_cats, cof_items,
- LLInventoryModel::EXCLUDE_TRASH);
- // Remove duplicates
- if (append)
- {
- removeDuplicateItems(wear_items, cof_items);
- removeDuplicateItems(obj_items, cof_items);
- removeDuplicateItems(gest_items, cof_items);
- }
-
- S32 total_links = gest_items.count() + wear_items.count() + obj_items.count();
-
- if (!append && total_links > 0)
- {
- purgeCOFBeforeRebuild(category);
- }
-
- LLPointer<LLUpdateAppearanceOnDestroy> link_waiter = new LLUpdateAppearanceOnDestroy;
-
- // Link all gestures in this folder
- if (gest_items.count() > 0)
- {
- llinfos << "Linking " << gest_items.count() << " gestures" << llendl;
- for (S32 i = 0; i < gest_items.count(); ++i)
- {
- const LLInventoryItem* gest_item = gest_items.get(i).get();
- link_inventory_item(gAgent.getID(), gest_item->getLinkedUUID(), current_outfit_id,
- gest_item->getName(),
- LLAssetType::AT_LINK, link_waiter);
- }
- }
-
- // Link all wearables
- if(wear_items.count() > 0)
- {
- llinfos << "Linking " << wear_items.count() << " wearables" << llendl;
- for(S32 i = 0; i < wear_items.count(); ++i)
- {
- // Populate the current outfit folder with links to the newly added wearables
- const LLInventoryItem* wear_item = wear_items.get(i).get();
- link_inventory_item(gAgent.getID(),
- wear_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID.
- current_outfit_id,
- wear_item->getName(),
- LLAssetType::AT_LINK,
- link_waiter);
- }
- }
-
- // Link all attachments.
- if( obj_items.count() > 0 )
- {
- llinfos << "Linking " << obj_items.count() << " attachments" << llendl;
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( avatar )
- {
- for(S32 i = 0; i < obj_items.count(); ++i)
- {
- const LLInventoryItem* obj_item = obj_items.get(i).get();
- link_inventory_item(gAgent.getID(),
- obj_item->getLinkedUUID(), // If this item is a link, then we'll use the linked item's UUID.
- current_outfit_id,
- obj_item->getName(),
- LLAssetType::AT_LINK, link_waiter);
- }
- }
- }
-}
-
-/* static */
void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb)
{
@@ -535,7 +406,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
}
}
}
-/* static */ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
+
+void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -552,7 +424,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
// Keep the last N wearables of each type. For viewer 2.0, N is 1 for
// both body parts and clothing items.
-/* static */ void LLAppearanceManager::filterWearableItems(
+void LLAppearanceManager::filterWearableItems(
LLInventoryModel::item_array_t& items, S32 max_per_type)
{
// Divvy items into arrays by wearable type.
@@ -583,8 +455,8 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
}
// Create links to all listed items.
-/* static */ void LLAppearanceManager::linkAll(const LLUUID& category,
- LLInventoryModel::item_array_t& items,
+void LLAppearanceManager::linkAll(const LLUUID& category,
+ LLInventoryModel::item_array_t& items,
LLPointer<LLInventoryCallback> cb)
{
for (S32 i=0; i<items.count(); i++)
@@ -599,7 +471,7 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
}
}
-/* static */ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
+void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
{
const LLUUID cof = getCOF();
@@ -656,145 +528,17 @@ void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID
{
link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
LLAssetType::AT_LINK_FOLDER, link_waiter);
- }
-
-}
-/* static */
-bool LLAppearanceManager::isMandatoryWearableType(EWearableType type)
-{
- return (type==WT_SHAPE) || (type==WT_SKIN) || (type== WT_HAIR) || (type==WT_EYES);
-}
-
-// For mandatory body parts.
-/* static */
-void LLAppearanceManager::checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found)
-{
- LLInventoryModel::cat_array_t new_cats;
- LLInventoryModel::item_array_t new_items;
- gInventory.collectDescendents(category, new_cats, new_items,
- LLInventoryModel::EXCLUDE_TRASH);
- std::set<EWearableType> wt_types_found;
- for (S32 i = 0; i < new_items.count(); ++i)
- {
- LLViewerInventoryItem *itemp = new_items.get(i);
- if (itemp->isWearableType())
- {
- EWearableType type = itemp->getWearableType();
- if (isMandatoryWearableType(type))
- {
- types_found.insert(type);
- }
- }
- }
-}
-
-// Remove everything from the COF that we safely can before replacing
-// with contents of new category. This means preserving any mandatory
-// body parts that aren't present in the new category, and getting rid
-// of everything else.
-/* static */
-void LLAppearanceManager::purgeCOFBeforeRebuild(const LLUUID& category)
-{
- // See which mandatory body types are present in the new category.
- std::set<EWearableType> wt_types_found;
- checkMandatoryWearableTypes(category,wt_types_found);
-
- LLInventoryModel::cat_array_t cof_cats;
- LLInventoryModel::item_array_t cof_items;
- gInventory.collectDescendents(getCOF(), cof_cats, cof_items,
- LLInventoryModel::EXCLUDE_TRASH);
- for (S32 i = 0; i < cof_items.count(); ++i)
- {
- LLViewerInventoryItem *itemp = cof_items.get(i);
- if (itemp->isWearableType())
- {
- EWearableType type = itemp->getWearableType();
- if (!isMandatoryWearableType(type) || (wt_types_found.find(type) != wt_types_found.end()))
- {
- // Not mandatory or supplied by the new category - OK to delete
- gInventory.purgeObject(cof_items.get(i)->getUUID());
- }
- }
- else
- {
- // Not a wearable - always purge
- gInventory.purgeObject(cof_items.get(i)->getUUID());
- }
- }
- gInventory.notifyObservers();
-}
-
-// Replace COF contents from a given outfit folder.
-/* static */
-void LLAppearanceManager::rebuildCOFFromOutfit(const LLUUID& category)
-{
- lldebugs << "rebuildCOFFromOutfit()" << llendl;
-
- dumpCat(category,"start, source outfit");
- dumpCat(getCOF(),"start, COF");
-
- // Find all the wearables that are in the category's subtree.
- LLInventoryModel::item_array_t items;
- getCOFValidDescendents(category, items);
-
- if( items.count() == 0)
- {
- LLNotifications::instance().add("CouldNotPutOnOutfit");
- return;
- }
-
- // Processes that take time should show the busy cursor
- //inc_busy_count();
-
- //dumpCat(current_outfit_id,"COF before remove:");
-
- //dumpCat(current_outfit_id,"COF after remove:");
-
- purgeCOFBeforeRebuild(category);
-
- LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
- LLUUID current_outfit_id = getCOF();
- LLAppearanceManager::shallowCopyCategory(category, current_outfit_id, link_waiter);
-
- //dumpCat(current_outfit_id,"COF after shallow copy:");
-
- // Create a link to the outfit that we wore.
- LLViewerInventoryCategory* catp = gInventory.getCategory(category);
- if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
- {
- link_inventory_item(gAgent.getID(), category, current_outfit_id, catp->getName(),
- LLAssetType::AT_LINK_FOLDER, link_waiter);
- }
-}
-
-/* static */
-void LLAppearanceManager::onWearableAssetFetch(LLWearable* wearable, void* data)
-{
- LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
- bool append = holder->append;
-
- if(wearable)
- {
- for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
- iter != holder->mFoundList.end(); ++iter)
+ // Update the current outfit name of the appearance sidepanel.
+ LLPanelAppearance* panel_appearance = dynamic_cast<LLPanelAppearance *>(LLSideTray::getInstance()->getPanel("panel_appearance"));
+ if (panel_appearance)
{
- LLFoundData* data = *iter;
- if(wearable->getAssetID() == data->mAssetID)
- {
- data->mWearable = wearable;
- break;
- }
+ panel_appearance->refreshCurrentLookName(catp->getName());
}
}
- holder->mResolved += 1;
- if(holder->mResolved >= (S32)holder->mFoundList.size())
- {
- LLAppearanceManager::updateAgentWearables(holder, append);
- }
+
}
-/* static */
void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
{
lldebugs << "updateAgentWearables()" << llendl;
@@ -835,7 +579,6 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
// dec_busy_count();
}
-/* static */
void LLAppearanceManager::updateAppearanceFromCOF()
{
dumpCat(getCOF(),"COF, start");
@@ -903,7 +646,7 @@ void LLAppearanceManager::updateAppearanceFromCOF()
LLWearableList::instance().getAsset(found->mAssetID,
found->mName,
found->mAssetType,
- LLAppearanceManager::onWearableAssetFetch,
+ onWearableAssetFetch,
(void*)holder);
}
}
@@ -916,22 +659,6 @@ void LLAppearanceManager::updateAppearanceFromCOF()
}
}
-/* static */
-void LLAppearanceManager::getCOFValidDescendents(const LLUUID& category,
- LLInventoryModel::item_array_t& items)
-{
- LLInventoryModel::cat_array_t cats;
- LLFindCOFValidItems is_cof_valid;
- bool follow_folder_links = false;
- gInventory.collectDescendentsIf(category,
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- is_cof_valid,
- follow_folder_links);
-}
-
-/* static */
void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
LLInventoryModel::item_array_t& items,
LLAssetType::EType type,
@@ -947,7 +674,6 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
follow_folder_links);
}
-/* static */
void LLAppearanceManager::getUserDescendents(const LLUUID& category,
LLInventoryModel::item_array_t& wear_items,
LLInventoryModel::item_array_t& obj_items,
@@ -1011,7 +737,6 @@ void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, b
}
// *NOTE: hack to get from avatar inventory to avatar
-/* static */
void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )
{
// Avoid unintentionally overwriting old wearables. We have to do
@@ -1023,7 +748,9 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
if( gFloaterCustomize )
{
- gFloaterCustomize->askToSaveIfDirty(boost::bind(LLAppearanceManager::changeOutfit, _1, category->getUUID(), append));
+ gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit,
+ &LLAppearanceManager::instance(),
+ _1, category->getUUID(), append));
}
else
{
@@ -1031,7 +758,6 @@ void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* ca
}
}
-/* static */
void LLAppearanceManager::wearOutfitByName(const std::string& name)
{
llinfos << "Wearing category " << name << llendl;
@@ -1084,8 +810,8 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
return (a->isWearableType() && b->isWearableType() &&
(a->getWearableType() == b->getWearableType()));
}
-/* static */
-void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
+
+void LLAppearanceManager::addItemLink( LLInventoryItem* item, bool do_update )
{
LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
if (!vitem)
@@ -1123,6 +849,7 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
{
if (do_update)
LLAppearanceManager::updateAppearanceFromCOF();
+ return;
}
else
{
@@ -1134,10 +861,10 @@ void LLAppearanceManager::wearItem( LLInventoryItem* item, bool do_update )
LLAssetType::AT_LINK,
cb);
}
+ return;
}
-/* static */
-void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update )
+void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update )
{
#if SUPPORT_ENSEMBLES
// BAP add check for already in COF.
@@ -1151,7 +878,6 @@ void LLAppearanceManager::wearEnsemble( LLInventoryCategory* cat, bool do_update
#endif
}
-/* static */
void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
{
LLInventoryModel::cat_array_t cat_array;
@@ -1176,7 +902,6 @@ void LLAppearanceManager::removeItemLinks(const LLUUID& item_id, bool do_update)
//#define DUMP_CAT_VERBOSE
-/* static */
void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
{
LLInventoryModel::cat_array_t cats;
@@ -1198,7 +923,6 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
llinfos << msg << " count " << items.count() << llendl;
}
-/* static */
void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,
const std::string& msg)
{
@@ -1211,15 +935,19 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it
llinfos << llendl;
}
+LLAppearanceManager::LLAppearanceManager():
+ mAttachmentInvLinkEnabled(false)
+{
+}
-std::set<LLUUID> LLAppearanceManager::sRegisteredAttachments;
-bool LLAppearanceManager::sAttachmentInvLinkEnabled(false);
+LLAppearanceManager::~LLAppearanceManager()
+{
+}
-/* static */
void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)
{
llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl;
- sAttachmentInvLinkEnabled = val;
+ mAttachmentInvLinkEnabled = val;
}
void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
@@ -1239,19 +967,18 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
llinfos << llendl;
}
-/* static */
void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
{
- sRegisteredAttachments.insert(item_id);
- //dumpAttachmentSet(sRegisteredAttachments,"after register:");
+ mRegisteredAttachments.insert(item_id);
+ //dumpAttachmentSet(mRegisteredAttachments,"after register:");
- if (sAttachmentInvLinkEnabled)
+ if (mAttachmentInvLinkEnabled)
{
LLViewerInventoryItem *item = gInventory.getItem(item_id);
if (item)
{
//LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Adding attachment link:");
- LLAppearanceManager::wearItem(item,false); // Add COF link for item.
+ LLAppearanceManager::addItemLink(item,false); // Add COF link for item.
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
gInventory.notifyObservers();
}
@@ -1262,13 +989,12 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
}
}
-/* static */
void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
{
- sRegisteredAttachments.erase(item_id);
- //dumpAttachmentSet(sRegisteredAttachments,"after unregister:");
+ mRegisteredAttachments.erase(item_id);
+ //dumpAttachmentSet(mRegisteredAttachments,"after unregister:");
- if (sAttachmentInvLinkEnabled)
+ if (mAttachmentInvLinkEnabled)
{
//LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
LLAppearanceManager::removeItemLinks(item_id, false);
@@ -1281,3 +1007,21 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
//llinfos << "no link changes, inv link not enabled" << llendl;
}
}
+
+void LLAppearanceManager::linkRegisteredAttachments()
+{
+ for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin();
+ it != mRegisteredAttachments.end();
+ ++it)
+ {
+ LLUUID item_id = *it;
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ if (item)
+ {
+ addItemLink(item, false);
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+ gInventory.notifyObservers();
+ }
+ }
+ mRegisteredAttachments.clear();
+}
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 56f54dfc23..88d3320d1f 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -42,65 +42,71 @@ struct LLWearableHoldingPattern;
class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
{
+ friend class LLSingleton<LLAppearanceManager>;
+
public:
- static void updateAppearanceFromCOF();
- static bool needToSaveCOF();
- static void changeOutfit(bool proceed, const LLUUID& category, bool append);
- static void updateCOF(const LLUUID& category, bool append = false);
- static void updateCOFFromCategory(const LLUUID& category, bool append);
- static void rebuildCOFFromOutfit(const LLUUID& category);
- static void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
- static void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
- static void wearOutfitByName(const std::string& name);
- static void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
- LLPointer<LLInventoryCallback> cb);
+ void updateAppearanceFromCOF();
+ bool needToSaveCOF();
+ void updateCOF(const LLUUID& category, bool append = false);
+ void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
+ void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
+ void wearOutfitByName(const std::string& name);
+ void changeOutfit(bool proceed, const LLUUID& category, bool append);
// Add COF link to individual item.
- static void wearItem(LLInventoryItem* item, bool do_update = true);
+ void addItemLink(LLInventoryItem* item, bool do_update = true);
// Add COF link to ensemble folder.
- static void wearEnsemble(LLInventoryCategory* item, bool do_update = true);
- static LLUUID getCOF();
+ void addEnsembleLink(LLInventoryCategory* item, bool do_update = true);
+
+ // Copy all items in a category.
+ void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb);
+
+ // Find the Current Outfit folder.
+ LLUUID getCOF();
// Remove COF entries
- static void removeItemLinks(const LLUUID& item_id, bool do_update = true);
+ void removeItemLinks(const LLUUID& item_id, bool do_update = true);
+
+ void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
// For debugging - could be moved elsewhere.
- static void dumpCat(const LLUUID& cat_id, const std::string& msg);
- static void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
- static void unregisterAttachment(const LLUUID& item_id);
- static void registerAttachment(const LLUUID& item_id);
- static void setAttachmentInvLinkEnable(bool val);
+ void dumpCat(const LLUUID& cat_id, const std::string& msg);
+ void dumpItemArray(const LLInventoryModel::item_array_t& items, const std::string& msg);
+
+ // Attachment link management
+ void unregisterAttachment(const LLUUID& item_id);
+ void registerAttachment(const LLUUID& item_id);
+ void setAttachmentInvLinkEnable(bool val);
+ void linkRegisteredAttachments();
+
+protected:
+ LLAppearanceManager();
+ ~LLAppearanceManager();
private:
- static void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
- static void linkAll(const LLUUID& category,
+
+ void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
+ void linkAll(const LLUUID& category,
LLInventoryModel::item_array_t& items,
LLPointer<LLInventoryCallback> cb);
- static void getDescendentsOfAssetType(const LLUUID& category,
+ void getDescendentsOfAssetType(const LLUUID& category,
LLInventoryModel::item_array_t& items,
LLAssetType::EType type,
bool follow_folder_links);
- static void getCOFValidDescendents(const LLUUID& category,
- LLInventoryModel::item_array_t& items);
-
- static void getUserDescendents(const LLUUID& category,
+ void getUserDescendents(const LLUUID& category,
LLInventoryModel::item_array_t& wear_items,
LLInventoryModel::item_array_t& obj_items,
LLInventoryModel::item_array_t& gest_items,
bool follow_folder_links);
- static void onWearableAssetFetch(LLWearable* wearable, void* data);
- static void updateAgentWearables(LLWearableHoldingPattern* holder, bool append);
- static bool isMandatoryWearableType(EWearableType type);
- static void checkMandatoryWearableTypes(const LLUUID& category, std::set<EWearableType>& types_found);
- static void purgeCOFBeforeRebuild(const LLUUID& category);
- static void purgeCategory(const LLUUID& category, bool keep_outfit_links);
- static std::set<LLUUID> sRegisteredAttachments;
- static bool sAttachmentInvLinkEnabled;
+ void purgeCategory(const LLUUID& category, bool keep_outfit_links);
+ std::set<LLUUID> mRegisteredAttachments;
+ bool mAttachmentInvLinkEnabled;
};
#define SUPPORT_ENSEMBLES 0
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 845a264327..f82d178089 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -89,6 +89,8 @@
#include "llvfsthread.h"
#include "llvolumemgr.h"
+#include "llnotificationmanager.h"
+
// Third party library includes
#include <boost/bind.hpp>
@@ -2340,6 +2342,8 @@ bool LLAppViewer::initWindow()
gSavedSettings.getS32("WindowX"), gSavedSettings.getS32("WindowY"),
gSavedSettings.getS32("WindowWidth"), gSavedSettings.getS32("WindowHeight"),
FALSE, ignorePixelDepth);
+
+ LLNotificationsUI::LLNotificationManager::getInstance();
if (gSavedSettings.getBOOL("WindowFullScreen"))
{
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index 4d85ecb97c..38843c7221 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -40,7 +40,7 @@
#include "llfloaterbuycurrency.h"
#include "llfilepicker.h"
#include "llnotify.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
#include "llpermissionsflags.h"
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 4456e0aa74..ee4a9df15f 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -54,6 +54,7 @@
#include "llmutelist.h"
#include "llrecentpeople.h"
#include "llsidetray.h"
+#include "lltrans.h"
#include "llviewerobjectlist.h"
#include "llviewermessage.h" // for handle_lure
#include "llviewerregion.h"
@@ -191,7 +192,7 @@ void LLAvatarActions::startIM(const LLUUID& id)
// static
void LLAvatarActions::startCall(const LLUUID& id)
{
- if (id.isNull() || isCalling(id))
+ if (id.isNull())
{
return;
}
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 46902006a6..327d80ba34 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -143,7 +143,8 @@ void LLAvatarIconIDCache::remove (const LLUUID& avatar_id)
LLAvatarIconCtrl::Params::Params()
: avatar_id("avatar_id"),
- draw_tooltip("draw_tooltip", true)
+ draw_tooltip("draw_tooltip", true),
+ default_icon_name("default_icon_name")
{
name = "avatar_icon";
}
@@ -151,7 +152,8 @@ LLAvatarIconCtrl::Params::Params()
LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
: LLIconCtrl(p),
- mDrawTooltip(p.draw_tooltip)
+ mDrawTooltip(p.draw_tooltip),
+ mDefaultIconName(p.default_icon_name)
{
mPriority = LLViewerFetchedTexture::BOOST_ICON;
@@ -193,7 +195,7 @@ LLAvatarIconCtrl::LLAvatarIconCtrl(const LLAvatarIconCtrl::Params& p)
}
else
{
- LLIconCtrl::setValue("default_profile_picture.j2c");
+ LLIconCtrl::setValue(mDefaultIconName);
}
}
@@ -260,7 +262,7 @@ bool LLAvatarIconCtrl::updateFromCache()
}
else
{
- LLIconCtrl::setValue("default_profile_picture.j2c");
+ LLIconCtrl::setValue(mDefaultIconName);
}
return true;
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 5eb830df4b..38616b7852 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -74,6 +74,7 @@ public:
{
Optional <LLUUID> avatar_id;
Optional <bool> draw_tooltip;
+ Optional <std::string> default_icon_name;
Params();
};
@@ -106,7 +107,7 @@ protected:
std::string mFirstName;
std::string mLastName;
bool mDrawTooltip;
-
+ std::string mDefaultIconName;
bool updateFromCache();
};
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 7df278d887..c670a65bcc 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -311,3 +311,18 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
mAvatarName->setValue(name);
mAvatarName->setToolTip(name);
}
+
+void LLAvatarListItem::reshapeAvatarName()
+{
+ S32 width_delta = 0;
+ width_delta += mShowProfileBtn ? mProfileBtnWidth : 0;
+ width_delta += mSpeakingIndicator->getVisible() ? mSpeakingIndicatorWidth : 0;
+ width_delta += mAvatarIcon->getVisible() ? mIconWidth : 0;
+ width_delta += mShowInfoBtn ? mInfoBtnWidth : 0;
+ width_delta += mLastInteractionTime->getVisible() ? mLastInteractionTime->getRect().getWidth() : 0;
+
+ S32 height = mAvatarName->getRect().getHeight();
+ S32 width = getRect().getWidth() - width_delta;
+
+ mAvatarName->reshape(width, height);
+}
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index d379797a46..9d48101a44 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -82,6 +82,8 @@ public:
void setContextMenu(ContextMenu* menu) { mContextMenu = menu; }
+ void reshapeAvatarName();
+
private:
typedef enum e_online_status {
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 832694873f..958dbf226a 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -40,6 +40,7 @@
#include "llimfloater.h" // for LLIMFloater
#include "lllayoutstack.h"
#include "llnearbychatbar.h"
+#include "llspeakbutton.h"
#include "llsplitbutton.h"
#include "llsyswellwindow.h"
#include "llfloatercamera.h"
@@ -50,6 +51,9 @@ LLBottomTray::LLBottomTray(const LLSD&)
mSpeakBtn(NULL),
mNearbyChatBar(NULL),
mToolbarStack(NULL)
+, mMovementButton(NULL)
+, mResizeState(RS_NORESIZE)
+// Add more members
{
mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
@@ -72,6 +76,8 @@ LLBottomTray::LLBottomTray(const LLSD&)
//destroyed LLBottomTray requires some subsystems that are long gone
//LLUI::getRootView()->addChild(this);
+ initStateProcessedObjectMap();
+
// Necessary for focus movement among child controls
setFocusRoot(TRUE);
}
@@ -181,6 +187,28 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
}
}
+// virtual
+void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
+{
+ // Time it takes to connect to voice channel might be pretty long,
+ // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
+ BOOL enable = FALSE;
+
+ switch (status)
+ {
+ // Do not add STATUS_VOICE_ENABLED because voice chat is
+ // inactive until STATUS_JOINED
+ case STATUS_JOINED:
+ enable = TRUE;
+ break;
+ default:
+ enable = FALSE;
+ break;
+ }
+
+ mSpeakBtn->setEnabled(enable);
+}
+
//virtual
void LLBottomTray::onFocusLost()
{
@@ -234,30 +262,31 @@ void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
void LLBottomTray::showGestureButton(BOOL visible)
{
- mGesturePanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_GESTURES, visible);
}
void LLBottomTray::showMoveButton(BOOL visible)
{
- mMovementPanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_MOVEMENT, visible);
}
void LLBottomTray::showCameraButton(BOOL visible)
{
- mCamPanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_CAMERA, visible);
}
void LLBottomTray::showSnapshotButton(BOOL visible)
{
- mSnapshotPanel->setVisible(visible);
+ setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
}
namespace
{
- const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
- const std::string& PANEL_CHATBAR_NAME = "chat_bar";
- const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
- const std::string& PANEL_CAMERA_NAME = "cam_panel";
+ const std::string& PANEL_CHICLET_NAME = "chiclet_list_panel";
+ const std::string& PANEL_CHATBAR_NAME = "chat_bar";
+ const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
+ const std::string& PANEL_CAMERA_NAME = "cam_panel";
+ const std::string& PANEL_GESTURE_NAME = "gesture_panel";
}
BOOL LLBottomTray::postBuild()
@@ -275,167 +304,449 @@ BOOL LLBottomTray::postBuild()
mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
- if (mChicletPanel && mToolbarStack && mNearbyChatBar)
- {
- verifyChildControlsSizes();
- }
+ mSpeakBtn = getChild<LLSpeakButton>("talk");
+
+ // Speak button should be initially disabled because
+ // it takes some time between logging in to world and connecting to voice channel.
+ mSpeakBtn->setEnabled(FALSE);
+
+ // Localization tool doesn't understand custom buttons like <talk_button>
+ mSpeakBtn->setSpeakToolTip( getString("SpeakBtnToolTip") );
+ mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
+
+ // Registering Chat Bar to receive Voice client status change notifications.
+ gVoiceClient->addObserver(this);
return TRUE;
}
-void LLBottomTray::verifyChildControlsSizes()
+void LLBottomTray::log(LLView* panel, const std::string& descr)
{
- LLRect rect = mChicletPanel->getRect();
- if (rect.getWidth() < mChicletPanel->getMinWidth())
- {
- mChicletPanel->reshape(mChicletPanel->getMinWidth(), rect.getHeight());
- }
+ if (NULL == panel) return;
+ LLView* layout = panel->getParent();
+ lldebugs << descr << ": "
+ << "panel: " << panel->getName()
+ << ", rect: " << panel->getRect()
+
+
+ << "layout: " << layout->getName()
+ << ", rect: " << layout->getRect()
+ << llendl
+ ;
+}
+
+void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ static S32 debug_calling_number = 0;
+ lldebugs << "**************************************** " << ++debug_calling_number << llendl;
- rect = mNearbyChatBar->getRect();
- if (rect.getWidth() < mNearbyChatBar->getMinWidth())
+ S32 current_width = getRect().getWidth();
+ S32 delta_width = width - current_width;
+ lldebugs << "Reshaping: "
+ << ", width: " << width
+ << ", cur width: " << current_width
+ << ", delta_width: " << delta_width
+ << ", called_from_parent: " << called_from_parent
+ << llendl;
+
+ if (mNearbyChatBar) log(mNearbyChatBar, "before");
+ if (mChicletPanel) log(mChicletPanel, "before");
+
+ // stores width size on which bottom tray is less than width required by its children. EXT-991
+ static S32 extra_shrink_width = 0;
+ bool should_be_reshaped = true;
+
+ if (mChicletPanel && mToolbarStack && mNearbyChatBar)
{
- mNearbyChatBar->reshape(mNearbyChatBar->getMinWidth(), rect.getHeight());
+ mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+
+ // bottom tray is narrowed
+ if (delta_width < 0)
+ {
+ if (extra_shrink_width > 0)
+ {
+ // is world rect was extra shrunk and decreasing again only update this value
+ // to delta_width negative
+ extra_shrink_width -= delta_width; // use "-=" because delta_width is negative
+ should_be_reshaped = false;
+ }
+ else
+ {
+ extra_shrink_width = processWidthDecreased(delta_width);
+
+ // increase new width to extra_shrink_width value to not reshape less than bottom tray minimum
+ width += extra_shrink_width;
+ }
+ }
+ // bottom tray is widen
+ else
+ {
+ if (extra_shrink_width > delta_width)
+ {
+ // Less than minimum width is more than increasing (delta_width)
+ // only reduce it value and make no reshape
+ extra_shrink_width -= delta_width;
+ should_be_reshaped = false;
+ }
+ else
+ {
+ if (extra_shrink_width > 0)
+ {
+ // If we have some extra shrink width let's reduce delta_width & width
+ delta_width -= extra_shrink_width;
+ width -= extra_shrink_width;
+ extra_shrink_width = 0;
+ }
+ processWidthIncreased(delta_width);
+ }
+ }
}
- else if (rect.getWidth() > mNearbyChatBar->getMaxWidth())
+
+ lldebugs << "There is no enough width to reshape all children: " << extra_shrink_width << llendl;
+ if (should_be_reshaped)
{
- rect.setLeftTopAndSize(rect.mLeft, rect.mTop, mNearbyChatBar->getMaxWidth(), rect.getHeight());
- mNearbyChatBar->reshape(mNearbyChatBar->getMaxWidth(), rect.getHeight());
- mNearbyChatBar->setRect(rect);
+ lldebugs << "Reshape all children with width: " << width << llendl;
+ LLPanel::reshape(width, height, called_from_parent);
}
+
+ if (mNearbyChatBar) log(mNearbyChatBar, "after");
+ if (mChicletPanel) log(mChicletPanel, "after");
}
-void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
+S32 LLBottomTray::processWidthDecreased(S32 delta_width)
{
+ bool still_should_be_processed = true;
- if (mChicletPanel && mToolbarStack && mNearbyChatBar)
+ const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+ const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+
+ if (chiclet_panel_width > chiclet_panel_min_width)
{
-#ifdef __FEATURE_EXT_991__
- BOOL shrink = width < getRect().getWidth();
- const S32 MIN_RENDERED_CHARS = 3;
-#endif
+ // we have some space to decrease chiclet panel
+ S32 panel_delta_min = chiclet_panel_width - chiclet_panel_min_width;
- verifyChildControlsSizes();
- updateResizeState(width, height);
+ S32 delta_panel = llmin(-delta_width, panel_delta_min);
- switch (mResizeState)
- {
- case STATE_CHICLET_PANEL:
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, TRUE);
+ lldebugs << "delta_width: " << delta_width
+ << ", panel_delta_min: " << panel_delta_min
+ << ", delta_panel: " << delta_panel
+ << llendl;
- mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+ // is chiclet panel width enough to process resizing?
+ delta_width += panel_delta_min;
- break;
- case STATE_CHATBAR_INPUT:
- mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, TRUE);
+ still_should_be_processed = delta_width < 0;
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, FALSE);
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - delta_panel, mChicletPanel->getParent()->getRect().getHeight());
+ log(mChicletPanel, "after processing panel decreasing via chiclet panel");
- break;
+ lldebugs << "RS_CHICLET_PANEL"
+ << ", delta_width: " << delta_width
+ << llendl;
+ }
-#ifdef __FEATURE_EXT_991__
+ const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+ const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+ if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
+ {
+ // we have some space to decrease chatbar panel
+ S32 panel_delta_min = chatbar_panel_width - chatbar_panel_min_width;
- case STATE_BUTTONS:
- mToolbarStack->updatePanelAutoResize(PANEL_CAMERA_NAME, TRUE);
- mToolbarStack->updatePanelAutoResize(PANEL_MOVEMENT_NAME, TRUE);
+ S32 delta_panel = llmin(-delta_width, panel_delta_min);
- mToolbarStack->updatePanelAutoResize(PANEL_CHICLET_NAME, FALSE);
- mToolbarStack->updatePanelAutoResize(PANEL_CHATBAR_NAME, FALSE);
+ // whether chatbar panel width is enough to process resizing?
+ delta_width += panel_delta_min;
- if (shrink)
- {
+ still_should_be_processed = delta_width < 0;
- if (mSnapshotPanel->getVisible())
- {
- showSnapshotButton(FALSE);
- }
+ mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - delta_panel, mNearbyChatBar->getRect().getHeight());
- if (mCamPanel->getVisible() && mCamButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
- {
- showCameraButton(FALSE);
- }
+ log(mChicletPanel, "after processing panel decreasing via nearby chatbar panel");
- if (mMovementPanel->getVisible() && mMovementButton->getLastDrawCharsCount() < MIN_RENDERED_CHARS)
- {
- showMoveButton(FALSE);
- }
+ lldebugs << "RS_CHATBAR_INPUT"
+ << ", delta_panel: " << delta_panel
+ << ", delta_width: " << delta_width
+ << llendl;
+ }
- }
- else
- {
- showMoveButton(TRUE);
- mMovementPanel->draw();
+ S32 extra_shrink_width = 0;
+ S32 buttons_freed_width = 0;
+ if (still_should_be_processed)
+ {
+ processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
- if (mMovementButton->getLastDrawCharsCount() >= MIN_RENDERED_CHARS)
- {
- showMoveButton(TRUE);
- }
- else
- {
- showMoveButton(FALSE);
- }
- }
- break;
-#endif
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width);
+ }
- default:
- break;
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width);
+ }
+
+ if (delta_width < 0)
+ {
+ processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width);
+ }
+
+ if (delta_width < 0)
+ {
+ extra_shrink_width = -delta_width;
+ lldebugs << "There is no enough room for bottom tray, resizing still should be processed: "
+ << extra_shrink_width << llendl;
+ }
+
+ if (buttons_freed_width > 0)
+ {
+ log(mNearbyChatBar, "before applying compensative width");
+ mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() + buttons_freed_width, mNearbyChatBar->getRect().getHeight() );
+ log(mNearbyChatBar, "after applying compensative width");
+ lldebugs << buttons_freed_width << llendl;
}
}
- LLPanel::reshape(width, height, called_from_parent);
+ return extra_shrink_width;
}
-void LLBottomTray::updateResizeState(S32 width, S32 height)
+void LLBottomTray::processWidthIncreased(S32 delta_width)
{
- mResizeState = STATE_BUTTONS;
+ if (delta_width <= 0) return;
- const S32 chiclet_panel_width = mChicletPanel->getRect().getWidth();
+ const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
- // bottom tray is narrowed
- if (width < getRect().getWidth())
+ const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width;
+ const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
+
+ // how many room we have to show hidden buttons
+ S32 available_width = delta_width + chatbar_available_shrink_width + available_width_chiclet;
+ S32 buttons_required_width = 0; //How many room will take shown buttons
+
+ if (available_width > 0)
+ {
+ lldebugs << "Trying to process: RS_BUTTON_GESTURES" << llendl;
+ processShowButton(RS_BUTTON_GESTURES, &available_width, &buttons_required_width);
+ }
+
+ if (available_width > 0)
+ {
+ lldebugs << "Trying to process: RS_BUTTON_MOVEMENT" << llendl;
+ processShowButton(RS_BUTTON_MOVEMENT, &available_width, &buttons_required_width);
+ }
+
+ if (available_width > 0)
+ {
+ lldebugs << "Trying to process: RS_BUTTON_CAMERA" << llendl;
+ processShowButton(RS_BUTTON_CAMERA, &available_width, &buttons_required_width);
+ }
+
+ if (available_width > 0)
+ {
+ lldebugs << "Trying to process: RS_BUTTON_SNAPSHOT" << llendl;
+ processShowButton(RS_BUTTON_SNAPSHOT, &available_width, &buttons_required_width);
+ }
+
+ // if we have to show some buttons but whidth increasing is not enough...
+ if (buttons_required_width > 0 && delta_width < buttons_required_width)
{
- if (chiclet_panel_width > chiclet_panel_min_width)
+ // ... let's shrink nearby chat & chiclet panels
+ S32 required_to_process_width = buttons_required_width;
+
+ // 1. use delta width of resizing
+ required_to_process_width -= delta_width;
+
+ // 2. use width available via decreasing of nearby chat panel
+ S32 chatbar_shrink_width = required_to_process_width;
+ if (chatbar_available_shrink_width < chatbar_shrink_width)
{
- mResizeState = STATE_CHICLET_PANEL;
+ chatbar_shrink_width = chatbar_available_shrink_width;
}
- else if (chatbar_panel_width > chatbar_panel_min_width)
+
+ log(mNearbyChatBar, "increase width: before applying compensative width");
+ mNearbyChatBar->reshape(mNearbyChatBar->getRect().getWidth() - chatbar_shrink_width, mNearbyChatBar->getRect().getHeight() );
+ if (mNearbyChatBar) log(mNearbyChatBar, "after applying compensative width");
+ lldebugs << chatbar_shrink_width << llendl;
+
+ // 3. use width available via decreasing of chiclet panel
+ required_to_process_width -= chatbar_shrink_width;
+
+ if (required_to_process_width > 0)
{
- mResizeState = STATE_CHATBAR_INPUT;
+ mChicletPanel->getParent()->reshape(mChicletPanel->getParent()->getRect().getWidth() - required_to_process_width, mChicletPanel->getParent()->getRect().getHeight());
+ log(mChicletPanel, "after applying compensative width for chiclets: ");
+ lldebugs << required_to_process_width << llendl;
}
- else
+
+ }
+
+ // shown buttons take some space, rest should be processed by nearby chatbar & chiclet panels
+ delta_width -= buttons_required_width;
+
+ // how many space can nearby chatbar take?
+ S32 chatbar_panel_width_ = mNearbyChatBar->getRect().getWidth();
+ if (delta_width > 0 && chatbar_panel_width_ < chatbar_panel_max_width)
+ {
+ S32 delta_panel_max = chatbar_panel_max_width - chatbar_panel_width_;
+ S32 delta_panel = llmin(delta_width, delta_panel_max);
+ delta_width -= delta_panel_max;
+ mNearbyChatBar->reshape(chatbar_panel_width_ + delta_panel, mNearbyChatBar->getRect().getHeight());
+ }
+}
+
+bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width)
+{
+ LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+ return false;
+ }
+ bool can_be_shown = canButtonBeShown(shown_object_type);
+ if (can_be_shown)
+ {
+ //validate if we have enough room to show this button
+ const S32 required_width = panel->getRect().getWidth();
+ can_be_shown = *available_width >= required_width;
+ if (can_be_shown)
{
- mResizeState = STATE_BUTTONS;
+ *available_width -= required_width;
+ *buttons_required_width += required_width;
+
+ setTrayButtonVisible(shown_object_type, true);
+
+ lldebugs << "processing object type: " << shown_object_type
+ << ", buttons_required_width: " << *buttons_required_width
+ << llendl;
+ mResizeState &= ~shown_object_type;
}
}
- // bottom tray is widen
- else
+ return can_be_shown;
+}
+
+void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
+{
+ LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
+ if (NULL == panel)
{
-#ifdef __FEATURE_EXT_991__
- if (!mMovementPanel->getVisible())
+ lldebugs << "There is no object to process for state: " << processed_object_type << llendl;
+ return;
+ }
+
+ if (panel->getVisible())
+ {
+ *required_width += panel->getRect().getWidth();
+
+ if (*required_width > 0)
{
- mResizeState = STATE_BUTTONS;
+ *buttons_freed_width += *required_width;
}
- else
-#endif
- if (chatbar_panel_width < chatbar_panel_max_width)
+
+ setTrayButtonVisible(processed_object_type, false);
+
+ mResizeState |= processed_object_type;
+
+ lldebugs << "processing object type: " << processed_object_type
+ << ", buttons_freed_width: " << *buttons_freed_width
+ << llendl;
+ }
+}
+
+bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
+{
+ bool can_be_shown = mResizeState & processed_object_type;
+ if (can_be_shown)
+ {
+ static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
+ static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
+ static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+
+ switch(processed_object_type)
{
- mResizeState = STATE_CHATBAR_INPUT;
+ case RS_BUTTON_GESTURES: // Gestures should be shown first
+ break;
+ case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
+ can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ case RS_BUTTON_CAMERA:
+ can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ case RS_BUTTON_SNAPSHOT:
+ can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
+ break;
+ default: // nothing to do here
+ break;
}
- else
+ }
+ return can_be_shown;
+}
+
+void LLBottomTray::initStateProcessedObjectMap()
+{
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
+}
+
+void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
+{
+ LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ if (NULL == panel)
+ {
+ lldebugs << "There is no object to show for state: " << shown_object_type << llendl;
+ return;
+ }
+
+ panel->setVisible(visible);
+}
+
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible)
+{
+ bool can_be_set = true;
+
+ if (visible)
+ {
+ LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
+ if (NULL == panel)
{
- mResizeState = STATE_CHICLET_PANEL;
+ lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
+ return;
}
+
+ const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
+ const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+
+ const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
+ const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+
+ const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width)
+ + (chiclet_panel_width - chiclet_panel_min_width);
+
+ const S32 required_width = panel->getRect().getWidth();
+ can_be_set = available_width >= required_width;
}
+ if (can_be_set)
+ {
+ setTrayButtonVisible(shown_object_type, visible);
- // TODO: finish implementation
+ // if we hide the button mark it NOT to show while future bottom tray extending
+ if (!visible)
+ {
+ mResizeState &= ~shown_object_type;
+ }
+ }
+ else
+ {
+ // mark this button to show it while future bottom tray extending
+ mResizeState |= shown_object_type;
+ LLNotifications::instance().add("BottomTrayButtonCanNotBeShown");
+ }
}
+
+//EOF
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 02588a1975..8989816bfe 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -33,7 +33,7 @@
#ifndef LL_LLBOTTOMPANEL_H
#define LL_LLBOTTOMPANEL_H
-#include <llmenugl.h>
+#include "llmenugl.h"
#include "llpanel.h"
#include "llimview.h"
@@ -51,7 +51,9 @@ class LLBottomTray
: public LLSingleton<LLBottomTray>
, public LLPanel
, public LLIMSessionObserver
+ , public LLVoiceClientStatusObserver
{
+ LOG_CLASS(LLBottomTray);
friend class LLSingleton<LLBottomTray>;
public:
~LLBottomTray();
@@ -74,6 +76,10 @@ public:
virtual void onFocusLost();
virtual void setVisible(BOOL visible);
+ // Implements LLVoiceClientStatusObserver::onChange() to enable the speak
+ // button when voice is available
+ /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
+
void showBottomTrayContextMenu(S32 x, S32 y, MASK mask);
void showGestureButton(BOOL visible);
@@ -82,18 +88,57 @@ public:
void showSnapshotButton(BOOL visible);
private:
-
- enum EResizeState
+ typedef enum e_resize_status_type
{
- STATE_CHICLET_PANEL = 1,
- STATE_CHATBAR_INPUT,
- STATE_BUTTONS
- };
+ RS_NORESIZE = 0x0000
+ , RS_CHICLET_PANEL = 0x0001
+ , RS_CHATBAR_INPUT = 0x0002
+ , RS_BUTTON_SNAPSHOT = 0x0004
+ , RS_BUTTON_CAMERA = 0x0008
+ , RS_BUTTON_MOVEMENT = 0x0010
+ , RS_BUTTON_GESTURES = 0x0020
+ , RS_BUTTON_SPEAK = 0x0040
+ , RS_RESIZABLE_BUTTONS = /*RS_BUTTON_SNAPSHOT | */RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+ }EResizeState;
+
+ S32 processWidthDecreased(S32 delta_width);
+ void processWidthIncreased(S32 delta_width);
+ void log(LLView* panel, const std::string& descr);
+ bool processShowButton(EResizeState shown_object_type, S32* available_width, S32* buttons_required_width);
+ void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
+
+ /**
+ * Determines if specified by type object can be shown. It should be hidden by shrink before.
+ *
+ * Processes buttons a such way to show buttons in constant order:
+ * - Gestures, Move, View, Snapshot
+ */
+ bool canButtonBeShown(EResizeState processed_object_type) const;
+ void initStateProcessedObjectMap();
+
+ /**
+ * Sets passed visibility to object specified by resize type.
+ */
+ void setTrayButtonVisible(EResizeState shown_object_type, bool visible);
+
+ /**
+ * Sets passed visibility to object specified by resize type if it is possible.
+ *
+ * If it is impossible to show required button due to there is no enough room in bottom tray
+ * it will no be shown. Is called via context menu commands.
+ * In this case Alert Dialog will be shown to notify user about that.
+ *
+ * Method also stores resize state to be processed while future bottom tray extending:
+ * - if hidden while resizing button should be hidden it will not be shown while extending;
+ * - if hidden via context menu button should be shown but there is no enough room for now
+ * it will be shown while extending.
+ */
+ void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible);
- void updateResizeState(S32 width, S32 height);
- void verifyChildControlsSizes();
+ MASK mResizeState;
- EResizeState mResizeState;
+ typedef std::map<EResizeState, LLPanel*> state_object_map_t;
+ state_object_map_t mStateProcessedObjectMap;
protected:
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index e8812d87ee..0b10255c2f 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -51,7 +51,7 @@
#include "llagent.h"
#include "llbutton.h"
-//#include "llinventory.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
#include "llnotify.h"
#include "llresmgr.h"
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 914435b640..3443d8b593 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -220,5 +220,12 @@ void LLChannelManager::removeChannelByID(const LLUUID id)
}
//--------------------------------------------------------------------------
-
+void LLChannelManager::muteAllChannels(bool mute)
+{
+ for (std::vector<ChannelElem>::iterator it = mChannelList.begin();
+ it != mChannelList.end(); it++)
+ {
+ it->channel->setShowToasts(!mute);
+ }
+}
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index b927d369cd..4b66a1ef89 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -102,6 +102,13 @@ public:
// remove channel methods
void removeChannelByID(const LLUUID id);
+ /**
+ * Manages toasts showing for all channels.
+ *
+ * @param mute Flag to disable/enable toasts showing.
+ */
+ void muteAllChannels(bool mute);
+
private:
LLScreenChannel* createChannel(LLChannelManager::Params& p);
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 4523267edd..442dc660cd 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -210,8 +210,9 @@ void LLChatBar::refreshGestures()
// collect list of unique gestures
std::map <std::string, BOOL> unique;
- LLGestureManager::item_map_t::iterator it;
- for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+ LLGestureManager::item_map_t::const_iterator it;
+ const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
LLMultiGesture* gesture = (*it).second;
if (gesture)
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 2ccd6b7d35..028bb7a384 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -47,14 +47,13 @@
#include "llmutelist.h"
static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
-static const std::string MESSAGE_USERNAME_DATE_SEPARATOR(" ----- ");
std::string formatCurrentTime()
{
time_t utc_time;
utc_time = time_corrected();
std::string timeStr ="["+ LLTrans::getString("TimeHour")+"]:["
- +LLTrans::getString("TimeMin")+"] ";
+ +LLTrans::getString("TimeMin")+"]";
LLSD substitution;
@@ -85,6 +84,10 @@ public:
if (level == "profile")
{
+ LLSD params;
+ params["object_id"] = getAvatarId();
+
+ LLFloaterReg::showInstance("inspect_object", params);
}
else if (level == "block")
{
@@ -132,7 +135,7 @@ public:
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mPopupMenuHandleObject = menu->getHandle();
- setMouseDownCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
+ setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
return LLPanel::postBuild();
}
@@ -168,14 +171,22 @@ public:
void onHeaderPanelClick(S32 x, S32 y, MASK mask)
{
- LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+ if (mSourceType == CHAT_SOURCE_OBJECT)
+ {
+ LLFloaterReg::showInstance("inspect_object", LLSD().insert("object_id", mAvatarID));
+ }
+ else if (mSourceType == CHAT_SOURCE_AGENT)
+ {
+ LLFloaterReg::showInstance("inspect_avatar", LLSD().insert("avatar_id", mAvatarID));
+ }
+ //if chat source is system, you may add "else" here to define behaviour.
}
const LLUUID& getAvatarId () const { return mAvatarID;}
const std::string& getFirstName() const { return mFirstName; }
const std::string& getLastName () const { return mLastName; }
- void setup(const LLChat& chat)
+ void setup(const LLChat& chat,const LLStyle::Params& style_params)
{
mAvatarID = chat.mFromID;
mSourceType = chat.mSourceType;
@@ -185,8 +196,11 @@ public:
mSourceType = CHAT_SOURCE_SYSTEM;
}
-
LLTextBox* userName = getChild<LLTextBox>("user_name");
+
+ LLUIColor color = style_params.color;
+ userName->setReadOnlyColor(color);
+ userName->setColor(color);
if(!chat.mFromName.empty())
{
@@ -198,6 +212,7 @@ public:
std::string SL = LLTrans::getString("SECOND_LIFE");
userName->setValue(SL);
}
+
LLTextBox* timeBox = getChild<LLTextBox>("time_box");
timeBox->setValue(formatCurrentTime());
@@ -323,39 +338,52 @@ LLView* LLChatHistory::getSeparator()
return separator;
}
-LLView* LLChatHistory::getHeader(const LLChat& chat)
+LLView* LLChatHistory::getHeader(const LLChat& chat,const LLStyle::Params& style_params)
{
LLChatHistoryHeader* header = LLChatHistoryHeader::createInstance(mMessageHeaderFilename);
- header->setup(chat);
+ header->setup(chat,style_params);
return header;
}
-void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params)
+void LLChatHistory::appendWidgetMessage(const LLChat& chat)
{
LLView* view = NULL;
- std::string view_text;
+ std::string view_text = "\n[" + formatCurrentTime() + "] ";
+ if (utf8str_trim(chat.mFromName).size() != 0 && chat.mFromName != SYSTEM_FROM)
+ view_text += chat.mFromName + ": ";
+
LLInlineViewSegment::Params p;
p.force_newline = true;
p.left_pad = mLeftWidgetPad;
p.right_pad = mRightWidgetPad;
+
+ LLColor4 txt_color = LLUIColorTable::instance().getColor("White");
+ LLViewerChat::getChatColor(chat,txt_color);
+ LLFontGL* fontp = LLViewerChat::getChatFont();
+
+ LLStyle::Params style_params;
+ style_params.color(txt_color);
+ style_params.readonly_color(txt_color);
+ style_params.font(fontp);
+
+
if (mLastFromName == chat.mFromName)
{
view = getSeparator();
- view_text = "\n";
p.top_pad = mTopSeparatorPad;
p.bottom_pad = mBottomSeparatorPad;
}
else
{
- view = getHeader(chat);
- view_text = chat.mFromName + MESSAGE_USERNAME_DATE_SEPARATOR + formatCurrentTime() + '\n';
+ view = getHeader(chat,style_params);
if (getText().size() == 0)
p.top_pad = 0;
else
p.top_pad = mTopHeaderPad;
p.bottom_pad = mBottomHeaderPad;
+
}
p.view = view;
@@ -370,10 +398,8 @@ void LLChatHistory::appendWidgetMessage(const LLChat& chat, LLStyle::Params& sty
appendWidget(p, view_text, false);
//Append the text message
- std::string message = chat.mText + '\n';
- appendText(message, FALSE, style_params);
+ appendText(chat.mText, FALSE, style_params);
mLastFromName = chat.mFromName;
blockUndo();
- setCursorAndScrollToEnd();
}
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 3789ebff4e..f689a225fe 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -34,7 +34,7 @@
#define LLCHATHISTORY_H_
#include "lltexteditor.h"
-#include "llchat.h"
+#include "llviewerchat.h"
//Chat log widget allowing addition of a message as a widget
class LLChatHistory : public LLTextEditor
@@ -94,11 +94,9 @@ class LLChatHistory : public LLTextEditor
LLView* getSeparator();
/**
* Builds a message header.
- * @param from owner of a message.
- * @param time time of a message.
* @return pointer to LLView header object.
*/
- LLView* getHeader(const LLChat& chat);
+ LLView* getHeader(const LLChat& chat,const LLStyle::Params& style_params);
public:
~LLChatHistory();
@@ -111,7 +109,7 @@ class LLChatHistory : public LLTextEditor
* @param time time of a message.
* @param message message itself.
*/
- void appendWidgetMessage(const LLChat& chat, LLStyle::Params& style_params);
+ void appendWidgetMessage(const LLChat& chat);
private:
std::string mLastFromName;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index 63b9fd8e66..d2e3247250 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -120,10 +120,10 @@ std::string LLNearbyChatToastPanel::appendTime()
-void LLNearbyChatToastPanel::addText (const std::string& message)
+void LLNearbyChatToastPanel::addText (const std::string& message , const LLStyle::Params& input_params)
{
LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- msg_text->addText(message);
+ msg_text->addText(message , input_params);
mMessages.push_back(message);
}
@@ -134,9 +134,34 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
mText = notification["message"].asString(); // UTF-8 line of text
mFromName = notification["from"].asString(); // agent or object name
mFromID = notification["from_id"].asUUID(); // agent id or object id
+
int sType = notification["source"].asInteger();
mSourceType = (EChatSourceType)sType;
-
+
+ std::string color_name = notification["text_color"].asString();
+
+ mTextColor = LLUIColorTable::instance().getColor(color_name);
+ mTextColor.mV[VALPHA] =notification["color_alpha"].asReal();
+
+ S32 font_size = notification["font_size"].asInteger();
+ switch(font_size)
+ {
+ case 0:
+ mFont = LLFontGL::getFontSansSerifSmall();
+ break;
+ default:
+ case 1:
+ mFont = LLFontGL::getFontSansSerif();
+ break;
+ case 2:
+ mFont = LLFontGL::getFontSansSerifBig();
+ break;
+ }
+
+ LLStyle::Params style_params;
+ style_params.color(mTextColor);
+ style_params.font(mFont);
+
std::string str_sender;
if(gAgentID != mFromID)
@@ -144,13 +169,13 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
else
str_sender = LLTrans::getString("You");;
- caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender);
+ caption->getChild<LLTextBox>("sender_name", false)->setText(str_sender , style_params);
- caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime());
+ caption->getChild<LLTextBox>("msg_time", false)->setText(appendTime() , style_params );
LLChatMsgBox* msg_text = getChild<LLChatMsgBox>("msg_text", false);
- msg_text->setText(mText);
+ msg_text->setText(mText, style_params);
LLUICtrl* msg_inspector = caption->getChild<LLUICtrl>("msg_inspector");
if(mSourceType != CHAT_SOURCE_AGENT)
@@ -171,7 +196,15 @@ void LLNearbyChatToastPanel::setMessage (const LLChat& chat_msg)
notification["from_id"] = chat_msg.mFromID;
notification["time"] = chat_msg.mTime;
notification["source"] = (S32)chat_msg.mSourceType;
-
+
+ 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);
}
@@ -201,11 +234,17 @@ void LLNearbyChatToastPanel::setWidth(S32 width)
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);
+ msg_text->setText(mText, style_params);
for(size_t i=0;i<mMessages.size();++i)
- msg_text->addText(mMessages[i]);
+ msg_text->addText(mMessages[i] , style_params);
setRect(LLRect(getRect().mLeft, getRect().mTop, getRect().mLeft + width , getRect().mBottom));
snapToMessageHeight ();
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 8fb045b6d9..a65bfedd09 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -36,7 +36,7 @@
#include "llpanel.h"
#include "llscrollbar.h"
#include "string"
-#include "llchat.h"
+#include "llviewerchat.h"
#include "lltoastpanel.h"
typedef enum e_show_item_header
@@ -59,7 +59,7 @@ public:
const LLUUID& getFromID() const { return mFromID;}
- void addText (const std::string& message);
+ void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params());
void setMessage (const LLChat& msg);
void setWidth (S32 width);
void snapToMessageHeight ();
@@ -89,6 +89,8 @@ private:
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;
diff --git a/indra/newview/llchatmsgbox.cpp b/indra/newview/llchatmsgbox.cpp
index 12626e3b43..bb0ec2db27 100644
--- a/indra/newview/llchatmsgbox.cpp
+++ b/indra/newview/llchatmsgbox.cpp
@@ -84,7 +84,7 @@ LLChatMsgBox::LLChatMsgBox(const Params& p) :
mBlockSpacing(p.block_spacing)
{}
-void LLChatMsgBox::addText( const LLStringExplicit& text )
+void LLChatMsgBox::addText( const LLStringExplicit& text , const LLStyle::Params& input_params )
{
S32 length = getLength();
// if there is existing text, add a separator
@@ -94,5 +94,5 @@ void LLChatMsgBox::addText( const LLStringExplicit& text )
insertSegment(new ChatSeparator(length - 1, length - 1));
}
// prepend newline only if there is some existing text
- appendText(text, length > 0);
+ appendText(text, length > 0, input_params);
}
diff --git a/indra/newview/llchatmsgbox.h b/indra/newview/llchatmsgbox.h
index df29db58c3..9e16616729 100644
--- a/indra/newview/llchatmsgbox.h
+++ b/indra/newview/llchatmsgbox.h
@@ -61,7 +61,7 @@ protected:
friend class LLUICtrlFactory;
public:
- void addText(const LLStringExplicit &text);
+ void addText(const LLStringExplicit &text, const LLStyle::Params& input_params = LLStyle::Params());
private:
S32 mBlockSpacing;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index 6e0654e157..4078fac4ec 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -54,10 +54,12 @@ static LLDefaultChildRegistry::Register<LLChicletPanel> t1("chiclet_panel");
static LLDefaultChildRegistry::Register<LLNotificationChiclet> t2("chiclet_notification");
static LLDefaultChildRegistry::Register<LLIMP2PChiclet> t3("chiclet_im_p2p");
static LLDefaultChildRegistry::Register<LLIMGroupChiclet> t4("chiclet_im_group");
+static LLDefaultChildRegistry::Register<LLAdHocChiclet> t5("chiclet_im_adhoc");
static const LLRect CHICLET_RECT(0, 25, 25, 0);
-static const LLRect CHICLET_ICON_RECT(0, 24, 24, 0);
+static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
+static const S32 OVERLAY_ICON_SHIFT = 2; // used for shifting of an overlay icon for new massages in a chiclet
// static
const S32 LLChicletPanel::s_scroll_ratio = 10;
@@ -103,6 +105,7 @@ LLNotificationChiclet::LLNotificationChiclet(const Params& p)
// connect counter handlers to the signals
connectCounterUpdatersToSignal("notify");
connectCounterUpdatersToSignal("groupnotify");
+ connectCounterUpdatersToSignal("offer");
}
LLNotificationChiclet::~LLNotificationChiclet()
@@ -216,13 +219,15 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
icon_params.visible = false;
icon_params.image = LLUI::getUIImage(p.new_messages_icon_name);
mNewMessagesIcon = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ addChild(mNewMessagesIcon);
+
// adjust size and position of an icon
LLRect chiclet_rect = p.rect;
- LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.mTop, chiclet_rect.mRight, chiclet_rect.getHeight()/2);
- // shift an icon a little bit to the right and up corner of a chiclet
- overlay_icon_rect.translate(overlay_icon_rect.getWidth()/5, overlay_icon_rect.getHeight()/5);
+ LLRect overlay_icon_rect = LLRect(chiclet_rect.getWidth()/2, chiclet_rect.getHeight(), chiclet_rect.getWidth(), chiclet_rect.getHeight()/2);
mNewMessagesIcon->setRect(overlay_icon_rect);
- addChild(mNewMessagesIcon);
+
+ // shift an icon a little bit to the right and up corner of a chiclet
+ overlay_icon_rect.translate(OVERLAY_ICON_SHIFT, OVERLAY_ICON_SHIFT);
setShowCounter(false);
}
@@ -422,7 +427,6 @@ void LLIMP2PChiclet::updateMenuItems()
bool is_friend = LLAvatarActions::isFriend(getOtherParticipantId());
mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend);
- mPopupMenu->getChild<LLUICtrl>("Remove Friend")->setEnabled(is_friend);
}
BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -601,6 +605,9 @@ BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
LLIMGroupChiclet::Params::Params()
: group_icon("group_icon")
+, unread_notifications("unread_notifications")
+, speaker("speaker")
+, show_speaker("show_speaker")
{
rect(CHICLET_RECT);
@@ -793,7 +800,7 @@ LLChicletPanel::Params::Params()
if (!min_width.isProvided())
{
// min_width = 4 chiclets + 3 paddings
- min_width = 179 + 3*chiclet_padding;
+ min_width = 180 + 3*chiclet_padding;
}
};
@@ -808,6 +815,7 @@ LLChicletPanel::LLChicletPanel(const Params&p)
, mShowControls(true)
{
LLPanel::Params panel_params;
+ panel_params.follows.flags(FOLLOWS_LEFT | FOLLOWS_RIGHT);
mScrollArea = LLUICtrlFactory::create<LLPanel>(panel_params,this);
// important for Show/Hide Camera and Move controls menu in bottom tray to work properly
@@ -826,8 +834,17 @@ LLChicletPanel::~LLChicletPanel()
void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
LLUUID session_id = data["session_id"].asUUID();
+ LLUUID from_id = data["from_id"].asUUID();
+ const std::string from = data["from"].asString();
S32 unread = data["num_unread"].asInteger();
+ // if new message came
+ if(unread != 0)
+ {
+ //we do not show balloon (indicator of new messages) for system messages and our own messages
+ if (from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from) return;
+ }
+
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
if (im_floater && im_floater->getVisible())
{
@@ -847,7 +864,6 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
llwarns << "Unable to set counter for chiclet " << session_id << llendl;
}
}
-
}
@@ -876,19 +892,34 @@ BOOL LLChicletPanel::postBuild()
void LLChicletPanel::onCurrentVoiceChannelChanged(const LLUUID& session_id)
{
- for(chiclet_list_t::iterator it = mChicletList.begin(); it != mChicletList.end(); ++it)
+ static LLUUID s_previous_active_voice_session_id;
+
+ std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(session_id);
+
+ for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
{
LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
if(chiclet)
{
- if(chiclet->getSessionId() == session_id)
+ chiclet->setShowSpeaker(true);
+ }
+ }
+
+ if(!s_previous_active_voice_session_id.isNull() && s_previous_active_voice_session_id != session_id)
+ {
+ chiclets = LLIMChiclet::sFindChicletsSignal(s_previous_active_voice_session_id);
+
+ for(std::list<LLChiclet *>::iterator it = chiclets.begin(); it != chiclets.end(); ++it)
+ {
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+ if(chiclet)
{
- chiclet->setShowSpeaker(true);
- continue;
+ chiclet->setShowSpeaker(false);
}
- chiclet->setShowSpeaker(false);
- }
+ }
}
+
+ s_previous_active_voice_session_id = session_id;
}
S32 LLChicletPanel::calcChickletPanleWidth()
@@ -1058,7 +1089,7 @@ void LLChicletPanel::reshape(S32 width, S32 height, BOOL called_from_parent )
width, scroll_button_rect.mBottom));
mScrollArea->setRect(LLRect(scroll_button_rect.getWidth() + SCROLL_BUTTON_PAD,
height, width - scroll_button_rect.getWidth() - SCROLL_BUTTON_PAD, 0));
- mShowControls = width > mMinWidth;
+ mShowControls = width >= mMinWidth;
mScrollArea->setVisible(mShowControls);
trimChiclets();
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index e7afd7f08e..eab4a282f5 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -107,6 +107,7 @@ public:
{
draw_tooltip(FALSE);
mouse_opaque(FALSE);
+ default_icon_name("Generic_Person");
};
};
@@ -128,7 +129,7 @@ public:
Optional<std::string> default_icon;
Params()
- : default_icon("default_icon", "default_land_picture.j2c")
+ : default_icon("default_icon", "Generic_Group")
{
};
};
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 424d635321..6d7da107ac 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -129,12 +129,12 @@ void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL calle
}
}
-void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text)
+void LLExpandableTextBox::LLTextBoxEx::setText(const LLStringExplicit& text,const LLStyle::Params& input_params)
{
// LLTextBox::setText will obliterate the expander segment, so make sure
// we generate it again by clearing mExpanderVisible
mExpanderVisible = false;
- LLTextBox::setText(text);
+ LLTextBox::setText(text, input_params);
// text contents have changed, segments are cleared out
// so hide the expander and determine if we need it
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 3fe646c29c..7c989cfa50 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -60,7 +60,7 @@ protected:
// adds or removes "More" link as needed
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
- /*virtual*/ void setText(const LLStringExplicit& text);
+ /*virtual*/ void setText(const LLStringExplicit& text, const LLStyle::Params& input_params = LLStyle::Params());
/**
* Returns difference between text box height and text height.
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 18135fc558..ae5be8cc7c 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -74,6 +74,7 @@ public:
mName("(Loading...)"),
mPosX(0),
mPosY(0),
+ mPosZ(0),
mLoaded(false)
{}
@@ -101,6 +102,14 @@ public:
requestNameAndPos();
return mPosY;
}
+
+ S32 getPosZ()
+ {
+ if (!mLoaded)
+ requestNameAndPos();
+ return mPosZ;
+ }
+
private:
/**
* Requests landmark data from server.
@@ -114,14 +123,15 @@ private:
if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos))
{
LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos,
- boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3));
+ boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4));
}
}
- void landmarkNameCallback(const std::string& name, S32 x, S32 y)
+ void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z)
{
mPosX = x;
mPosY = y;
+ mPosZ = z;
mName = name;
mLoaded = true;
}
@@ -130,6 +140,7 @@ private:
std::string mName;
S32 mPosX;
S32 mPosY;
+ S32 mPosZ;
bool mLoaded;
};
@@ -151,7 +162,8 @@ public:
if (!region_name.empty())
{
LLToolTip::Params params;
- params.message = llformat("%s\n%s (%d, %d)", getLabelSelected().c_str(), region_name.c_str(), mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY());
+ params.message = llformat("%s\n%s (%d, %d, %d)", getLabelSelected().c_str(), region_name.c_str(),
+ mLandmarkInfoGetter.getPosX(), mLandmarkInfoGetter.getPosY(), mLandmarkInfoGetter.getPosZ());
params.sticky_rect = calcScreenRect();
LLToolTipMgr::instance().show(params);
}
@@ -901,7 +913,10 @@ void LLFavoritesBarCtrl::showDropDownMenu()
menu->buildDrawLabels();
menu->updateParent(LLMenuGL::sMenuContainer);
- menu->setButtonRect(mChevronRect, this);
+ if (menu->getButtonRect().isEmpty())
+ {
+ menu->setButtonRect(mChevronRect, this);
+ }
LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
return;
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index e90d13f9d5..20a324c67c 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -35,6 +35,7 @@
#include "lluictrl.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
class LLFavoritesBarCtrl : public LLUICtrl, public LLInventoryObserver
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index cefd7a3808..c8df6c6135 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -230,10 +230,6 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
if (obj->getType() == LLAssetType::AT_CATEGORY)
continue;
- // Skip root folders, so we know we have inventory items only
- if (obj->getType() == LLAssetType::AT_ROOT_CATEGORY)
- continue;
-
// Skip the mysterious blank InventoryObject
if (obj->getType() == LLAssetType::AT_NONE)
continue;
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 32802f6a20..a99d0c918d 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -187,10 +187,6 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
if (asset_type == LLAssetType::AT_CATEGORY)
continue;
- // Skip root folders, so we know we have inventory items only
- if (asset_type == LLAssetType::AT_ROOT_CATEGORY)
- continue;
-
LLInventoryItem* inv_item = (LLInventoryItem*)((LLInventoryObject*)(*it));
inv_type = inv_item->getInventoryType();
@@ -286,7 +282,7 @@ void LLFloaterBuyContents::onClickBuy()
// Put the items where we put new folders.
LLUUID category_id;
- category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CATEGORY);
+ category_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ROOT_INVENTORY);
// *NOTE: doesn't work for multiple object buy, which UI does not
// currently support sale info is used for verification only, if
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index d1317f7c36..92e958b32d 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -40,10 +40,12 @@
// Viewer includes
#include "lljoystickbutton.h"
#include "llviewercontrol.h"
+#include "llviewercamera.h"
#include "llbottomtray.h"
#include "llagent.h"
#include "lltoolmgr.h"
#include "lltoolfocus.h"
+#include "llslider.h"
// Constants
const F32 CAMERA_BUTTON_DELAY = 0.0f;
@@ -54,6 +56,93 @@ const F32 CAMERA_BUTTON_DELAY = 0.0f;
#define PRESETS "camera_presets"
#define CONTROLS "controls"
+// Zoom the camera in and out
+class LLPanelCameraZoom
+: public LLPanel
+{
+ LOG_CLASS(LLPanelCameraZoom);
+public:
+ LLPanelCameraZoom();
+
+ /* virtual */ BOOL postBuild();
+ /* virtual */ void onOpen(const LLSD& key);
+
+protected:
+ void onZoomPlusHeldDown();
+ void onZoomMinusHeldDown();
+ void onSliderValueChanged();
+
+private:
+ F32 mSavedSliderVal;
+ LLButton* mPlusBtn;
+ LLButton* mMinusBtn;
+ LLSlider* mSlider;
+};
+
+static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
+
+//-------------------------------------------------------------------------------
+// LLPanelCameraZoom
+//-------------------------------------------------------------------------------
+
+LLPanelCameraZoom::LLPanelCameraZoom()
+: mPlusBtn( NULL ),
+ mMinusBtn( NULL ),
+ mSlider( NULL ),
+ mSavedSliderVal(0.f)
+{
+ mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
+ mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
+ mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
+}
+
+BOOL LLPanelCameraZoom::postBuild()
+{
+ mPlusBtn = getChild <LLButton> ("zoom_plus_btn");
+ mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
+ mSlider = getChild <LLSlider> ("zoom_slider");
+ mSlider->setMinValue(.0f);
+ mSlider->setMaxValue(8.f);
+ return LLPanel::postBuild();
+}
+
+void LLPanelCameraZoom::onOpen(const LLSD& key)
+{
+ LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal();
+ mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current
+ mSlider->setValue( mSavedSliderVal );
+}
+
+void LLPanelCameraZoom::onZoomPlusHeldDown()
+{
+ F32 val = mSlider->getValueF32();
+ F32 inc = mSlider->getIncrement();
+ mSlider->setValue(val - inc);
+ // commit only if value changed
+ if (val != mSlider->getValueF32())
+ mSlider->onCommit();
+}
+
+void LLPanelCameraZoom::onZoomMinusHeldDown()
+{
+ F32 val = mSlider->getValueF32();
+ F32 inc = mSlider->getIncrement();
+ mSlider->setValue(val + inc);
+ // commit only if value changed
+ if (val != mSlider->getValueF32())
+ mSlider->onCommit();
+}
+
+void LLPanelCameraZoom::onSliderValueChanged()
+{
+ F32 val = mSlider->getValueF32();
+ F32 rate = val - mSavedSliderVal;
+
+ gAgent.unlockView();
+ gAgent.cameraOrbitIn(rate);
+
+ mSavedSliderVal = val;
+}
//
// Member functions
@@ -125,6 +214,7 @@ void LLFloaterCamera::onOpen(const LLSD& key)
anchor_panel, this,
getDockTongue(), LLDockControl::TOP));
+ mZoom->onOpen(key);
}
void LLFloaterCamera::onClose(bool app_quitting)
@@ -147,7 +237,7 @@ BOOL LLFloaterCamera::postBuild()
setIsChrome(TRUE);
mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
- mZoom = getChild<LLJoystickCameraZoom>(ZOOM);
+ mZoom = getChild<LLPanelCameraZoom>(ZOOM);
mTrack = getChild<LLJoystickCameraTrack>(PAN);
assignButton2Mode(CAMERA_CTRL_MODE_ORBIT, "orbit_btn");
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 583f279e62..4873a34e00 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -39,6 +39,7 @@ class LLJoystickCameraRotate;
class LLJoystickCameraZoom;
class LLJoystickCameraTrack;
class LLFloaterReg;
+class LLPanelCameraZoom;
enum ECameraControlMode
{
@@ -74,7 +75,7 @@ public:
virtual void onClose(bool app_quitting);
LLJoystickCameraRotate* mRotate;
- LLJoystickCameraZoom* mZoom;
+ LLPanelCameraZoom* mZoom;
LLJoystickCameraTrack* mTrack;
private:
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index c114eed4a2..854d02873a 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -89,6 +89,52 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
//LLUICtrlFactory::getInstance()->buildFloater(this, "floater_gesture.xml");
}
+void LLFloaterGesture::done()
+{
+ //this method can be called twice: for GestureFolder and once after loading all sudir of GestureFolder
+ if (gInventory.isCategoryComplete(mGestureFolderID))
+ {
+ LL_DEBUGS("Gesture")<< "mGestureFolderID loaded" << LL_ENDL;
+ // we load only gesture folder without childred.
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;
+ LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
+ gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
+ if (categories->empty())
+ {
+ gInventory.removeObserver(this);
+ LL_INFOS("Gesture")<< "Gesture dos NOT contains sub-directories."<< LL_ENDL;
+ return;
+ }
+ LL_DEBUGS("Gesture")<< "There are " << categories->size() << " Folders "<< LL_ENDL;
+ for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); it++)
+ {
+ if (!gInventory.isCategoryComplete(it->get()->getUUID()))
+ {
+ unloaded_folders.push_back(it->get()->getUUID());
+ LL_DEBUGS("Gesture")<< it->get()->getName()<< " Folder added to fetchlist"<< LL_ENDL;
+ }
+
+ }
+ if (!unloaded_folders.empty())
+ {
+ LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL;
+ fetchDescendents(unloaded_folders);
+ }
+ else
+ {
+ LL_DEBUGS("Gesture")<< "All Gesture subdirectories have been loaded."<< LL_ENDL;
+ gInventory.removeObserver(this);
+ buildGestureList();
+ }
+ }
+ else
+ {
+ LL_WARNS("Gesture")<< "Gesture list was NOT loaded"<< LL_ENDL;
+ }
+}
+
// virtual
LLFloaterGesture::~LLFloaterGesture()
{
@@ -121,7 +167,14 @@ BOOL LLFloaterGesture::postBuild()
childSetVisible("play_btn", true);
childSetVisible("stop_btn", false);
setDefaultBtn("play_btn");
-
+ mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false);
+
+ folder_ref_t folders;
+ folders.push_back(mGestureFolderID);
+ //perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details.
+ gInventory.addObserver(this);
+ fetchDescendents(folders);
+
buildGestureList();
childSetFocus("gesture_list");
@@ -171,101 +224,125 @@ void LLFloaterGesture::buildGestureList()
if (! (list && scroll)) return;
- // attempt to preserve scroll position through re-builds
- // since we do re-build any time anything dirties
- S32 current_scroll_pos = scroll->getScrollPos();
-
+ LLUUID selected_item = list->getCurrentID();
+ LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
- LLGestureManager::item_map_t::iterator it;
- for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+ LLGestureManager::item_map_t::const_iterator it;
+ const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
- const LLUUID& item_id = (*it).first;
- LLMultiGesture* gesture = (*it).second;
+ addGesture(it->first,it->second, list);
+ }
+ if (gInventory.isCategoryComplete(mGestureFolderID))
+ {
+ LLIsType is_gesture(LLAssetType::AT_GESTURE);
+ LLInventoryModel::cat_array_t categories;
+ LLInventoryModel::item_array_t items;
+ gInventory.collectDescendentsIf(mGestureFolderID, categories, items,
+ LLInventoryModel::EXCLUDE_TRASH, is_gesture);
- // Note: Can have NULL item if inventory hasn't arrived yet.
- std::string item_name = getString("loading");
- LLInventoryItem* item = gInventory.getItem(item_id);
- if (item)
+ for (LLInventoryModel::item_array_t::iterator it = items.begin(); it!= items.end(); ++it)
{
- item_name = item->getName();
+ LLInventoryItem* item = it->get();
+ if (active_gestures.find(item->getUUID()) == active_gestures.end())
+ {
+ // if gesture wasn't loaded yet, we can display only name
+ addGesture(item->getUUID(), NULL, list);
+ }
}
+ }
+ // attempt to preserve scroll position through re-builds
+ // since we do re-build any time anything dirties
+ if(list->selectByValue(LLSD(selected_item)))
+ {
+ scroll->scrollToShowSelected();
+ }
+}
- std::string font_style = "NORMAL";
- // If gesture is playing, bold it
+void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gesture,LLCtrlListInterface * list )
+{
+ // Note: Can have NULL item if inventory hasn't arrived yet.
+ static std::string item_name = getString("loading");
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ if (item)
+ {
+ item_name = item->getName();
+ }
+
+ static std::string font_style = "NORMAL";
+ // If gesture is playing, bold it
- LLSD element;
- element["id"] = item_id;
+ LLSD element;
+ element["id"] = item_id;
- if (gesture)
+ if (gesture)
+ {
+ if (gesture->mPlaying)
{
- if (gesture->mPlaying)
- {
- font_style = "BOLD";
- }
+ font_style = "BOLD";
+ }
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = gesture->mTrigger;
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][0]["column"] = "trigger";
+ element["columns"][0]["value"] = gesture->mTrigger;
+ element["columns"][0]["font"]["name"] = "SANSSERIF";
+ element["columns"][0]["font"]["style"] = font_style;
- std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
- std::string buffer;
+ std::string key_string = LLKeyboard::stringFromKey(gesture->mKey);
+ std::string buffer;
- if (gesture->mKey == KEY_NONE)
- {
- buffer = "---";
- key_string = "~~~"; // alphabetize to end
- }
- else
- {
- buffer = LLKeyboard::stringFromAccelerator( gesture->mMask, gesture->mKey );
- }
+ if (gesture->mKey == KEY_NONE)
+ {
+ buffer = "---";
+ key_string = "~~~"; // alphabetize to end
+ }
+ else
+ {
+ buffer = LLKeyboard::stringFromAccelerator(gesture->mMask,
+ gesture->mKey);
+ }
- element["columns"][1]["column"] = "shortcut";
- element["columns"][1]["value"] = buffer;
- element["columns"][1]["font"]["name"] = "SANSSERIF";
- element["columns"][1]["font"]["style"] = font_style;
+ element["columns"][1]["column"] = "shortcut";
+ element["columns"][1]["value"] = buffer;
+ element["columns"][1]["font"]["name"] = "SANSSERIF";
+ element["columns"][1]["font"]["style"] = font_style;
- // hidden column for sorting
- element["columns"][2]["column"] = "key";
- element["columns"][2]["value"] = key_string;
- element["columns"][2]["font"]["name"] = "SANSSERIF";
- element["columns"][2]["font"]["style"] = font_style;
+ // hidden column for sorting
+ element["columns"][2]["column"] = "key";
+ element["columns"][2]["value"] = key_string;
+ element["columns"][2]["font"]["name"] = "SANSSERIF";
+ element["columns"][2]["font"]["style"] = font_style;
- // Only add "playing" if we've got the name, less confusing. JC
- if (item && gesture->mPlaying)
- {
- item_name += " " + getString("playing");
- }
- element["columns"][3]["column"] = "name";
- element["columns"][3]["value"] = item_name;
- element["columns"][3]["font"]["name"] = "SANSSERIF";
- element["columns"][3]["font"]["style"] = font_style;
- }
- else
+ // Only add "playing" if we've got the name, less confusing. JC
+ if (item && gesture->mPlaying)
{
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "---";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
- element["columns"][2]["column"] = "key";
- element["columns"][2]["value"] = "~~~";
- element["columns"][2]["font"]["name"] = "SANSSERIF";
- element["columns"][2]["font"]["style"] = font_style;
- element["columns"][3]["column"] = "name";
- element["columns"][3]["value"] = item_name;
- element["columns"][3]["font"]["name"] = "SANSSERIF";
- element["columns"][3]["font"]["style"] = font_style;
+ item_name += " " + getString("playing");
}
- list->addElement(element, ADD_BOTTOM);
+ element["columns"][3]["column"] = "name";
+ element["columns"][3]["value"] = item_name;
+ element["columns"][3]["font"]["name"] = "SANSSERIF";
+ element["columns"][3]["font"]["style"] = font_style;
}
-
- scroll->setScrollPos(current_scroll_pos);
+ else
+ {
+ element["columns"][0]["column"] = "trigger";
+ element["columns"][0]["value"] = "";
+ element["columns"][0]["font"]["name"] = "SANSSERIF";
+ element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][0]["column"] = "trigger";
+ element["columns"][0]["value"] = "---";
+ element["columns"][0]["font"]["name"] = "SANSSERIF";
+ element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][2]["column"] = "key";
+ element["columns"][2]["value"] = "~~~";
+ element["columns"][2]["font"]["name"] = "SANSSERIF";
+ element["columns"][2]["font"]["style"] = font_style;
+ element["columns"][3]["column"] = "name";
+ element["columns"][3]["value"] = item_name;
+ element["columns"][3]["font"]["name"] = "SANSSERIF";
+ element["columns"][3]["font"]["style"] = font_style;
+ }
+ list->addElement(element, ADD_BOTTOM);
}
void LLFloaterGesture::onClickInventory()
@@ -284,14 +361,21 @@ void LLFloaterGesture::onClickPlay()
LLCtrlListInterface *list = childGetListInterface("gesture_list");
if (!list) return;
const LLUUID& item_id = list->getCurrentID();
+ if(item_id.isNull()) return;
- if (LLGestureManager::instance().isGesturePlaying(item_id))
+ LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
+ if(!LLGestureManager::instance().isGestureActive(item_id))
{
- LLGestureManager::instance().stopGesture(item_id);
+ // we need to inform server about gesture activating to be consistent with LLPreviewGesture.
+ BOOL inform_server = TRUE;
+ BOOL deactivate_similar = FALSE;
+ LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
+ LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
}
else
{
- LLGestureManager::instance().playGesture(item_id);
+ playGesture(item_id);
}
}
@@ -345,3 +429,14 @@ void LLFloaterGesture::onCommitList()
childSetVisible("stop_btn", false);
}
}
+void LLFloaterGesture::playGesture(LLUUID item_id)
+{
+ if (LLGestureManager::instance().isGesturePlaying(item_id))
+ {
+ LLGestureManager::instance().stopGesture(item_id);
+ }
+ else
+ {
+ LLGestureManager::instance().playGesture(item_id);
+ }
+}
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 9c1ab27cb0..e7819d2a03 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -38,7 +38,8 @@
#define LL_LLFLOATERGESTURE_H
#include "llfloater.h"
-
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lldarray.h"
class LLScrollContainer;
@@ -51,31 +52,35 @@ class LLGestureOptions;
class LLScrollListCtrl;
class LLFloaterGestureObserver;
class LLFloaterGestureInventoryObserver;
+class LLMultiGesture;
class LLFloaterGesture
-: public LLFloater
+: public LLFloater, LLInventoryFetchDescendentsObserver
{
+ LOG_CLASS(LLFloaterGesture);
public:
LLFloaterGesture(const LLSD& key);
virtual ~LLFloaterGesture();
virtual BOOL postBuild();
-
+ virtual void done ();
void refreshAll();
protected:
// Reads from the gesture manager's list of active gestures
// and puts them in this list.
void buildGestureList();
-
+ void addGesture(const LLUUID& item_id, LLMultiGesture* gesture, LLCtrlListInterface * list);
void onClickInventory();
void onClickEdit();
void onClickPlay();
void onClickNew();
void onCommitList();
+ void playGesture(LLUUID item_id);
protected:
LLUUID mSelectedID;
+ LLUUID mGestureFolderID;
LLFloaterGestureObserver* mObserver;
};
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index 928126bff9..e0d4a59d9d 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -44,6 +44,7 @@
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llavataractions.h"
+#include "llinventoryobserver.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
//#include "llspinctrl.h"
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index ca2cdffcf8..e2df2ffdf7 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -124,9 +124,19 @@ void LLFloaterSearch::search(const LLSD &key)
url += "&p=" + search_token.asString();
// also append the user's preferred maturity (can be changed via prefs)
- std::string maturity = "pg";
- if (gAgent.prefersMature()) maturity += ",mature";
- if (gAgent.prefersAdult()) maturity += ",adult";
+ std::string maturity;
+ if (gAgent.prefersAdult())
+ {
+ maturity = "42"; // PG,Mature,Adult
+ }
+ else if (gAgent.prefersMature())
+ {
+ maturity = "21"; // PG,Mature
+ }
+ else
+ {
+ maturity = "13"; // PG
+ }
url += "&r=" + maturity;
// and load the URL in the web view
diff --git a/indra/newview/llfloatertestinspectors.cpp b/indra/newview/llfloatertestinspectors.cpp
index 8af011c17a..09996b0b92 100644
--- a/indra/newview/llfloatertestinspectors.cpp
+++ b/indra/newview/llfloatertestinspectors.cpp
@@ -53,6 +53,9 @@ LLFloaterTestInspectors::~LLFloaterTestInspectors()
BOOL LLFloaterTestInspectors::postBuild()
{
+ // Test the dummy widget construction code
+ getChild<LLUICtrl>("intentionally-not-found")->setEnabled(true);
+
// getChild<LLUICtrl>("avatar_2d_btn")->setCommitCallback(
// boost::bind(&LLFloaterTestInspectors::onClickAvatar2D, this));
getChild<LLUICtrl>("avatar_3d_btn")->setCommitCallback(
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 3c3dfb760e..9854d2594b 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -422,10 +422,17 @@ void LLFloaterTools::refresh()
LLResMgr::getInstance()->getIntegerString(prim_count_string, LLSelectMgr::getInstance()->getSelection()->getObjectCount());
childSetTextArg("prim_count", "[COUNT]", prim_count_string);
+ // calculate selection rendering cost
+ std::string prim_cost_string;
+ LLResMgr::getInstance()->getIntegerString(prim_cost_string, calcRenderCost());
+ childSetTextArg("RenderingCost", "[COUNT]", prim_cost_string);
+
+
// disable the object and prim counts if nothing selected
bool have_selection = ! LLSelectMgr::getInstance()->getSelection()->isEmpty();
childSetEnabled("obj_count", have_selection);
childSetEnabled("prim_count", have_selection);
+ childSetEnabled("RenderingCost", have_selection);
// Refresh child tabs
mPanelPermissions->refresh();
@@ -556,6 +563,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnEdit ->setToggleState( edit_visible );
mRadioGroupEdit->setVisible( edit_visible );
+ childSetVisible("RenderingCost", edit_visible || focus_visible || move_visible);
if (mCheckSelectIndividual)
{
@@ -964,6 +972,27 @@ void LLFloaterTools::onClickGridOptions()
//floaterp->addDependentFloater(LLFloaterBuildOptions::getInstance(), FALSE);
}
+S32 LLFloaterTools::calcRenderCost()
+{
+ S32 cost = 0;
+ for (LLObjectSelection::iterator selection_iter = LLSelectMgr::getInstance()->getSelection()->begin();
+ selection_iter != LLSelectMgr::getInstance()->getSelection()->end();
+ ++selection_iter)
+ {
+ LLSelectNode *select_node = *selection_iter;
+ if (select_node)
+ {
+ LLVOVolume *viewer_volume = (LLVOVolume*)select_node->getObject();
+ if (viewer_volume)
+ {
+ cost += viewer_volume->getRenderCost();
+ }
+ }
+ }
+
+ return cost;
+}
+
// static
void LLFloaterTools::setEditTool(void* tool_pointer)
{
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index a3e0cac034..05a88a31d3 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -121,6 +121,7 @@ private:
static bool multipleFacesSelectedConfirm(const LLSD& notification, const LLSD& response);
static void setObjectType( LLPCode pcode );
void onClickGridOptions();
+ S32 calcRenderCost();
public:
LLButton *mBtnFocus;
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index 7d2eb98111..85847e5fce 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -51,6 +51,7 @@
#include "llfloaterreg.h" // getTypedInstance()
#include "llfocusmgr.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllandmarklist.h"
#include "lllineeditor.h"
#include "llregionhandle.h"
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 21458f83cd..4192c6a586 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -909,11 +909,7 @@ void LLFolderView::finishRenamingItem( void )
mRenameItem->rename( mRenamer->getText() );
}
- mRenamer->setCommitOnFocusLost( FALSE );
- mRenamer->setFocus( FALSE );
- mRenamer->setVisible( FALSE );
- mRenamer->setCommitOnFocusLost( TRUE );
- gFocusMgr.setTopCtrl( NULL );
+ gFocusMgr.setTopCtrl( NULL );
if( mRenameItem )
{
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index 60ece75cea..473d0be912 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -34,6 +34,8 @@
#include "lldarray.h" // JAMESDEBUG convert to std::vector
#include "llfoldertype.h"
#include "llfontgl.h" // just for StyleFlags enum
+#include "llinventorytype.h"
+#include "llpermissionsflags.h"
#include "llpointer.h"
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 6fdaefd21a..d39a17ca3b 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -38,7 +38,6 @@
#include "llfoldervieweventlistener.h"
#include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator()
#include "llinventoryfilter.h"
-#include "llinventorymodel.h" // *TODO: make it take a pointer to an inventory-model interface
#include "llviewercontrol.h" // gSavedSettings
#include "llviewerwindow.h" // Argh, only for setCursor()
@@ -388,7 +387,9 @@ BOOL LLFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* roo
// makes sure that this view and it's children are the right size.
S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
{
- mIndentation = mParentFolder ? mParentFolder->getIndentation() + LEFT_INDENTATION : 0;
+ mIndentation = getParentFolder() && getParentFolder()->getParentFolder()
+ ? mParentFolder->getIndentation() + LEFT_INDENTATION
+ : 0;
if (mLabelWidthDirty)
{
mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mSearchableLabel);
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 62a4b9a187..7c429fc76e 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -110,7 +110,7 @@ public:
// layout constants
static const S32 LEFT_PAD = 5;
- static const S32 LEFT_INDENTATION = 13;
+ static const S32 LEFT_INDENTATION = 8;
static const S32 ICON_PAD = 2;
static const S32 ICON_WIDTH = 16;
static const S32 TEXT_PAD = 1;
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index 1ff2566dca..ac060cef15 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llinventory.h"
+#include "llinventoryobserver.h"
#include "lltrans.h"
#include "llfriendcard.h"
@@ -43,27 +44,24 @@
// Constants;
-static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends";
-static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All";
+static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends";
+static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All";
// helper functions
-/*
-mantipov *NOTE: unable to use
-LLTrans::getString("InvFolder Friends"); or
-LLTrans::getString("InvFolder FriendsAll");
-in next two functions to set localized folders' names because of there is a hack in the
-LLFolderViewItem::refreshFromListener() method for protected asset types.
-So, localized names will be got from the strings with "InvFolder LABEL_NAME" in the strings.xml
-*/
-inline const std::string& get_friend_folder_name()
+// NOTE: Usage of LLTrans::getString(); in next two functions to set localized
+// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener()
+// method for protected asset types.
+// So, localized names will be got from the strings with "InvFolder LABEL_NAME"
+// in the strings.xml
+inline const std::string get_friend_folder_name()
{
- return INVENTORY_STRING_FRIENDS_SUBFOLDER;
+ return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER);
}
-inline const std::string& get_friend_all_subfolder_name()
+inline const std::string get_friend_all_subfolder_name()
{
- return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER;
+ return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER);
}
void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to)
@@ -80,55 +78,55 @@ const LLUUID& get_folder_uuid(const LLUUID& parentFolderUUID, LLInventoryCollect
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendentsIf(parentFolderUUID, cats, items,
+ gInventory.collectDescendentsIf(parentFolderUUID, cats, items,
LLInventoryModel::EXCLUDE_TRASH, matchFunctor);
- if (cats.count() == 1)
+ S32 cats_count = cats.count();
+
+ if (cats_count > 1)
{
- return cats.get(0)->getUUID();
+ LL_WARNS("LLFriendCardsManager")
+ << "There is more than one Friend card folder."
+ << "The first folder will be used."
+ << LL_ENDL;
}
- return LLUUID::null;
+ return (cats_count >= 1) ? cats.get(0)->getUUID() : LLUUID::null;
}
-
-// LLViewerInventoryCategory::fetchDescendents has it own period of fetching.
-// for now it is FETCH_TIMER_EXPIRY = 10.0f; So made our period a bit more.
-const F32 FETCH_FRIENDS_DESCENDENTS_PERIOD = 11.0f;
-
-
/**
- * Intended to call passed callback after the specified period of time.
+ * Class for fetching initial friend cards data
*
- * Implemented to fix an issue when Inventory folders are in incomplete state. See EXT-2061, EXT-1935, EXT-813.
- * For now it uses to periodically sync Inventory Friends/All folder with a Agent's Friends List
- * until it is complete.
- */
-class FriendListUpdater : public LLEventTimer
+ * Implemented to fix an issue when Inventory folders are in incomplete state.
+ * See EXT-2320, EXT-2061, EXT-1935, EXT-813.
+ * Uses a callback to sync Inventory Friends/All folder with agent's Friends List.
+ */
+class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver
{
public:
- typedef boost::function<bool()> callback_t;
+ typedef boost::function<void()> callback_t;
- FriendListUpdater(callback_t cb, F32 period)
- : LLEventTimer(period)
- , mCallback(cb)
- {
- mEventTimer.start();
- }
+ LLInitialFriendCardsFetch(callback_t cb)
+ : mCheckFolderCallback(cb) {}
- virtual BOOL tick() // from LLEventTimer
- {
- return mCallback();
- }
+ /* virtual */ void done();
private:
- callback_t mCallback;
+ callback_t mCheckFolderCallback;
};
+void LLInitialFriendCardsFetch::done()
+{
+ // This observer is no longer needed.
+ gInventory.removeObserver(this);
+
+ mCheckFolderCallback();
+
+ delete this;
+}
// LLFriendCardsManager Constructor / Destructor
LLFriendCardsManager::LLFriendCardsManager()
-: mFriendsAllFolderCompleted(true)
{
LLAvatarTracker::instance().addObserver(this);
}
@@ -167,30 +165,6 @@ const LLUUID LLFriendCardsManager::extractAvatarID(const LLUUID& avatarID)
return rv;
}
-// be sure LLInventoryModel::buildParentChildMap() has been called before it.
-// and this method must be called before any actions with friend list
-void LLFriendCardsManager::ensureFriendFoldersExist()
-{
- const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
-
- LLUUID friendFolderUUID = findFriendFolderUUIDImpl();
-
- if (friendFolderUUID.isNull())
- {
- friendFolderUUID = gInventory.createNewCategory(callingCardsFolderID,
- LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
- }
-
- LLUUID friendAllSubfolderUUID = findFriendAllSubfolderUUIDImpl();
-
- if (friendAllSubfolderUUID.isNull())
- {
- friendAllSubfolderUUID = gInventory.createNewCategory(friendFolderUUID,
- LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
- }
-}
-
-
bool LLFriendCardsManager::isItemInAnyFriendsList(const LLViewerInventoryItem* item)
{
if (item->getType() != LLAssetType::AT_CALLINGCARD)
@@ -305,63 +279,12 @@ bool LLFriendCardsManager::isAnyFriendCategory(const LLUUID& catID) const
return TRUE == gInventory.isObjectDescendentOf(catID, friendFolderID);
}
-bool LLFriendCardsManager::syncFriendsFolder()
+void LLFriendCardsManager::syncFriendCardsFolders()
{
- //lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" if they are absent
- LLFriendCardsManager::instance().ensureFriendFoldersExist();
-
- LLAvatarTracker::buddy_map_t all_buddies;
- LLAvatarTracker::instance().copyBuddyList(all_buddies);
-
- // 1. Remove Friend Cards for non-friends
- LLInventoryModel::cat_array_t cats;
- LLInventoryModel::item_array_t items;
-
- gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
-
- LLInventoryModel::item_array_t::const_iterator it;
- for (it = items.begin(); it != items.end(); ++it)
- {
- lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
- if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
- {
- lldebugs << "NONEXISTS, so remove it" << llendl;
- removeFriendCardFromInventory((*it)->getCreatorUUID());
- }
- }
-
- // 2. Add missing Friend Cards for friends
- LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
- llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
- mFriendsAllFolderCompleted = true;
- for(; buddy_it != all_buddies.end(); ++buddy_it)
- {
- const LLUUID& buddy_id = (*buddy_it).first;
- addFriendCardToInventory(buddy_id);
- }
-
- if (!mFriendsAllFolderCompleted)
- {
- forceFriendListIsLoaded(findFriendAllSubfolderUUIDImpl());
-
- static bool timer_started = false;
- if (!timer_started)
- {
- lldebugs << "Create and start timer to sync Inventory Friends All folder with Friends list" << llendl;
-
- // do not worry about destruction of the FriendListUpdater.
- // It will be deleted by LLEventTimer::updateClass when FriendListUpdater::tick() returns true.
- new FriendListUpdater(boost::bind(&LLFriendCardsManager::syncFriendsFolder, this),
- FETCH_FRIENDS_DESCENDENTS_PERIOD);
- }
- timer_started = true;
- }
- else
- {
- lldebugs << "Friends/All Inventory folder is synchronized with the Agent's Friends List" << llendl;
- }
+ const LLUUID callingCardsFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
- return mFriendsAllFolderCompleted;
+ fetchAndCheckFolderDescendents(callingCardsFolderID,
+ boost::bind(&LLFriendCardsManager::ensureFriendsFolderExists, this));
}
void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const
@@ -427,13 +350,8 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);
}
-const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const
+const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const
{
- // mantipov *HACK: get localaized name in the same way like in the LLFolderViewItem::refreshFromListener() method.
- // be sure these both methods are synchronized.
- // see also get_friend_folder_name() and get_friend_all_subfolder_name() functions
- std::string localizedName = LLTrans::getString("InvFolder " + folderLabel);
-
LLNameCategoryCollector matchFolderFunctor(localizedName);
return get_folder_uuid(parentFolderUUID, matchFolderFunctor);
@@ -482,6 +400,122 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve
}
}
+void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb)
+{
+ // This instance will be deleted in LLInitialFriendCardsFetch::done().
+ LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb);
+
+ LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ folders.push_back(folder_id);
+
+ fetch->fetchDescendents(folders);
+ if(fetch->isEverythingComplete())
+ {
+ // everything is already here - call done.
+ fetch->done();
+ }
+ else
+ {
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(fetch);
+ }
+}
+
+// Make sure LLInventoryModel::buildParentChildMap() has been called before it.
+// This method must be called before any actions with friends list.
+void LLFriendCardsManager::ensureFriendsFolderExists()
+{
+ const LLUUID calling_cards_folder_ID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
+
+ // If "Friends" folder exists in "Calling Cards" we should check if "All" sub-folder
+ // exists in "Friends", otherwise we create it.
+ LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+ if (friends_folder_ID.notNull())
+ {
+ fetchAndCheckFolderDescendents(friends_folder_ID,
+ boost::bind(&LLFriendCardsManager::ensureFriendsAllFolderExists, this));
+ }
+ else
+ {
+ if (!gInventory.isCategoryComplete(calling_cards_folder_ID))
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(calling_cards_folder_ID);
+ std::string cat_name = cat ? cat->getName() : "unknown";
+ llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+ }
+
+ friends_folder_ID = gInventory.createNewCategory(calling_cards_folder_ID,
+ LLFolderType::FT_CALLINGCARD, get_friend_folder_name());
+
+ gInventory.createNewCategory(friends_folder_ID,
+ LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+ // Now when we have all needed folders we can sync their contents with buddies list.
+ syncFriendsFolder();
+ }
+}
+
+// Make sure LLFriendCardsManager::ensureFriendsFolderExists() has been called before it.
+void LLFriendCardsManager::ensureFriendsAllFolderExists()
+{
+ LLUUID friends_all_folder_ID = findFriendAllSubfolderUUIDImpl();
+ if (friends_all_folder_ID.notNull())
+ {
+ fetchAndCheckFolderDescendents(friends_all_folder_ID,
+ boost::bind(&LLFriendCardsManager::syncFriendsFolder, this));
+ }
+ else
+ {
+ LLUUID friends_folder_ID = findFriendFolderUUIDImpl();
+
+ if (!gInventory.isCategoryComplete(friends_folder_ID))
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(friends_folder_ID);
+ std::string cat_name = cat ? cat->getName() : "unknown";
+ llwarns << "Failed to find \"" << cat_name << "\" category descendents in Category Tree." << llendl;
+ }
+
+ friends_all_folder_ID = gInventory.createNewCategory(friends_folder_ID,
+ LLFolderType::FT_CALLINGCARD, get_friend_all_subfolder_name());
+
+ // Now when we have all needed folders we can sync their contents with buddies list.
+ syncFriendsFolder();
+ }
+}
+
+void LLFriendCardsManager::syncFriendsFolder()
+{
+ LLAvatarTracker::buddy_map_t all_buddies;
+ LLAvatarTracker::instance().copyBuddyList(all_buddies);
+
+ // 1. Remove Friend Cards for non-friends
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+
+ gInventory.collectDescendents(findFriendAllSubfolderUUIDImpl(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+
+ LLInventoryModel::item_array_t::const_iterator it;
+ for (it = items.begin(); it != items.end(); ++it)
+ {
+ lldebugs << "Check if buddy is in list: " << (*it)->getName() << " " << (*it)->getCreatorUUID() << llendl;
+ if (NULL == get_ptr_in_map(all_buddies, (*it)->getCreatorUUID()))
+ {
+ lldebugs << "NONEXISTS, so remove it" << llendl;
+ removeFriendCardFromInventory((*it)->getCreatorUUID());
+ }
+ }
+
+ // 2. Add missing Friend Cards for friends
+ LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
+ llinfos << "try to build friends, count: " << all_buddies.size() << llendl;
+ for(; buddy_it != all_buddies.end(); ++buddy_it)
+ {
+ const LLUUID& buddy_id = (*buddy_it).first;
+ addFriendCardToInventory(buddy_id);
+ }
+}
+
class CreateFriendCardCallback : public LLInventoryCallback
{
public:
@@ -494,9 +528,8 @@ public:
}
};
-bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
+void LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
{
- LLInventoryModel* invModel = &gInventory;
bool shouldBeAdded = true;
std::string name;
@@ -518,13 +551,6 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
lldebugs << "is found in sentRequests: " << name << llendl;
}
- LLUUID friendListFolderID = findFriendAllSubfolderUUIDImpl();
- if (friendListFolderID.notNull() && shouldBeAdded && !invModel->isCategoryComplete(friendListFolderID))
- {
- mFriendsAllFolderCompleted = false;
- shouldBeAdded = false;
- lldebugs << "Friends/All category is not completed" << llendl;
- }
if (shouldBeAdded)
{
putAvatarData(avatarID);
@@ -533,10 +559,8 @@ bool LLFriendCardsManager::addFriendCardToInventory(const LLUUID& avatarID)
// TODO: mantipov: Is CreateFriendCardCallback really needed? Probably not
LLPointer<LLInventoryCallback> cb = new CreateFriendCardCallback();
- create_inventory_callingcard(avatarID, friendListFolderID, cb);
+ create_inventory_callingcard(avatarID, findFriendAllSubfolderUUIDImpl(), cb);
}
-
- return shouldBeAdded;
}
void LLFriendCardsManager::removeFriendCardFromInventory(const LLUUID& avatarID)
@@ -582,11 +606,4 @@ void LLFriendCardsManager::onFriendListUpdate(U32 changed_mask)
}
}
-void LLFriendCardsManager::forceFriendListIsLoaded(const LLUUID& folder_id) const
-{
- bool fetching_inventory = gInventory.fetchDescendentsOf(folder_id);
- lldebugs << "Trying to fetch descendants of Friends/All Inventory folder, fetched: "
- << fetching_inventory << llendl;
-}
-
// EOF
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index feea05bc1d..b94d5ec2c0 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -58,14 +58,6 @@ public:
}
/**
- * Ensures that all necessary folders are created in Inventory.
- *
- * For now it processes Calling Card, Calling Card/Friends & Calling Card/Friends/All folders
- */
- void ensureFriendFoldersExist();
-
-
- /**
* Determines if specified Inventory Calling Card exists in any of lists
* in the Calling Card/Friends/ folder (Default, or Custom)
*/
@@ -88,11 +80,10 @@ public:
bool isAnyFriendCategory(const LLUUID& catID) const;
/**
- * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
- *
- * @return true - if folder is already synchronized, false otherwise.
+ * Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" category
+ * (creates them otherwise) and fetches their contents to synchronize with Agent's Friends List.
*/
- bool syncFriendsFolder();
+ void syncFriendCardsFolders();
/*!
* \brief
@@ -108,6 +99,8 @@ public:
void collectFriendsLists(folderid_buddies_map_t& folderBuddiesMap) const;
private:
+ typedef boost::function<void()> callback_t;
+
LLFriendCardsManager();
~LLFriendCardsManager();
@@ -127,16 +120,35 @@ private:
return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));
}
- const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& folderLabel) const;
+ const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const;
const LLUUID& findFriendFolderUUIDImpl() const;
const LLUUID& findFriendAllSubfolderUUIDImpl() const;
const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
void findMatchedFriendCards(const LLUUID& avatarID, LLInventoryModel::item_array_t& items) const;
+ void fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb);
+
+ /**
+ * Checks whether "Calling Cards/Friends" folder exists. If not, creates it with "All"
+ * sub-folder and synchronizes its contents with buddies list.
+ */
+ void ensureFriendsFolderExists();
+
+ /**
+ * Checks whether "Calling Cards/Friends/All" folder exists. If not, creates it and
+ * synchronizes its contents with buddies list.
+ */
+ void ensureFriendsAllFolderExists();
+
+ /**
+ * Synchronizes content of the Calling Card/Friends/All Global Inventory folder with Agent's Friend List
+ */
+ void syncFriendsFolder();
+
/**
* Adds avatar specified by its UUID into the Calling Card/Friends/All Global Inventory folder
*/
- bool addFriendCardToInventory(const LLUUID& avatarID);
+ void addFriendCardToInventory(const LLUUID& avatarID);
/**
* Removes an avatar specified by its UUID from the Calling Card/Friends/All Global Inventory folder
@@ -146,20 +158,11 @@ private:
void onFriendListUpdate(U32 changed_mask);
- /**
- * Force fetching of the Inventory folder specified by passed folder's LLUUID.
- *
- * It only sends request to server, server reply should be processed in other place.
- * Because request can be sent via UDP we need to periodically check if request was completed with success.
- */
- void forceFriendListIsLoaded(const LLUUID& folder_id) const;
-
private:
typedef std::set<LLUUID> avatar_uuid_set_t;
avatar_uuid_set_t mBuddyIDSet;
- bool mFriendsAllFolderCompleted;
};
#endif // LL_LLFRIENDCARD_H
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 59274c8638..8e774dc199 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -37,7 +37,6 @@
// system
#include <functional>
#include <algorithm>
-#include <boost/tokenizer.hpp>
// library
#include "lldatapacker.h"
@@ -206,6 +205,9 @@ struct LLLoadInfo
// If inform_server is true, will send a message upstream to update
// the user_gesture_active table.
+/**
+ * It will load a gesture from remote storage
+ */
void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
const LLUUID& asset_id,
BOOL inform_server,
@@ -921,8 +923,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
delete info;
info = NULL;
-
- LLGestureManager::instance().mLoadingCount--;
+ LLGestureManager& self = LLGestureManager::instance();
+ self.mLoadingCount--;
if (0 == status)
{
@@ -944,15 +946,15 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
{
if (deactivate_similar)
{
- LLGestureManager::instance().deactivateSimilarGestures(gesture, item_id);
+ self.deactivateSimilarGestures(gesture, item_id);
// Display deactivation message if this was the last of the bunch.
- if (LLGestureManager::instance().mLoadingCount == 0
- && LLGestureManager::instance().mDeactivateSimilarNames.length() > 0)
+ if (self.mLoadingCount == 0
+ && self.mDeactivateSimilarNames.length() > 0)
{
// we're done with this set of deactivations
LLSD args;
- args["NAMES"] = LLGestureManager::instance().mDeactivateSimilarNames;
+ args["NAMES"] = self.mDeactivateSimilarNames;
LLNotifications::instance().add("DeactivatedGesturesTrigger", args);
}
}
@@ -965,9 +967,9 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
else
{
// Watch this item and set gesture name when item exists in inventory
- LLGestureManager::instance().watchItem(item_id);
+ self.watchItem(item_id);
}
- LLGestureManager::instance().mActive[item_id] = gesture;
+ self.mActive[item_id] = gesture;
// Everything has been successful. Add to the active list.
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
@@ -989,14 +991,21 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
gAgent.sendReliableMessage();
}
+ callback_map_t::iterator i_cb = self.mCallbackMap.find(item_id);
+
+ if(i_cb != self.mCallbackMap.end())
+ {
+ i_cb->second(gesture);
+ self.mCallbackMap.erase(i_cb);
+ }
- LLGestureManager::instance().notifyObservers();
+ self.notifyObservers();
}
else
{
llwarns << "Unable to load gesture" << llendl;
- LLGestureManager::instance().mActive.erase(item_id);
+ self.mActive.erase(item_id);
delete gesture;
gesture = NULL;
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 947773d66d..094ca13798 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -38,7 +38,7 @@
#include <vector>
#include "llassetstorage.h" // LLAssetType
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llsingleton.h"
#include "llviewerinventory.h"
@@ -57,6 +57,12 @@ public:
class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryCompletionObserver
{
public:
+
+ typedef boost::function<void (LLMultiGesture* loaded_gesture)> gesture_loaded_callback_t;
+ // Maps inventory item_id to gesture
+ typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
+ typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
+
LLGestureManager();
~LLGestureManager();
@@ -97,6 +103,7 @@ public:
BOOL isGesturePlaying(const LLUUID& item_id);
+ const item_map_t& getActiveGestures() const { return mActive; }
// Force a gesture to be played, for example, if it is being
// previewed.
void playGesture(LLMultiGesture* gesture);
@@ -106,7 +113,15 @@ public:
// Also remove from playing list
void stopGesture(LLMultiGesture* gesture);
void stopGesture(const LLUUID& item_id);
-
+ /**
+ * Add cb into callbackMap.
+ * Note:
+ * Manager will call cb after gesture will be loaded and will remove cb automatically.
+ */
+ void setGestureLoadedCallback(LLUUID inv_item_id, gesture_loaded_callback_t cb)
+ {
+ mCallbackMap[inv_item_id] = cb;
+ }
// Trigger the first gesture that matches this key.
// Returns TRUE if it finds a gesture bound to that key.
BOOL triggerGesture(KEY key, MASK mask);
@@ -144,13 +159,7 @@ protected:
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status);
-public:
- BOOL mValid;
- std::vector<LLMultiGesture*> mPlaying;
-
- // Maps inventory item_id to gesture
- typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
-
+private:
// Active gestures.
// NOTE: The gesture pointer CAN BE NULL. This means that
// there is a gesture with that item_id, but the asset data
@@ -159,8 +168,11 @@ public:
S32 mLoadingCount;
std::string mDeactivateSimilarNames;
-
+
std::vector<LLGestureManagerObserver*> mObservers;
+ callback_map_t mCallbackMap;
+ std::vector<LLMultiGesture*> mPlaying;
+ BOOL mValid;
};
#endif
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 5a2331aa06..e3121fbc7a 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -120,11 +120,7 @@ void LLIMFloater::newIMCallback(const LLSD& data){
LLUUID session_id = data["session_id"].asUUID();
LLIMFloater* floater = LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
- if (floater == NULL)
- {
- llwarns << "new_im_callback for non-existent session_id " << session_id << llendl;
- return;
- }
+ if (floater == NULL) return;
// update if visible, otherwise will be updated when opened
if (floater->getVisible())
@@ -211,6 +207,7 @@ BOOL LLIMFloater::postBuild()
}
mControlPanel->setSessionId(mSessionID);
+ mControlPanel->setVisible(gSavedSettings.getBOOL("IMShowControlPanel"));
LLButton* slide_left = getChild<LLButton>("slide_left_btn");
slide_left->setVisible(mControlPanel->getVisible());
@@ -356,8 +353,6 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
LLDockControl::TOP, boost::bind(&LLIMFloater::getAllowedRect, floater, _1)));
}
- floater->childSetVisible("panel_im_control_panel", gSavedSettings.getBOOL("IMShowControlPanel"));
-
return floater;
}
@@ -463,7 +458,7 @@ void LLIMFloater::updateMessages()
if (messages.size())
{
- LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
+// LLUIColor chat_color = LLUIColorTable::instance().getColor("IMChatColor");
std::ostringstream message;
std::list<LLSD>::const_reverse_iterator iter = messages.rbegin();
@@ -476,14 +471,13 @@ void LLIMFloater::updateMessages()
LLUUID from_id = msg["from_id"].asUUID();
std::string from = from_id != gAgentID ? msg["from"].asString() : LLTrans::getString("You");
std::string message = msg["message"].asString();
- LLStyle::Params style_params;
- style_params.color(chat_color);
- LLChat chat(message);
+ LLChat chat;
chat.mFromID = from_id;
chat.mFromName = from;
+ chat.mText = message;
- mChatHistory->appendWidgetMessage(chat, style_params);
+ mChatHistory->appendWidgetMessage(chat);
mLastMessageIndex = msg["index"].asInteger();
}
@@ -499,7 +493,7 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
LLIMModel::LLIMSession* im_session =
LLIMModel::instance().findIMSession(self->mSessionID);
//TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK)
- if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getEnabled())
+ if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled())
{
//in disconnected state IM input editor should be disabled
self->mInputEditor->setEnabled(!gDisconnected);
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 0b8b5935f8..87b801d73b 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -848,8 +848,11 @@ void LLFloaterIMPanel::processSessionUpdate(const LLSD& session_update)
}
- //update the speakers dropdown too
- mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+ //update the speakers dropdown too, if it's available
+ if (mSpeakerPanel)
+ {
+ mSpeakerPanel->setVoiceModerationCtrlMode(voice_moderated);
+ }
}
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 14f94d5a88..dc32291714 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -46,6 +46,7 @@
#include "llagent.h"
#include "llavatariconctrl.h"
+#include "llbottomtray.h"
#include "llcallingcard.h"
#include "llchat.h"
#include "llresmgr.h"
@@ -73,6 +74,7 @@
#include "llvoicechannel.h"
#include "lltrans.h"
#include "llrecentpeople.h"
+#include "llsyswellwindow.h"
#include "llfirstuse.h"
#include "llagentui.h"
@@ -439,8 +441,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
addToHistory(session_id, from, from_id, utf8_text);
if (log2file) logToFile(session_id, from, from_id, utf8_text);
- //we do not count system messages
- if (from_id.notNull()) session->mNumUnread++;
+ session->mNumUnread++;
// notify listeners
LLSD arg;
@@ -651,22 +652,10 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
//local echo for the legacy communicate panel
std::string history_echo;
- std::string utf8_copy = utf8_text;
LLAgentUI::buildFullname(history_echo);
- // Look for IRC-style emotes here.
+ history_echo += ": " + utf8_text;
- std::string prefix = utf8_copy.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
- utf8_copy.replace(0,3,"");
- }
- else
- {
- history_echo += ": ";
- }
- history_echo += utf8_copy;
-
LLFloaterIMPanel* floater = gIMMgr->findFloaterBySession(im_session_id);
if (floater) floater->addHistoryLine(history_echo, LLUIColorTable::instance().getColor("IMChatColor"), true, gAgent.getID());
@@ -1100,16 +1089,91 @@ LLIMMgr::onConfirmForceCloseError(
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLOutgoingCallDialog
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
+ LLDockableFloater(NULL, false, payload),
+ mPayload(payload)
+{
+}
+
+void LLOutgoingCallDialog::getAllowedRect(LLRect& rect)
+{
+ rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLOutgoingCallDialog::onOpen(const LLSD& key)
+{
+ // tell the user which voice channel they are leaving
+ if (!mPayload["old_channel_name"].asString().empty())
+ {
+ childSetTextArg("leaving", "[CURRENT_CHAT]", mPayload["old_channel_name"].asString());
+ }
+ else
+ {
+ childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
+ }
+
+ std::string callee_name = mPayload["session_name"].asString();
+ if (callee_name == "anonymous")
+ {
+ callee_name = getString("anonymous");
+ }
+
+ setTitle(callee_name);
+
+ LLSD callee_id = mPayload["other_user_id"];
+ childSetTextArg("calling", "[CALLEE_NAME]", callee_name);
+ childSetTextArg("connecting", "[CALLEE_NAME]", callee_name);
+ LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
+ icon->setValue(callee_id);
+}
+
+
+//static
+void LLOutgoingCallDialog::onCancel(void* user_data)
+{
+ LLOutgoingCallDialog* self = (LLOutgoingCallDialog*)user_data;
+
+ if (!gIMMgr)
+ return;
+
+ LLUUID session_id = self->mPayload["session_id"].asUUID();
+ gIMMgr->endCall(session_id);
+
+ self->closeFloater();
+}
+
+
+BOOL LLOutgoingCallDialog::postBuild()
+{
+ BOOL success = LLDockableFloater::postBuild();
+
+ childSetAction("Cancel", onCancel, this);
+
+ // dock the dialog to the sys well, where other sys messages appear
+ setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+ this, getDockTongue(), LLDockControl::TOP,
+ boost::bind(&LLOutgoingCallDialog::getAllowedRect, this, _1)));
+
+ return success;
+}
+
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLIncomingCallDialog
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LLIncomingCallDialog::LLIncomingCallDialog(const LLSD& payload) :
- LLModalDialog(payload),
+ LLDockableFloater(NULL, false, payload),
mPayload(payload)
{
}
BOOL LLIncomingCallDialog::postBuild()
{
+ LLDockableFloater::postBuild();
+
LLSD caller_id = mPayload["caller_id"];
EInstantMessage type = (EInstantMessage)mPayload["type"].asInteger();
@@ -1128,6 +1192,11 @@ BOOL LLIncomingCallDialog::postBuild()
call_type = getString("VoiceInviteAdHoc");
}
+ // check to see if this is an Avaline call
+ LLUUID session_id = mPayload["session_id"].asUUID();
+ bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(session_id);
+ childSetVisible("Start IM", is_avatar); // no IM for avaline
+
LLUICtrl* caller_name_widget = getChild<LLUICtrl>("caller name");
caller_name_widget->setValue(caller_name + " " + call_type);
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
@@ -1141,6 +1210,30 @@ BOOL LLIncomingCallDialog::postBuild()
return TRUE;
}
+void LLIncomingCallDialog::getAllowedRect(LLRect& rect)
+{
+ rect = gViewerWindow->getWorldViewRectRaw();
+}
+
+void LLIncomingCallDialog::onOpen(const LLSD& key)
+{
+ // tell the user which voice channel they would be leaving
+ LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
+ if (voice && !voice->getSessionName().empty())
+ {
+ childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
+ }
+ else
+ {
+ childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
+ }
+
+ // dock the dialog to the sys well, where other sys messages appear
+ setDockControl(new LLDockControl(LLBottomTray::getInstance()->getSysWell(),
+ this, getDockTongue(), LLDockControl::TOP,
+ boost::bind(&LLIncomingCallDialog::getAllowedRect, this, _1)));
+}
+
//static
void LLIncomingCallDialog::onAccept(void* user_data)
{
@@ -2347,15 +2440,6 @@ public:
BOOL is_linden = LLMuteList::getInstance()->isLinden(name);
std::string separator_string(": ");
- int message_offset=0;
-
- //Handle IRC styled /me messages.
- std::string prefix = message.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
- separator_string = "";
- message_offset = 3;
- }
chat.mMuted = is_muted && !is_linden;
chat.mFromID = from_id;
@@ -2372,7 +2456,7 @@ public:
{
saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
}
- std::string buffer = saved + message.substr(message_offset);
+ std::string buffer = saved + message;
BOOL is_this_agent = FALSE;
if(from_id == gAgentID)
@@ -2391,7 +2475,7 @@ public:
ll_vector3_from_sd(message_params["position"]),
true);
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+ chat.mText = std::string("IM: ") + name + separator_string + saved + message;
LLFloaterChat::addChat(chat, TRUE, is_this_agent);
//K now we want to accept the invitation
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index c566b111ca..62a54bc081 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -34,9 +34,11 @@
#define LL_LLIMVIEW_H
#include "lldarray.h"
+#include "lldockablefloater.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "llimpanel.h" //for voice channels
#include "llmodaldialog.h"
+#include "lldockablefloater.h"
#include "llinstantmessage.h"
#include "lluuid.h"
#include "llmultifloater.h"
@@ -401,12 +403,13 @@ private:
LLSD mPendingAgentListUpdates;
};
-class LLIncomingCallDialog : public LLModalDialog
+class LLIncomingCallDialog : public LLDockableFloater
{
public:
LLIncomingCallDialog(const LLSD& payload);
/*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
static void onAccept(void* user_data);
static void onReject(void* user_data);
@@ -414,6 +417,23 @@ public:
private:
void processCallResponse(S32 response);
+ void getAllowedRect(LLRect& rect);
+
+ LLSD mPayload;
+};
+
+class LLOutgoingCallDialog : public LLDockableFloater
+{
+public:
+ LLOutgoingCallDialog(const LLSD& payload);
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ static void onCancel(void* user_data);
+
+private:
+ void getAllowedRect(LLRect& rect);
LLSD mPayload;
};
diff --git a/indra/newview/llinspectgroup.cpp b/indra/newview/llinspectgroup.cpp
index c78bcd6afe..7fd7b69021 100644
--- a/indra/newview/llinspectgroup.cpp
+++ b/indra/newview/llinspectgroup.cpp
@@ -216,7 +216,8 @@ void LLInspectGroup::requestUpdate()
getChild<LLUICtrl>("group_details")->setValue("");
getChild<LLUICtrl>("group_cost")->setValue("");
// Must have a visible button so the inspector can take focus
- getChild<LLUICtrl>("leave_btn")->setVisible(true);
+ getChild<LLUICtrl>("view_profile_btn")->setVisible(true);
+ getChild<LLUICtrl>("leave_btn")->setVisible(false);
getChild<LLUICtrl>("join_btn")->setVisible(false);
// Make a new request for properties
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
new file mode 100644
index 0000000000..e4d2eec242
--- /dev/null
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -0,0 +1,200 @@
+/**
+ * @file llinspectremoteobject.cpp
+ *
+ * $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 "llinspectremoteobject.h"
+#include "llinspect.h"
+#include "llslurl.h"
+#include "llmutelist.h"
+#include "llurlaction.h"
+#include "llpanelblockedlist.h"
+#include "llfloaterreg.h"
+#include "llui.h"
+#include "lluictrl.h"
+
+class LLViewerObject;
+
+//////////////////////////////////////////////////////////////////////////////
+// LLInspectRemoteObject
+//////////////////////////////////////////////////////////////////////////////
+
+// Remote Object Inspector, a small information window used to
+// display information about potentially-remote objects. Used
+// to display details about objects sending messages to the user.
+class LLInspectRemoteObject : public LLInspect
+{
+ friend class LLFloaterReg;
+
+public:
+ LLInspectRemoteObject(const LLSD& object_id);
+ virtual ~LLInspectRemoteObject() {};
+
+ /*virtual*/ BOOL postBuild(void);
+ /*virtual*/ void onOpen(const LLSD& avatar_id);
+
+ void onClickMap();
+ void onClickBlock();
+ void onClickClose();
+
+private:
+ void update();
+ static void nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data);
+
+private:
+ LLUUID mObjectID;
+ LLUUID mOwnerID;
+ std::string mOwner;
+ std::string mSLurl;
+ std::string mName;
+ bool mGroupOwned;
+};
+
+LLInspectRemoteObject::LLInspectRemoteObject(const LLSD& sd) :
+ LLInspect(LLSD()),
+ mObjectID(NULL),
+ mOwnerID(NULL),
+ mOwner(""),
+ mSLurl(""),
+ mName(""),
+ mGroupOwned(false)
+{
+}
+
+/*virtual*/
+BOOL LLInspectRemoteObject::postBuild(void)
+{
+ // hook up the inspector's buttons
+ getChild<LLUICtrl>("map_btn")->setCommitCallback(
+ boost::bind(&LLInspectRemoteObject::onClickMap, this));
+ getChild<LLUICtrl>("block_btn")->setCommitCallback(
+ boost::bind(&LLInspectRemoteObject::onClickBlock, this));
+ getChild<LLUICtrl>("close_btn")->setCommitCallback(
+ boost::bind(&LLInspectRemoteObject::onClickClose, this));
+
+ return TRUE;
+}
+
+/*virtual*/
+void LLInspectRemoteObject::onOpen(const LLSD& data)
+{
+ // Start animation
+ LLInspect::onOpen(data);
+
+ // Extract appropriate object information from input LLSD
+ // (Eventually, it might be nice to query server for details
+ // rather than require caller to pass in the information.)
+ mObjectID = data["object_id"].asUUID();
+ mName = data["name"].asString();
+ mOwnerID = data["owner_id"].asUUID();
+ mGroupOwned = data["group_owned"].asBoolean();
+ mSLurl = data["slurl"].asString();
+
+ // work out the owner's name
+ mOwner = "";
+ if (gCacheName)
+ {
+ gCacheName->get(mOwnerID, mGroupOwned, nameCallback, this);
+ }
+
+ // update the inspector with the current object state
+ update();
+
+ // Position the inspector relative to the mouse cursor
+ LLUI::positionViewNearMouse(this);
+}
+
+void LLInspectRemoteObject::onClickMap()
+{
+ std::string url = "secondlife://" + mSLurl;
+ LLUrlAction::showLocationOnMap(url);
+ closeFloater();
+}
+
+void LLInspectRemoteObject::onClickBlock()
+{
+ LLMute::EType mute_type = mGroupOwned ? LLMute::GROUP : LLMute::AGENT;
+ LLMute mute(mOwnerID, mOwner, mute_type);
+ LLMuteList::getInstance()->add(mute);
+ LLPanelBlockedList::showPanelAndSelect(mute.mID);
+ closeFloater();
+}
+
+void LLInspectRemoteObject::onClickClose()
+{
+ closeFloater();
+}
+
+//static
+void LLInspectRemoteObject::nameCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group, void* data)
+{
+ LLInspectRemoteObject *self = (LLInspectRemoteObject*)data;
+ self->mOwner = first;
+ if (!last.empty())
+ {
+ self->mOwner += " " + last;
+ }
+ self->update();
+}
+
+void LLInspectRemoteObject::update()
+{
+ // show the object name as the inspector's title
+ getChild<LLUICtrl>("object_name")->setValue(mName);
+
+ // show the object's owner - click it to show profile
+ std::string owner = mOwner;
+ if (! mOwnerID.isNull())
+ {
+ if (mGroupOwned)
+ {
+ owner = LLSLURL::buildCommand("group", mOwnerID, "about");
+ }
+ else
+ {
+ owner = LLSLURL::buildCommand("agent", mOwnerID, "about");
+ }
+ }
+ getChild<LLUICtrl>("object_owner")->setValue(owner);
+
+ // display the object's SLurl - click it to teleport
+ std::string url = "secondlife:///app/teleport/" + mSLurl;
+ getChild<LLUICtrl>("object_slurl")->setValue(url);
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// LLInspectRemoteObjectUtil
+//////////////////////////////////////////////////////////////////////////////
+void LLInspectRemoteObjectUtil::registerFloater()
+{
+ LLFloaterReg::add("inspect_remote_object", "inspect_remote_object.xml",
+ &LLFloaterReg::build<LLInspectRemoteObject>);
+}
diff --git a/indra/newview/llinspectremoteobject.h b/indra/newview/llinspectremoteobject.h
new file mode 100644
index 0000000000..e756f1caf4
--- /dev/null
+++ b/indra/newview/llinspectremoteobject.h
@@ -0,0 +1,40 @@
+/**
+ * @file llinspectremoteobject.h
+ *
+ * $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 LLINSPECTREMOTEOBJECT_H
+#define LLINSPECTREMOTEOBJECT_H
+
+namespace LLInspectRemoteObjectUtil
+{
+ void registerFloater();
+}
+
+#endif
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 1bc9297bba..d7be09efa9 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -892,7 +892,6 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
break;
case LLAssetType::AT_CATEGORY:
- case LLAssetType::AT_ROOT_CATEGORY:
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
{
// Create a link folder handler instead.
@@ -1687,7 +1686,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
// BAP - should skip if dup.
if (move_is_into_current_outfit)
{
- LLAppearanceManager::wearEnsemble(inv_cat);
+ LLAppearanceManager::instance().addEnsembleLink(inv_cat);
}
else
{
@@ -2044,7 +2043,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
mContentsCount)
{
gInventory.removeObserver(this);
- LLAppearanceManager::wearInventoryCategory(category, FALSE, TRUE);
+ LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
delete this;
}
}
@@ -2089,7 +2088,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
if(!model) return;
LLViewerInventoryCategory* cat = getCategory();
if(!cat) return;
- LLAppearanceManager::wearEnsemble(cat,true);
+ LLAppearanceManager::instance().addEnsembleLink(cat,true);
return;
}
#endif
@@ -2337,7 +2336,7 @@ void LLFolderBridge::pasteLinkFromClipboard()
{
link_inventory_item(
gAgent.getID(),
- item->getUUID(),
+ item->getLinkedUUID(),
parent_id,
item->getName(),
LLAssetType::AT_LINK,
@@ -2404,7 +2403,7 @@ void LLFolderBridge::folderOptionsMenu()
{
mItems.push_back(std::string("Wear As Ensemble"));
}
- mItems.push_back(std::string("Take Off Items"));
+ mItems.push_back(std::string("Remove From Outfit"));
}
hide_context_entries(*mMenu, mItems, disabled_items);
}
@@ -2730,7 +2729,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)
// BAP - was:
// wear_inventory_category_on_avatar( cat, append );
- LLAppearanceManager::wearInventoryCategory( cat, FALSE, append );
+ LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
}
// helper stuff
@@ -2847,10 +2846,6 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
BOOL is_movable = TRUE;
switch( inv_item->getActualType() )
{
- case LLAssetType::AT_ROOT_CATEGORY:
- is_movable = FALSE;
- break;
-
case LLAssetType::AT_CATEGORY:
is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
break;
@@ -2953,16 +2948,16 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// BAP - should skip if dup.
if (move_is_into_current_outfit)
{
- LLAppearanceManager::wearItem(inv_item);
+ LLAppearanceManager::instance().addItemLink(inv_item);
}
else
{
LLPointer<LLInventoryCallback> cb = NULL;
link_inventory_item(
gAgent.getID(),
- inv_item->getUUID(),
+ inv_item->getLinkedUUID(),
mUUID,
- std::string(),
+ inv_item->getName(),
LLAssetType::AT_LINK,
cb);
}
@@ -3889,16 +3884,11 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
gMessageSystem->sendReliable( gAgent.getRegion()->getHost());
}
// this object might have been selected, so let the selection manager know it's gone now
- LLViewerObject *found_obj =
- gObjectList.findObject(item->getUUID());
+ LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
if (found_obj)
{
LLSelectMgr::getInstance()->remove(found_obj);
}
- else
- {
- llwarns << "object not found - ignoring" << llendl;
- }
}
else LLItemBridge::performAction(folder, model, action);
}
@@ -4053,7 +4043,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
LLInventoryItem* item = getItem();
if (item && item->getIsLinkType())
{
- items.push_back(std::string("Goto Link"));
+ items.push_back(std::string("Find Original"));
}
items.push_back(std::string("Properties"));
@@ -4206,7 +4196,7 @@ void wear_inventory_item_on_avatar( LLInventoryItem* item )
lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
<< " )" << llendl;
- LLAppearanceManager::wearItem(item);
+ LLAppearanceManager::instance().addItemLink(item);
}
}
@@ -4325,10 +4315,6 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
{
LLSelectMgr::getInstance()->remove(found_obj);
}
- else
- {
- llwarns << "object not found, ignoring" << llendl;
- }
}
}
@@ -4493,7 +4479,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
if (item && item->getIsLinkType())
{
- items.push_back(std::string("Goto Link"));
+ items.push_back(std::string("Find Original"));
}
items.push_back(std::string("Properties"));
@@ -4771,7 +4757,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
}
// Find and remove this item from the COF.
- LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::getCOF());
+ LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
llassert(items.size() == 1); // Should always have one and only one item linked to this in the COF.
for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
iter != items.end();
@@ -5157,7 +5143,7 @@ void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
- items.push_back(std::string("Goto Link"));
+ items.push_back(std::string("Find Original"));
items.push_back(std::string("Delete"));
if (!isItemRemovable())
{
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 3ffeb55d6c..4c7b0a0517 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -33,14 +33,16 @@
#ifndef LL_LLINVENTORYBRIDGE_H
#define LL_LLINVENTORYBRIDGE_H
-#include "llfloaterproperties.h"
-#include "llwearable.h"
-#include "llviewercontrol.h"
#include "llcallingcard.h"
-#include "llinventorymodel.h"
+#include "llfloaterproperties.h"
#include "llfoldervieweventlistener.h"
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llviewercontrol.h"
+#include "llwearable.h"
class LLInventoryPanel;
+class LLInventoryModel;
class LLMenuGL;
enum EInventoryIcon
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index e7d7eb19d0..38a417f1a2 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -31,40 +31,25 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llinventorymodel.h"
-#include "llassetstorage.h"
-#include "llcrc.h"
-#include "lldir.h"
-#include "llsys.h"
-#include "llxfermanager.h"
-#include "message.h"
-
#include "llagent.h"
#include "llagentwearables.h"
-#include "llfloater.h"
-#include "llfocusmgr.h"
-#include "llinventorybridge.h"
-#include "llinventoryfunctions.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
-#include "llviewerfoldertype.h"
-#include "llviewerinventory.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryobserver.h"
+#include "llwindow.h"
+#include "llviewercontrol.h"
+#include "llpreview.h"
#include "llviewermessage.h"
+#include "llviewerfoldertype.h"
#include "llviewerwindow.h"
-#include "llviewerregion.h"
#include "llappviewer.h"
-#include "lldbstrings.h"
-#include "llviewerstats.h"
-#include "llmutelist.h"
-#include "llnotifications.h"
+#include "llviewerregion.h"
#include "llcallbacklist.h"
-#include "llpreview.h"
-#include "llviewercontrol.h"
#include "llvoavatarself.h"
-#include "llsdutil.h"
-#include <deque>
//#define DIFF_INVENTORY_FILES
#ifdef DIFF_INVENTORY_FILES
@@ -176,6 +161,7 @@ LLInventoryModel::LLInventoryModel()
mRootFolderID(),
mLibraryRootFolderID(),
mLibraryOwnerID(),
+ mIsNotifyObservers(FALSE),
mIsAgentInvUsable(false)
{
}
@@ -321,10 +307,10 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)
// specifies 'type' as what it defaults to containing. The category is
// not necessarily only for that type. *NOTE: This will create a new
// inventory category on the fly if one does not exist.
-const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder)
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library)
{
- const LLUUID &rv = findCatUUID(t);
- if(rv.isNull() && isInventoryUsable() && create_folder)
+ const LLUUID &rv = findCatUUID(t, find_in_library);
+ if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))
{
const LLUUID &root_id = gInventory.getRootFolderID();
if(root_id.notNull())
@@ -337,10 +323,10 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bo
// Internal method which looks for a category with the specified
// preferred type. Returns LLUUID::null if not found.
-const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type) const
+const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const
{
- const LLUUID &root_id = gInventory.getRootFolderID();
- if(LLFolderType::FT_CATEGORY == preferred_type)
+ const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID();
+ if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
{
return root_id;
}
@@ -537,7 +523,10 @@ void LLInventoryModel::updateLinkedItems(const LLUUID& object_id)
item_array,
LLInventoryModel::INCLUDE_TRASH,
is_linked_item_match);
-
+ if (cat_array.empty() && item_array.empty())
+ {
+ return;
+ }
for (LLInventoryModel::cat_array_t::iterator cat_iter = cat_array.begin();
cat_iter != cat_array.end();
cat_iter++)
@@ -639,6 +628,7 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
new_item = old_item;
LLUUID old_parent_id = old_item->getParentUUID();
LLUUID new_parent_id = item->getParentUUID();
+
if(old_parent_id != new_parent_id)
{
// need to update the parent-child tree
@@ -881,7 +871,8 @@ void LLInventoryModel::moveObject(const LLUUID& object_id, const LLUUID& cat_id)
// Delete a particular inventory object by ID.
void LLInventoryModel::deleteObject(const LLUUID& id)
{
- purgeLinkedObjects(id);
+ // Disabling this; let users manually purge linked objects.
+ // purgeLinkedObjects(id);
lldebugs << "LLInventoryModel::deleteObject()" << llendl;
LLPointer<LLInventoryObject> obj = getObject(id);
if(obj)
@@ -918,13 +909,14 @@ void LLInventoryModel::deleteObject(const LLUUID& id)
}
addChangedMask(LLInventoryObserver::REMOVE, id);
obj = NULL; // delete obj
+ gInventory.notifyObservers();
}
}
// Delete a particular inventory item by ID, and remove it from the server.
void LLInventoryModel::purgeObject(const LLUUID &id)
{
- lldebugs << "LLInventoryModel::purgeObject()" << llendl;
+ lldebugs << "LLInventoryModel::purgeObject() [ id: " << id << " ] " << llendl;
LLPointer<LLInventoryObject> obj = getObject(id);
if(obj)
{
@@ -1133,6 +1125,15 @@ BOOL LLInventoryModel::containsObserver(LLInventoryObserver* observer) const
// The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
void LLInventoryModel::notifyObservers(const std::string service_name)
{
+ if (mIsNotifyObservers)
+ {
+ // Within notifyObservers, something called notifyObservers
+ // again. This type of recursion is unsafe because it causes items to be
+ // processed twice, and this can easily lead to infinite loops.
+ llwarns << "Call was made to notifyObservers within notifyObservers!" << llendl;
+ return;
+ }
+ mIsNotifyObservers = TRUE;
for (observer_list_t::iterator iter = mObservers.begin();
iter != mObservers.end(); )
{
@@ -1154,12 +1155,21 @@ void LLInventoryModel::notifyObservers(const std::string service_name)
mModifyMask = LLInventoryObserver::NONE;
mChangedItemIDs.clear();
+ mIsNotifyObservers = FALSE;
}
// store flag for change
// and id of object change applies to
void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
{
+ if (mIsNotifyObservers)
+ {
+ // Something marked an item for change within a call to notifyObservers
+ // (which is in the process of processing the list of items marked for change).
+ // This means the change may fail to be processed.
+ llwarns << "Adding changed mask within notify observers! Change will likely be lost." << llendl;
+ }
+
mModifyMask |= mask;
if (referent.notNull())
{
@@ -1833,13 +1843,13 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
{
//llinfos << "LLInventoryModel::addItem()" << llendl;
-
- // This can happen if assettype enums change. This can be a backwards compatibility issue
- // in some viewer prototypes prior to when the AT_LINK enum changed from 23 to 24.
+ // This can happen if assettype enums from llassettype.h ever change.
+ // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when
+ // the AT_LINK enum changed from 23 to 24.
if ((item->getType() == LLAssetType::AT_NONE)
|| LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
{
- llwarns << "Got bad asset type for item ( name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ), ignoring." << llendl;
+ llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
return;
}
if(item)
@@ -1848,7 +1858,7 @@ void LLInventoryModel::addItem(LLViewerInventoryItem* item)
// The item will show up as a broken link.
if (item->getIsBrokenLink())
{
- llinfos << "Adding broken link ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl;
+ llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl;
}
mItemMap[item->getUUID()] = item;
}
@@ -2176,7 +2186,7 @@ bool LLInventoryModel::loadSkeleton(
// Add all the items loaded which are parented to a
// category with a correctly cached parent
- count = items.count();
+ S32 bad_link_count = 0;
cat_map_t::iterator unparented = mCategoryMap.end();
for(item_array_t::const_iterator item_iter = items.begin();
item_iter != items.end();
@@ -2193,7 +2203,11 @@ bool LLInventoryModel::loadSkeleton(
// This can happen if the linked object's baseobj is removed from the cache but the linked object is still in the cache.
if (item->getIsBrokenLink())
{
- llinfos << "Attempted to add cached link item without baseobj present ( name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ). Ignoring and invalidating " << cat->getName() << " . " << llendl;
+ bad_link_count++;
+ lldebugs << "Attempted to add cached link item without baseobj present ( name: "
+ << item->getName() << " itemID: " << item->getUUID()
+ << " assetID: " << item->getAssetUUID()
+ << " ). Ignoring and invalidating " << cat->getName() << " . " << llendl;
invalid_categories.insert(cit->second);
continue;
}
@@ -2203,6 +2217,12 @@ bool LLInventoryModel::loadSkeleton(
}
}
}
+ if (bad_link_count > 0)
+ {
+ llinfos << "Attempted to add " << bad_link_count
+ << " cached link items without baseobj present. "
+ << "The corresponding categories were invalidated." << llendl;
+ }
}
else
{
@@ -2430,7 +2450,7 @@ void LLInventoryModel::buildParentChildMap()
{
cat->setParent(findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND));
}
- else if(LLFolderType::FT_CATEGORY == pref)
+ else if(LLFolderType::FT_ROOT_INVENTORY == pref)
{
// it's the root
cat->setParent(LLUUID::null);
@@ -3307,6 +3327,12 @@ void LLInventoryModel::processInventoryDescendents(LLMessageSystem* msg,void**)
for(i = 0; i < count; ++i)
{
titem->unpackMessage(msg, _PREHASH_ItemData, i);
+ // If the item has already been added (e.g. from link prefetch), then it doesn't need to be re-added.
+ if (gInventory.getItem(titem->getUUID()))
+ {
+ lldebugs << "Skipping prefetched item [ Name: " << titem->getName() << " | Type: " << titem->getActualType() << " | ItemUUID: " << titem->getUUID() << " ] " << llendl;
+ continue;
+ }
gInventory.updateItem(titem);
}
@@ -3682,513 +3708,6 @@ bool LLNameCategoryCollector::operator()(
return false;
}
-
-
-///----------------------------------------------------------------------------
-/// Observers
-///----------------------------------------------------------------------------
-
-void LLInventoryCompletionObserver::changed(U32 mask)
-{
- // scan through the incomplete items and move or erase them as
- // appropriate.
- if(!mIncomplete.empty())
- {
- for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- it = mIncomplete.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mComplete.push_back(*it);
- it = mIncomplete.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncomplete.empty())
- {
- done();
- }
- }
-}
-
-void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
-{
- if(id.notNull())
- {
- mIncomplete.push_back(id);
- }
-}
-
-
-void LLInventoryFetchObserver::changed(U32 mask)
-{
- // scan through the incomplete items and move or erase them as
- // appropriate.
- if(!mIncomplete.empty())
- {
- for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- // BUG: This can cause done() to get called prematurely below.
- // This happens with the LLGestureInventoryFetchObserver that
- // loads gestures at startup. JC
- it = mIncomplete.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mComplete.push_back(*it);
- it = mIncomplete.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncomplete.empty())
- {
- done();
- }
- }
- //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
- //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
-}
-
-bool LLInventoryFetchObserver::isEverythingComplete() const
-{
- return mIncomplete.empty();
-}
-
-void fetch_items_from_llsd(const LLSD& items_llsd)
-{
- if (!items_llsd.size()) return;
- LLSD body;
- body[0]["cap_name"] = "FetchInventory";
- body[1]["cap_name"] = "FetchLib";
- for (S32 i=0; i<items_llsd.size();i++)
- {
- if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
- {
- body[0]["items"].append(items_llsd[i]);
- continue;
- }
- if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
- {
- body[1]["items"].append(items_llsd[i]);
- continue;
- }
- }
-
- for (S32 i=0; i<body.size(); i++)
- {
- if (0 >= body[i].size()) continue;
- std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
-
- if (!url.empty())
- {
- body[i]["agent_id"] = gAgent.getID();
- LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
- break;
- }
-
- LLMessageSystem* msg = gMessageSystem;
- BOOL start_new_message = TRUE;
- for (S32 j=0; j<body[i]["items"].size(); j++)
- {
- LLSD item_entry = body[i]["items"][j];
- if(start_new_message)
- {
- start_new_message = FALSE;
- msg->newMessageFast(_PREHASH_FetchInventory);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- }
- msg->nextBlockFast(_PREHASH_InventoryData);
- msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
- msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
- if(msg->isSendFull(NULL))
- {
- start_new_message = TRUE;
- gAgent.sendReliableMessage();
- }
- }
- if(!start_new_message)
- {
- gAgent.sendReliableMessage();
- }
- }
-}
-
-void LLInventoryFetchObserver::fetchItems(
- const LLInventoryFetchObserver::item_ref_t& ids)
-{
- LLUUID owner_id;
- LLSD items_llsd;
- for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(item)
- {
- if(item->isComplete())
- {
- // It's complete, so put it on the complete container.
- mComplete.push_back(*it);
- continue;
- }
- else
- {
- owner_id = item->getPermissions().getOwner();
- }
- }
- else
- {
- // assume it's agent inventory.
- owner_id = gAgent.getID();
- }
-
- // It's incomplete, so put it on the incomplete container, and
- // pack this on the message.
- mIncomplete.push_back(*it);
-
- // Prepare the data to fetch
- LLSD item_entry;
- item_entry["owner_id"] = owner_id;
- item_entry["item_id"] = (*it);
- items_llsd.append(item_entry);
- }
- fetch_items_from_llsd(items_llsd);
-}
-
-// virtual
-void LLInventoryFetchDescendentsObserver::changed(U32 mask)
-{
- for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat)
- {
- it = mIncompleteFolders.erase(it);
- continue;
- }
- if(isComplete(cat))
- {
- mCompleteFolders.push_back(*it);
- it = mIncompleteFolders.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncompleteFolders.empty())
- {
- done();
- }
-}
-
-void LLInventoryFetchDescendentsObserver::fetchDescendents(
- const folder_ref_t& ids)
-{
- for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat) continue;
- if(!isComplete(cat))
- {
- cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it.
- mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer.
- }
- else
- {
- mCompleteFolders.push_back(*it);
- }
- }
-}
-
-bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
-{
- return mIncompleteFolders.empty();
-}
-
-bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
-{
- S32 version = cat->getVersion();
- S32 descendents = cat->getDescendentCount();
- if((LLViewerInventoryCategory::VERSION_UNKNOWN == version)
- || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents))
- {
- return false;
- }
- // it might be complete - check known descendents against
- // currently available.
- LLInventoryModel::cat_array_t* cats;
- LLInventoryModel::item_array_t* items;
- gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
- if(!cats || !items)
- {
- // bit of a hack - pretend we're done if they are gone or
- // incomplete. should never know, but it would suck if this
- // kept tight looping because of a corrupt memory state.
- return true;
- }
- S32 known = cats->count() + items->count();
- if(descendents == known)
- {
- // hey - we're done.
- return true;
- }
- return false;
-}
-
-void LLInventoryFetchComboObserver::changed(U32 mask)
-{
- if(!mIncompleteItems.empty())
- {
- for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- it = mIncompleteItems.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mCompleteItems.push_back(*it);
- it = mIncompleteItems.erase(it);
- continue;
- }
- ++it;
- }
- }
- if(!mIncompleteFolders.empty())
- {
- for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat)
- {
- it = mIncompleteFolders.erase(it);
- continue;
- }
- if(gInventory.isCategoryComplete(*it))
- {
- mCompleteFolders.push_back(*it);
- it = mIncompleteFolders.erase(it);
- continue;
- }
- ++it;
- }
- }
- if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
- {
- mDone = true;
- done();
- }
-}
-
-void LLInventoryFetchComboObserver::fetch(
- const folder_ref_t& folder_ids,
- const item_ref_t& item_ids)
-{
- lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
- for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
- if(!cat) continue;
- if(!gInventory.isCategoryComplete(*fit))
- {
- cat->fetchDescendents();
- lldebugs << "fetching folder " << *fit <<llendl;
- mIncompleteFolders.push_back(*fit);
- }
- else
- {
- mCompleteFolders.push_back(*fit);
- lldebugs << "completing folder " << *fit <<llendl;
- }
- }
-
- // Now for the items - we fetch everything which is not a direct
- // descendent of an incomplete folder because the item will show
- // up in an inventory descendents message soon enough so we do not
- // have to fetch it individually.
- LLSD items_llsd;
- LLUUID owner_id;
- for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*iit);
- if(!item)
- {
- lldebugs << "uanble to find item " << *iit << llendl;
- continue;
- }
- if(item->isComplete())
- {
- // It's complete, so put it on the complete container.
- mCompleteItems.push_back(*iit);
- lldebugs << "completing item " << *iit << llendl;
- continue;
- }
- else
- {
- mIncompleteItems.push_back(*iit);
- owner_id = item->getPermissions().getOwner();
- }
- if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
- {
- LLSD item_entry;
- item_entry["owner_id"] = owner_id;
- item_entry["item_id"] = (*iit);
- items_llsd.append(item_entry);
- }
- else
- {
- lldebugs << "not worrying about " << *iit << llendl;
- }
- }
- fetch_items_from_llsd(items_llsd);
-}
-
-void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
-{
- if(id.notNull())
- {
- mMIA.push_back(id);
- }
-}
-
-void LLInventoryExistenceObserver::changed(U32 mask)
-{
- // scan through the incomplete items and move or erase them as
- // appropriate.
- if(!mMIA.empty())
- {
- for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- ++it;
- continue;
- }
- mExist.push_back(*it);
- it = mMIA.erase(it);
- }
- if(mMIA.empty())
- {
- done();
- }
- }
-}
-
-void LLInventoryAddedObserver::changed(U32 mask)
-{
- if(!(mask & LLInventoryObserver::ADD))
- {
- return;
- }
-
- // *HACK: If this was in response to a packet off
- // the network, figure out which item was updated.
- LLMessageSystem* msg = gMessageSystem;
-
- std::string msg_name;
- if (mMessageName.empty())
- {
- msg_name = msg->getMessageName();
- }
- else
- {
- msg_name = mMessageName;
- }
-
- if (msg_name.empty())
- {
- return;
- }
-
- // We only want newly created inventory items. JC
- if ( msg_name != "UpdateCreateInventoryItem")
- {
- return;
- }
-
- LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
- S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
- for(S32 i = 0; i < num_blocks; ++i)
- {
- titem->unpackMessage(msg, _PREHASH_InventoryData, i);
- if (!(titem->getUUID().isNull()))
- {
- //we don't do anything with null keys
- mAdded.push_back(titem->getUUID());
- }
- }
- if (!mAdded.empty())
- {
- done();
- }
-}
-
-LLInventoryTransactionObserver::LLInventoryTransactionObserver(
- const LLTransactionID& transaction_id) :
- mTransactionID(transaction_id)
-{
-}
-
-void LLInventoryTransactionObserver::changed(U32 mask)
-{
- if(mask & LLInventoryObserver::ADD)
- {
- // This could be it - see if we are processing a bulk update
- LLMessageSystem* msg = gMessageSystem;
- if(msg->getMessageName()
- && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
- {
- // we have a match for the message - now check the
- // transaction id.
- LLUUID id;
- msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
- if(id == mTransactionID)
- {
- // woo hoo, we found it
- folder_ref_t folders;
- item_ref_t items;
- S32 count;
- count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
- S32 i;
- for(i = 0; i < count; ++i)
- {
- msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
- if(id.notNull())
- {
- folders.push_back(id);
- }
- }
- count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
- for(i = 0; i < count; ++i)
- {
- msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
- if(id.notNull())
- {
- items.push_back(id);
- }
- }
-
- // call the derived class the implements this method.
- done(folders, items);
- }
- }
- }
-}
-
-
///----------------------------------------------------------------------------
/// LLAssetIDMatches
///----------------------------------------------------------------------------
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index faf026887a..aa4ffb392f 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -41,40 +41,22 @@
#include "lluuid.h"
#include "llpermissionsflags.h"
#include "llstring.h"
-
#include <map>
#include <set>
#include <string>
#include <vector>
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryObserver
-//
-// This class is designed to be a simple abstract base class which can
-// relay messages when the inventory changes.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryObserver;
+class LLInventoryObject;
+class LLInventoryItem;
+class LLInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLViewerInventoryItem;
+class LLViewerInventoryCategory;
+class LLMessageSystem;
+class LLInventoryCollectFunctor;
-class LLInventoryObserver
-{
-public:
- // This enumeration is a way to refer to what changed in a more
- // human readable format. You can mask the value provided by
- // chaged() to see if the observer is interested in the change.
- enum
- {
- NONE = 0,
- LABEL = 1, // name changed
- INTERNAL = 2, // internal change, eg, asset uuid different
- ADD = 4, // something added
- REMOVE = 8, // something deleted
- STRUCTURE = 16, // structural change, eg, item or folder moved
- CALLING_CARD = 32, // online, grant status, cancel, etc change
- ALL = 0xffffffff
- };
- virtual ~LLInventoryObserver() {};
- virtual void changed(U32 mask) = 0;
- std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
-};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryModel
@@ -87,16 +69,6 @@ public:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryObject;
-class LLInventoryItem;
-class LLInventoryCategory;
-class LLViewerInventoryItem;
-class LLViewerInventoryCategory;
-class LLViewerInventoryItem;
-class LLViewerInventoryCategory;
-class LLMessageSystem;
-class LLInventoryCollectFunctor;
-
class LLInventoryModel
{
public:
@@ -275,13 +247,12 @@ public:
// findCategoryUUIDForType() returns the uuid of the category that
// specifies 'type' as what it defaults to containing. The
- // category is not necessarily only for that type. *NOTE: This
- // will create a new inventory category on the fly if one does not
- // exist.
-
+ // category is not necessarily only for that type. *NOTE: If create_folder is true, this
+ // will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is
+ // true it will search in the user's library folder instead of "My Inventory"
// SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible
// multiple trash can bug.
- const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true);
+ const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false);
// Call this method when it's time to update everyone on a new
// state, by default, the inventory model will not update
@@ -432,7 +403,7 @@ protected:
//
// Internal method which looks for a category with the specified
// preferred type. Returns LLUUID::null if not found
- const LLUUID &findCatUUID(LLFolderType::EType preferred_type) const;
+ const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const;
// Empty the entire contents
void empty();
@@ -473,23 +444,12 @@ protected:
cat_array_t* getUnlockedCatArray(const LLUUID& id);
item_array_t* getUnlockedItemArray(const LLUUID& id);
-protected:
+private:
// Variables used to track what has changed since the last notify.
U32 mModifyMask;
typedef std::set<LLUUID> changed_items_t;
changed_items_t mChangedItemIDs;
- // Information for tracking the actual inventory. We index this
- // information in a lot of different ways so we can access
- // the inventory using several different identifiers.
- // mInventory member data is the 'master' list of inventory, and
- // mCategoryMap and mItemMap store uuid->object mappings.
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
- //inv_map_t mInventory;
- cat_map_t mCategoryMap;
- item_map_t mItemMap;
-
std::map<LLUUID, bool> mCategoryLock;
std::map<LLUUID, bool> mItemLock;
@@ -525,6 +485,21 @@ protected:
// This flag is used to handle an invalid inventory state.
bool mIsAgentInvUsable;
+private:
+ // Information for tracking the actual inventory. We index this
+ // information in a lot of different ways so we can access
+ // the inventory using several different identifiers.
+ // mInventory member data is the 'master' list of inventory, and
+ // mCategoryMap and mItemMap store uuid->object mappings.
+ typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
+ typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
+ //inv_map_t mInventory;
+ cat_map_t mCategoryMap;
+ item_map_t mItemMap;
+
+ // Flag set when notifyObservers is being called, to look for bugs
+ // where it's called recursively.
+ BOOL mIsNotifyObservers;
public:
// *NOTE: DEBUG functionality
void dumpInventory() const;
@@ -767,183 +742,5 @@ public:
LLInventoryItem* item);
};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryCompletionObserver
-//
-// Class which can be used as a base class for doing something when
-// when all observed items are locally complete. This class implements
-// the changed() method of LLInventoryObserver and declares a new
-// method named done() which is called when all watched items have
-// complete information in the inventory model.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryCompletionObserver : public LLInventoryObserver
-{
-public:
- LLInventoryCompletionObserver() {}
- virtual void changed(U32 mask);
-
- void watchItem(const LLUUID& id);
-
-protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mComplete;
- item_ref_t mIncomplete;
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchObserver
-//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles all the the fetching necessary. Override the done()
-// method to do the thing you want.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryFetchObserver : public LLInventoryObserver
-{
-public:
- LLInventoryFetchObserver() {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> item_ref_t;
-
- bool isEverythingComplete() const;
- void fetchItems(const item_ref_t& ids);
- virtual void done() = 0;
-
-protected:
- item_ref_t mComplete;
- item_ref_t mIncomplete;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchDescendentsObserver
-//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles fetching based on category. Override the done()
-// method to do the thing you want.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
-{
-public:
- LLInventoryFetchDescendentsObserver() {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> folder_ref_t;
- void fetchDescendents(const folder_ref_t& ids);
- bool isEverythingComplete() const;
- virtual void done() = 0;
-
-protected:
- bool isComplete(LLViewerInventoryCategory* cat);
- folder_ref_t mIncompleteFolders;
- folder_ref_t mCompleteFolders;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchComboObserver
-//
-// This class does an appropriate combination of fetch descendents and
-// item fetches based on completion of categories and items. Much like
-// the fetch and fetch descendents, this will call done() when everything
-// has arrived.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchComboObserver : public LLInventoryObserver
-{
-public:
- LLInventoryFetchComboObserver() : mDone(false) {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> folder_ref_t;
- typedef std::vector<LLUUID> item_ref_t;
- void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
-
- virtual void done() = 0;
-
-protected:
- bool mDone;
- folder_ref_t mCompleteFolders;
- folder_ref_t mIncompleteFolders;
- item_ref_t mCompleteItems;
- item_ref_t mIncompleteItems;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryExistenceObserver
-//
-// This class is used as a base class for doing somethign when all the
-// observed item ids exist in the inventory somewhere. You can derive
-// a class from this class and implement the done() method to do
-// something useful.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryExistenceObserver : public LLInventoryObserver
-{
-public:
- LLInventoryExistenceObserver() {}
- virtual void changed(U32 mask);
-
- void watchItem(const LLUUID& id);
-
-protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mExist;
- item_ref_t mMIA;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryAddedObserver
-//
-// This class is used as a base class for doing something when
-// a new item arrives in inventory.
-// It does not watch for a certain UUID, rather it acts when anything is added
-// Derive a class from this class and implement the done() method to do
-// something useful.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryAddedObserver : public LLInventoryObserver
-{
-public:
- LLInventoryAddedObserver() : mAdded() {}
- virtual void changed(U32 mask);
-
-protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mAdded;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryTransactionObserver
-//
-// Class which can be used as a base class for doing something when an
-// inventory transaction completes.
-//
-// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
-// functionality gaps.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryTransactionObserver : public LLInventoryObserver
-{
-public:
- LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
- virtual void changed(U32 mask);
-
-protected:
- typedef std::vector<LLUUID> folder_ref_t;
- typedef std::vector<LLUUID> item_ref_t;
- virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
-
- LLTransactionID mTransactionID;
-};
-
-
#endif // LL_LLINVENTORYMODEL_H
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
new file mode 100644
index 0000000000..3ccf593d27
--- /dev/null
+++ b/indra/newview/llinventoryobserver.cpp
@@ -0,0 +1,564 @@
+/**
+ * @file llinventoryobserver.cpp
+ * @brief Implementation of the inventory observers used to track agent inventory.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-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 "llinventoryobserver.h"
+
+#include "llassetstorage.h"
+#include "llcrc.h"
+#include "lldir.h"
+#include "llsys.h"
+#include "llxfermanager.h"
+#include "message.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llfloater.h"
+#include "llfocusmgr.h"
+#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "llviewermessage.h"
+#include "llviewerwindow.h"
+#include "llviewerregion.h"
+#include "llappviewer.h"
+#include "lldbstrings.h"
+#include "llviewerstats.h"
+#include "llmutelist.h"
+#include "llnotifications.h"
+#include "llcallbacklist.h"
+#include "llpreview.h"
+#include "llviewercontrol.h"
+#include "llvoavatarself.h"
+#include "llsdutil.h"
+#include <deque>
+
+void LLInventoryCompletionObserver::changed(U32 mask)
+{
+ // scan through the incomplete items and move or erase them as
+ // appropriate.
+ if(!mIncomplete.empty())
+ {
+ for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ if(item->isComplete())
+ {
+ mComplete.push_back(*it);
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ if(mIncomplete.empty())
+ {
+ done();
+ }
+ }
+}
+
+void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
+{
+ if(id.notNull())
+ {
+ mIncomplete.push_back(id);
+ }
+}
+
+
+void LLInventoryFetchObserver::changed(U32 mask)
+{
+ // scan through the incomplete items and move or erase them as
+ // appropriate.
+ if(!mIncomplete.empty())
+ {
+ for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ // BUG: This can cause done() to get called prematurely below.
+ // This happens with the LLGestureInventoryFetchObserver that
+ // loads gestures at startup. JC
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ if(item->isComplete())
+ {
+ mComplete.push_back(*it);
+ it = mIncomplete.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ if(mIncomplete.empty())
+ {
+ done();
+ }
+ }
+ //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
+ //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
+}
+
+bool LLInventoryFetchObserver::isEverythingComplete() const
+{
+ return mIncomplete.empty();
+}
+
+void fetch_items_from_llsd(const LLSD& items_llsd)
+{
+ if (!items_llsd.size()) return;
+ LLSD body;
+ body[0]["cap_name"] = "FetchInventory";
+ body[1]["cap_name"] = "FetchLib";
+ for (S32 i=0; i<items_llsd.size();i++)
+ {
+ if (items_llsd[i]["owner_id"].asString() == gAgent.getID().asString())
+ {
+ body[0]["items"].append(items_llsd[i]);
+ continue;
+ }
+ if (items_llsd[i]["owner_id"].asString() == ALEXANDRIA_LINDEN_ID.asString())
+ {
+ body[1]["items"].append(items_llsd[i]);
+ continue;
+ }
+ }
+
+ for (S32 i=0; i<body.size(); i++)
+ {
+ if (0 >= body[i].size()) continue;
+ std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
+
+ if (!url.empty())
+ {
+ body[i]["agent_id"] = gAgent.getID();
+ LLHTTPClient::post(url, body[i], new LLInventoryModel::fetchInventoryResponder(body[i]));
+ break;
+ }
+
+ LLMessageSystem* msg = gMessageSystem;
+ BOOL start_new_message = TRUE;
+ for (S32 j=0; j<body[i]["items"].size(); j++)
+ {
+ LLSD item_entry = body[i]["items"][j];
+ if(start_new_message)
+ {
+ start_new_message = FALSE;
+ msg->newMessageFast(_PREHASH_FetchInventory);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ }
+ msg->nextBlockFast(_PREHASH_InventoryData);
+ msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
+ msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
+ if(msg->isSendFull(NULL))
+ {
+ start_new_message = TRUE;
+ gAgent.sendReliableMessage();
+ }
+ }
+ if(!start_new_message)
+ {
+ gAgent.sendReliableMessage();
+ }
+ }
+}
+
+void LLInventoryFetchObserver::fetchItems(
+ const LLInventoryFetchObserver::item_ref_t& ids)
+{
+ LLUUID owner_id;
+ LLSD items_llsd;
+ for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(item)
+ {
+ if(item->isComplete())
+ {
+ // It's complete, so put it on the complete container.
+ mComplete.push_back(*it);
+ continue;
+ }
+ else
+ {
+ owner_id = item->getPermissions().getOwner();
+ }
+ }
+ else
+ {
+ // assume it's agent inventory.
+ owner_id = gAgent.getID();
+ }
+
+ // It's incomplete, so put it on the incomplete container, and
+ // pack this on the message.
+ mIncomplete.push_back(*it);
+
+ // Prepare the data to fetch
+ LLSD item_entry;
+ item_entry["owner_id"] = owner_id;
+ item_entry["item_id"] = (*it);
+ items_llsd.append(item_entry);
+ }
+ fetch_items_from_llsd(items_llsd);
+}
+
+// virtual
+void LLInventoryFetchDescendentsObserver::changed(U32 mask)
+{
+ for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if(!cat)
+ {
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ if(isComplete(cat))
+ {
+ mCompleteFolders.push_back(*it);
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ if(mIncompleteFolders.empty())
+ {
+ done();
+ }
+}
+
+void LLInventoryFetchDescendentsObserver::fetchDescendents(
+ const folder_ref_t& ids)
+{
+ for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if(!cat) continue;
+ if(!isComplete(cat))
+ {
+ cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it.
+ mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer.
+ }
+ else
+ {
+ mCompleteFolders.push_back(*it);
+ }
+ }
+}
+
+bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
+{
+ return mIncompleteFolders.empty();
+}
+
+bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
+{
+ S32 version = cat->getVersion();
+ S32 descendents = cat->getDescendentCount();
+ if((LLViewerInventoryCategory::VERSION_UNKNOWN == version)
+ || (LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN == descendents))
+ {
+ return false;
+ }
+ // it might be complete - check known descendents against
+ // currently available.
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
+ if(!cats || !items)
+ {
+ // bit of a hack - pretend we're done if they are gone or
+ // incomplete. should never know, but it would suck if this
+ // kept tight looping because of a corrupt memory state.
+ return true;
+ }
+ S32 known = cats->count() + items->count();
+ if(descendents == known)
+ {
+ // hey - we're done.
+ return true;
+ }
+ return false;
+}
+
+void LLInventoryFetchComboObserver::changed(U32 mask)
+{
+ if(!mIncompleteItems.empty())
+ {
+ for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ it = mIncompleteItems.erase(it);
+ continue;
+ }
+ if(item->isComplete())
+ {
+ mCompleteItems.push_back(*it);
+ it = mIncompleteItems.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ }
+ if(!mIncompleteFolders.empty())
+ {
+ for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if(!cat)
+ {
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ if(gInventory.isCategoryComplete(*it))
+ {
+ mCompleteFolders.push_back(*it);
+ it = mIncompleteFolders.erase(it);
+ continue;
+ }
+ ++it;
+ }
+ }
+ if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
+ {
+ mDone = true;
+ done();
+ }
+}
+
+void LLInventoryFetchComboObserver::fetch(
+ const folder_ref_t& folder_ids,
+ const item_ref_t& item_ids)
+{
+ lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
+ for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
+ if(!cat) continue;
+ if(!gInventory.isCategoryComplete(*fit))
+ {
+ cat->fetchDescendents();
+ lldebugs << "fetching folder " << *fit <<llendl;
+ mIncompleteFolders.push_back(*fit);
+ }
+ else
+ {
+ mCompleteFolders.push_back(*fit);
+ lldebugs << "completing folder " << *fit <<llendl;
+ }
+ }
+
+ // Now for the items - we fetch everything which is not a direct
+ // descendent of an incomplete folder because the item will show
+ // up in an inventory descendents message soon enough so we do not
+ // have to fetch it individually.
+ LLSD items_llsd;
+ LLUUID owner_id;
+ for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*iit);
+ if(!item)
+ {
+ lldebugs << "uanble to find item " << *iit << llendl;
+ continue;
+ }
+ if(item->isComplete())
+ {
+ // It's complete, so put it on the complete container.
+ mCompleteItems.push_back(*iit);
+ lldebugs << "completing item " << *iit << llendl;
+ continue;
+ }
+ else
+ {
+ mIncompleteItems.push_back(*iit);
+ owner_id = item->getPermissions().getOwner();
+ }
+ if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
+ {
+ LLSD item_entry;
+ item_entry["owner_id"] = owner_id;
+ item_entry["item_id"] = (*iit);
+ items_llsd.append(item_entry);
+ }
+ else
+ {
+ lldebugs << "not worrying about " << *iit << llendl;
+ }
+ }
+ fetch_items_from_llsd(items_llsd);
+}
+
+void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
+{
+ if(id.notNull())
+ {
+ mMIA.push_back(id);
+ }
+}
+
+void LLInventoryExistenceObserver::changed(U32 mask)
+{
+ // scan through the incomplete items and move or erase them as
+ // appropriate.
+ if(!mMIA.empty())
+ {
+ for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if(!item)
+ {
+ ++it;
+ continue;
+ }
+ mExist.push_back(*it);
+ it = mMIA.erase(it);
+ }
+ if(mMIA.empty())
+ {
+ done();
+ }
+ }
+}
+
+void LLInventoryAddedObserver::changed(U32 mask)
+{
+ if(!(mask & LLInventoryObserver::ADD))
+ {
+ return;
+ }
+
+ // *HACK: If this was in response to a packet off
+ // the network, figure out which item was updated.
+ LLMessageSystem* msg = gMessageSystem;
+
+ std::string msg_name;
+ if (mMessageName.empty())
+ {
+ msg_name = msg->getMessageName();
+ }
+ else
+ {
+ msg_name = mMessageName;
+ }
+
+ if (msg_name.empty())
+ {
+ return;
+ }
+
+ // We only want newly created inventory items. JC
+ if ( msg_name != "UpdateCreateInventoryItem")
+ {
+ return;
+ }
+
+ LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+ S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
+ for(S32 i = 0; i < num_blocks; ++i)
+ {
+ titem->unpackMessage(msg, _PREHASH_InventoryData, i);
+ if (!(titem->getUUID().isNull()))
+ {
+ //we don't do anything with null keys
+ mAdded.push_back(titem->getUUID());
+ }
+ }
+ if (!mAdded.empty())
+ {
+ done();
+ }
+}
+
+LLInventoryTransactionObserver::LLInventoryTransactionObserver(
+ const LLTransactionID& transaction_id) :
+ mTransactionID(transaction_id)
+{
+}
+
+void LLInventoryTransactionObserver::changed(U32 mask)
+{
+ if(mask & LLInventoryObserver::ADD)
+ {
+ // This could be it - see if we are processing a bulk update
+ LLMessageSystem* msg = gMessageSystem;
+ if(msg->getMessageName()
+ && (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
+ {
+ // we have a match for the message - now check the
+ // transaction id.
+ LLUUID id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
+ if(id == mTransactionID)
+ {
+ // woo hoo, we found it
+ folder_ref_t folders;
+ item_ref_t items;
+ S32 count;
+ count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
+ S32 i;
+ for(i = 0; i < count; ++i)
+ {
+ msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
+ if(id.notNull())
+ {
+ folders.push_back(id);
+ }
+ }
+ count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
+ for(i = 0; i < count; ++i)
+ {
+ msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
+ if(id.notNull())
+ {
+ items.push_back(id);
+ }
+ }
+
+ // call the derived class the implements this method.
+ done(folders, items);
+ }
+ }
+ }
+}
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
new file mode 100644
index 0000000000..384e6292e8
--- /dev/null
+++ b/indra/newview/llinventoryobserver.h
@@ -0,0 +1,249 @@
+/**
+ * @file llinventoryobserver.h
+ * @brief LLInventoryObserver class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-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_LLINVENTORYOBSERVERS_H
+#define LL_LLINVENTORYOBSERVERS_H
+
+#include "lluuid.h"
+#include <string>
+#include <vector>
+
+class LLViewerInventoryCategory;
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryObserver
+//
+// This class is designed to be a simple abstract base class which can
+// relay messages when the inventory changes.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryObserver
+{
+public:
+ // This enumeration is a way to refer to what changed in a more
+ // human readable format. You can mask the value provided by
+ // chaged() to see if the observer is interested in the change.
+ enum
+ {
+ NONE = 0,
+ LABEL = 1, // name changed
+ INTERNAL = 2, // internal change, eg, asset uuid different
+ ADD = 4, // something added
+ REMOVE = 8, // something deleted
+ STRUCTURE = 16, // structural change, eg, item or folder moved
+ CALLING_CARD = 32, // online, grant status, cancel, etc change
+ ALL = 0xffffffff
+ };
+ virtual ~LLInventoryObserver() {};
+ virtual void changed(U32 mask) = 0;
+ std::string mMessageName; // used by Agent Inventory Service only. [DEV-20328]
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCompletionObserver
+//
+// Class which can be used as a base class for doing something when
+// when all observed items are locally complete. This class implements
+// the changed() method of LLInventoryObserver and declares a new
+// method named done() which is called when all watched items have
+// complete information in the inventory model.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryCompletionObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryCompletionObserver() {}
+ virtual void changed(U32 mask);
+
+ void watchItem(const LLUUID& id);
+
+protected:
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mComplete;
+ item_ref_t mIncomplete;
+};
+
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchObserver
+//
+// This class is much like the LLInventoryCompletionObserver, except
+// that it handles all the the fetching necessary. Override the done()
+// method to do the thing you want.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryFetchObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryFetchObserver() {}
+ virtual void changed(U32 mask);
+
+ typedef std::vector<LLUUID> item_ref_t;
+
+ bool isEverythingComplete() const;
+ void fetchItems(const item_ref_t& ids);
+ virtual void done() = 0;
+
+protected:
+ item_ref_t mComplete;
+ item_ref_t mIncomplete;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchDescendentsObserver
+//
+// This class is much like the LLInventoryCompletionObserver, except
+// that it handles fetching based on category. Override the done()
+// method to do the thing you want.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryFetchDescendentsObserver() {}
+ virtual void changed(U32 mask);
+
+ typedef std::vector<LLUUID> folder_ref_t;
+ void fetchDescendents(const folder_ref_t& ids);
+ bool isEverythingComplete() const;
+ virtual void done() = 0;
+
+protected:
+ bool isComplete(LLViewerInventoryCategory* cat);
+ folder_ref_t mIncompleteFolders;
+ folder_ref_t mCompleteFolders;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryFetchComboObserver
+//
+// This class does an appropriate combination of fetch descendents and
+// item fetches based on completion of categories and items. Much like
+// the fetch and fetch descendents, this will call done() when everything
+// has arrived.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryFetchComboObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryFetchComboObserver() : mDone(false) {}
+ virtual void changed(U32 mask);
+
+ typedef std::vector<LLUUID> folder_ref_t;
+ typedef std::vector<LLUUID> item_ref_t;
+ void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
+
+ virtual void done() = 0;
+
+protected:
+ bool mDone;
+ folder_ref_t mCompleteFolders;
+ folder_ref_t mIncompleteFolders;
+ item_ref_t mCompleteItems;
+ item_ref_t mIncompleteItems;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryExistenceObserver
+//
+// This class is used as a base class for doing somethign when all the
+// observed item ids exist in the inventory somewhere. You can derive
+// a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryExistenceObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryExistenceObserver() {}
+ virtual void changed(U32 mask);
+
+ void watchItem(const LLUUID& id);
+
+protected:
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mExist;
+ item_ref_t mMIA;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryAddedObserver
+//
+// This class is used as a base class for doing something when
+// a new item arrives in inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
+// Derive a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryAddedObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryAddedObserver() : mAdded() {}
+ virtual void changed(U32 mask);
+
+protected:
+ virtual void done() = 0;
+
+ typedef std::vector<LLUUID> item_ref_t;
+ item_ref_t mAdded;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryTransactionObserver
+//
+// Class which can be used as a base class for doing something when an
+// inventory transaction completes.
+//
+// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
+// functionality gaps.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryTransactionObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
+ virtual void changed(U32 mask);
+
+protected:
+ typedef std::vector<LLUUID> folder_ref_t;
+ typedef std::vector<LLUUID> item_ref_t;
+ virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
+
+ LLTransactionID mTransactionID;
+};
+
+
+#endif // LL_LLINVENTORYOBSERVERS_H
+
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 9a71e53441..3a8b8bdf9e 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -38,55 +38,16 @@
// Seraph TODO: Remove unnecessary headers
-// library includes
#include "llagent.h"
#include "llagentwearables.h"
-#include "llcallingcard.h"
-#include "llfloaterreg.h"
-#include "llsdserialize.h"
-#include "llfiltereditor.h"
-#include "llspinctrl.h"
-#include "llui.h"
-#include "message.h"
-
-// newview includes
#include "llappearancemgr.h"
-#include "llappviewer.h"
-#include "llfirstuse.h"
-#include "llfloaterchat.h"
-#include "llfloatercustomize.h"
-#include "llfocusmgr.h"
-#include "llfolderview.h"
-#include "llgesturemgr.h"
-#include "lliconctrl.h"
+#include "llfloaterreg.h"
#include "llimview.h"
#include "llinventorybridge.h"
-#include "llinventoryclipboard.h"
-#include "llinventorymodel.h"
-#include "lllineeditor.h"
-#include "llmenugl.h"
-#include "llpreviewanim.h"
-#include "llpreviewgesture.h"
-#include "llpreviewnotecard.h"
-#include "llpreviewscript.h"
-#include "llpreviewsound.h"
-#include "llpreviewtexture.h"
-#include "llresmgr.h"
-#include "llscrollbar.h"
#include "llscrollcontainer.h"
-#include "llselectmgr.h"
-#include "lltabcontainer.h"
-#include "lltooldraganddrop.h"
-#include "lluictrlfactory.h"
#include "llviewerfoldertype.h"
-#include "llviewerinventory.h"
-#include "llviewermessage.h"
-#include "llviewerobjectlist.h"
-#include "llviewerregion.h"
-#include "llviewerwindow.h"
-#include "llvoavatarself.h"
-#include "llwearablelist.h"
#include "llimfloater.h"
+#include "llvoavatarself.h"
static LLDefaultChildRegistry::Register<LLInventoryPanel> r("inventory_panel");
@@ -139,6 +100,7 @@ BOOL LLInventoryPanel::postBuild()
p.name = getName();
p.rect = folder_rect;
p.parent_panel = this;
+ p.tool_tip = p.name;
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
mFolders->setAllowMultiSelect(mAllowMultiSelect);
}
@@ -191,11 +153,9 @@ BOOL LLInventoryPanel::postBuild()
{
rebuildViewsFor(mStartFolderID);
mHasInventoryConnection = true;
+ defaultOpenInventory();
}
- // bit of a hack to make sure the inventory is open.
- mFolders->openFolder(preferred_type != LLFolderType::FT_NONE ? LLViewerFolderType::lookupNewCategoryName(preferred_type) : "My Inventory");
-
if (mSortOrderSetting != INHERIT_SORT_ORDER)
{
setSortOrder(gSavedSettings.getU32(mSortOrderSetting));
@@ -300,10 +260,11 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
rebuildViewsFor(mStartFolderID);
mHasInventoryConnection = true;
+ defaultOpenInventory();
return;
}
- if(mask & LLInventoryObserver::LABEL)
+ if (mask & LLInventoryObserver::LABEL)
{
handled = true;
// label change - empty out the display name for each object
@@ -328,9 +289,15 @@ void LLInventoryPanel::modelChanged(U32 mask)
}
}
}
- if((mask & (LLInventoryObserver::STRUCTURE
- | LLInventoryObserver::ADD
- | LLInventoryObserver::REMOVE)) != 0)
+
+ // We don't really care which of these masks the item is actually flagged with, since the masks
+ // may not be accurate (e.g. in the main inventory panel, I move an item from My Inventory into
+ // Landmarks; this is a STRUCTURE change for that panel but is an ADD change for the Landmarks
+ // panel). What's relevant is that the item and UI are probably out of sync and thus need to be
+ // resynchronized.
+ if (mask & (LLInventoryObserver::STRUCTURE |
+ LLInventoryObserver::ADD |
+ LLInventoryObserver::REMOVE))
{
handled = true;
// Record which folders are open by uuid.
@@ -347,74 +314,56 @@ void LLInventoryPanel::modelChanged(U32 mask)
LLInventoryObject* model_item = model->getObject(*id_it);
LLFolderViewItem* view_item = mFolders->getItemByID(*id_it);
- if (model_item)
+ // Item exists in memory but a UI element hasn't been created for it.
+ if (model_item && !view_item)
{
- if (!view_item)
+ // Add the UI element for this item.
+ buildNewViews(*id_it);
+ // Select any newly created object that has the auto rename at top of folder root set.
+ if(mFolders->getRoot()->needsAutoRename())
{
- // this object was just created, need to build a view for it
- if ((mask & LLInventoryObserver::ADD) != LLInventoryObserver::ADD)
- {
- llwarns << *id_it << " is in model but not in view, but ADD flag not set" << llendl;
- }
- buildNewViews(*id_it);
-
- // select any newly created object
- // that has the auto rename at top of folder
- // root set
- if(mFolders->getRoot()->needsAutoRename())
- {
- setSelection(*id_it, FALSE);
- }
+ setSelection(*id_it, FALSE);
}
- else
- {
- // this object was probably moved, check its parent
- if ((mask & LLInventoryObserver::STRUCTURE) != LLInventoryObserver::STRUCTURE)
- {
- llwarns << *id_it << " is in model and in view, but STRUCTURE flag not set" << " for model (Name :" << model_item->getName() << " )" << llendl;
- }
+ }
- LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+ // This item already exists in both memory and UI. It was probably moved
+ // around in the panel's directory structure (i.e. reparented).
+ if (model_item && view_item)
+ {
+ LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
- // added check against NULL for cases when Inventory panel contains startFolder.
- // in this case parent is LLFolderView (LLInventoryPanel::mFolders) itself.
- // this check is a fix for bug EXT-1859.
- if (NULL != new_parent && view_item->getParentFolder() != new_parent)
+ // Item has been moved.
+ if (view_item->getParentFolder() != new_parent)
+ {
+ if (new_parent != NULL)
{
+ // Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
view_item->getParentFolder()->extractItem(view_item);
view_item->addToFolder(new_parent, mFolders);
}
-/*
- on the other side in case Inventory Panel has content of the any folder
- it is possible that item moved to some folder which is absent in current
- Panel. For ex. removing item (via moving to trash).
- In this case we need to check if new parent is other then inventory start folder
- and simply remove its View from the hierarchy.
- See details in EXT-2098.
-*/
- // So, let check if item was moved into folder out of this Inventory Panel.
- else if (mStartFolderID.notNull() && NULL == new_parent && model_item->getParentUUID() != mStartFolderID)
+ else
{
- view_item->getParentFolder()->extractItem(view_item);
+ // Item is to be moved outside the panel's directory (e.g. moved to trash for a panel that
+ // doesn't include trash). Just remove the item's UI.
+ view_item->destroyView();
}
}
- }
- else
- {
- if (view_item)
- {
- if ((mask & LLInventoryObserver::REMOVE) != LLInventoryObserver::REMOVE)
- {
- llwarns << *id_it << " is not in model but in view, but REMOVE flag not set" << llendl;
- }
- // item in view but not model, need to delete view
- view_item->destroyView();
- }
else
{
- llwarns << *id_it << "Item does not exist in either view or model, but notification triggered" << llendl;
+ // Hmm, we got an ADD/REMOVE/STRUCTURE notification for this item but there's nothing to be done to it.
+ llwarns << "Notification triggered for item that isn't changing. "
+ << "Operation: ( mask: " << mask << " panel name: " << mStartFolderString << " ) "
+ << "Item: [ Name:" << model_item->getName() << " UUID: " << *id_it << " ]" << llendl;
+
}
}
+
+ // This item has been removed from memory, but its associated UI element still exists.
+ if (!model_item && view_item)
+ {
+ // Remove the item's UI.
+ view_item->destroyView();
+ }
}
}
}
@@ -493,6 +442,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
p.icon = new_listener->getIcon();
p.root = mFolders;
p.listener = new_listener;
+ p.tool_tip = p.name;
LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(p);
folderp->setItemSortOrder(mFolders->getSortOrder());
@@ -519,6 +469,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
params.root(mFolders);
params.listener(new_listener);
params.rect(LLRect (0, 0, 0, 0));
+ params.tool_tip = params.name;
itemp = LLUICtrlFactory::create<LLFolderViewItem> (params);
}
}
@@ -561,6 +512,25 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
}
}
+// bit of a hack to make sure the inventory is open.
+void LLInventoryPanel::defaultOpenInventory()
+{
+ const LLFolderType::EType preferred_type = LLViewerFolderType::lookupTypeFromNewCategoryName(mStartFolderString);
+ if (preferred_type != LLFolderType::FT_NONE)
+ {
+ const std::string& top_level_folder_name = LLViewerFolderType::lookupNewCategoryName(preferred_type);
+ mFolders->openFolder(top_level_folder_name);
+ }
+ else
+ {
+ // Get the first child (it should be "My Inventory") and
+ // open it up by name (just to make sure the first child is actually a folder).
+ LLView* first_child = mFolders->getFirstChild();
+ const std::string& first_child_name = first_child->getName();
+ mFolders->openFolder(first_child_name);
+ }
+}
+
struct LLConfirmPurgeData
{
LLUUID mID;
@@ -676,7 +646,7 @@ void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_foc
{
// Don't select objects in COF (e.g. to prevent refocus when items are worn).
const LLInventoryObject *obj = gInventory.getObject(obj_id);
- if (obj && obj->getParentUUID() == LLAppearanceManager::getCOF())
+ if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
{
return;
}
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index 9f74fad5c1..e398c44105 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -165,7 +165,7 @@ protected:
// Given the id and the parent, build all of the folder views.
void rebuildViewsFor(const LLUUID& id);
virtual void buildNewViews(const LLUUID& id); // made virtual to support derived classes. EXT-719
-
+ void defaultOpenInventory(); // open the first level of inventory
protected:
LLInventoryModel* mInventory;
LLInventoryObserver* mInventoryObserver;
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index bd6702a0b2..0acc67ff5a 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -134,16 +134,33 @@ void LLJoystick::updateSlop()
return;
}
+bool LLJoystick::pointInCircle(S32 x, S32 y) const
+{
+ if(this->getLocalRect().mTop!=this->getLocalRect().mRight)
+ {
+ llwarns << "Joystick shape is not square"<<llendl;
+ return TRUE;
+ }
+ //center is x and y coordinates of center of joystick circle, and also its radius
+ int center = this->getLocalRect().mTop/2;
+ bool in_circle = (x - center) * (x - center) + (y - center) * (y - center) <= center * center;
+ return in_circle;
+}
BOOL LLJoystick::handleMouseDown(S32 x, S32 y, MASK mask)
{
//llinfos << "joystick mouse down " << x << ", " << y << llendl;
+ bool handles = false;
- mLastMouse.set(x, y);
- mFirstMouse.set(x, y);
+ if(pointInCircle(x, y))
+ {
+ mLastMouse.set(x, y);
+ mFirstMouse.set(x, y);
+ mMouseDownTimer.reset();
+ handles = LLButton::handleMouseDown(x, y, mask);
+ }
- mMouseDownTimer.reset();
- return LLButton::handleMouseDown(x, y, mask);
+ return handles;
}
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 4c657913b8..2b071a8999 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -78,6 +78,14 @@ public:
static void onBtnHeldDown(void *userdata); // called by llbutton callback handler
void setInitialQuadrant(EJoystickQuadrant initial) { mInitialQuadrant = initial; };
+
+ /**
+ * Checks if click location is inside joystick circle.
+ *
+ * Image containing circle is square and this square has adherent points with joystick
+ * circle. Make sure to change method according to shape other than square.
+ */
+ bool pointInCircle(S32 x, S32 y) const;
static std::string nameFromQuadrant(const EJoystickQuadrant quadrant);
static EJoystickQuadrant quadrantFromName(const std::string& name);
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index e0dc1b6f0f..003afafa87 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -324,7 +324,7 @@ void LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(const LLVector3d& gl
{
LLVector3 pos = sim_infop->getLocalPos(global_pos);
std::string name = sim_infop->getName() ;
- cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]));
+ cb(name, llround(pos.mV[VX]), llround(pos.mV[VY]),llround(pos.mV[VZ]));
}
else
{
@@ -368,7 +368,7 @@ void LLLandmarkActions::onRegionResponseNameAndCoords(region_name_and_coords_cal
{
LLVector3 local_pos = sim_infop->getLocalPos(global_pos);
std::string name = sim_infop->getName() ;
- cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]));
+ cb(name, llround(local_pos.mV[VX]), llround(local_pos.mV[VY]), llround(local_pos.mV[VZ]));
}
}
diff --git a/indra/newview/lllandmarkactions.h b/indra/newview/lllandmarkactions.h
index 1c524c820c..c65b831f3e 100644
--- a/indra/newview/lllandmarkactions.h
+++ b/indra/newview/lllandmarkactions.h
@@ -43,7 +43,7 @@ class LLLandmarkActions
{
public:
typedef boost::function<void(std::string& slurl)> slurl_callback_t;
- typedef boost::function<void(std::string& slurl, S32 x, S32 y)> region_name_and_coords_callback_t;
+ typedef boost::function<void(std::string& slurl, S32 x, S32 y, S32 z)> region_name_and_coords_callback_t;
/**
* @brief Fetches landmark LLViewerInventoryItems for the given landmark name.
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 8fe317a292..7e35cfa04c 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -45,7 +45,7 @@
#include "lltooltip.h"
// newview includes
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
#include "lllocationhistory.h"
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 945294f3f2..955347bce2 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -73,9 +73,9 @@ LLLoginInstance::LLLoginInstance() :
{
mLoginModule->getEventPump().listen("lllogininstance",
boost::bind(&LLLoginInstance::handleLoginEvent, this, _1));
- mDispatcher.add("fail.login", "", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
- mDispatcher.add("connect", "", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
- mDispatcher.add("disconnect", "", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
+ mDispatcher.add("fail.login", boost::bind(&LLLoginInstance::handleLoginFailure, this, _1));
+ mDispatcher.add("connect", boost::bind(&LLLoginInstance::handleLoginSuccess, this, _1));
+ mDispatcher.add("disconnect", boost::bind(&LLLoginInstance::handleDisconnect, this, _1));
}
LLLoginInstance::~LLLoginInstance()
@@ -182,6 +182,9 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
mRequestData["method"] = "login_to_simulator";
mRequestData["params"] = request_params;
mRequestData["options"] = requested_options;
+
+ mRequestData["cfg_srv_timeout"] = gSavedSettings.getF32("LoginSRVTimeout");
+ mRequestData["cfg_srv_pump"] = gSavedSettings.getString("LoginSRVPump");
}
bool LLLoginInstance::handleLoginEvent(const LLSD& event)
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index ac806d7106..029019a8dc 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -132,120 +132,31 @@ void LLNearbyChat::applySavedVariables()
}
}
-LLColor4 nearbychat_get_text_color(const LLChat& chat)
-{
- LLColor4 text_color;
-
- if(chat.mMuted)
- {
- text_color.setVec(0.8f, 0.8f, 0.8f, 1.f);
- }
- else
- {
- switch(chat.mSourceType)
- {
- case CHAT_SOURCE_SYSTEM:
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- break;
- case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
- {
- text_color = LLUIColorTable::instance().getColor("SystemChatColor");
- }
- else
- {
- if(gAgentID == chat.mFromID)
- {
- text_color = LLUIColorTable::instance().getColor("UserChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("AgentChatColor");
- }
- }
- break;
- case CHAT_SOURCE_OBJECT:
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- text_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
- }
- else if ( chat.mChatType == CHAT_TYPE_OWNER )
- {
- text_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
- }
- else
- {
- text_color = LLUIColorTable::instance().getColor("ObjectChatColor");
- }
- break;
- default:
- text_color.setToWhite();
- }
-
- if (!chat.mPosAgent.isExactlyZero())
- {
- LLVector3 pos_agent = gAgent.getPositionAgent();
- F32 distance = dist_vec(pos_agent, chat.mPosAgent);
- if (distance > gAgent.getNearChatRadius())
- {
- // diminish far-off chat
- text_color.mV[VALPHA] = 0.8f;
- }
- }
- }
-
- return text_color;
-}
-
-void LLNearbyChat::add_timestamped_line(const LLChat& chat, const LLColor4& color)
-{
- S32 font_size = gSavedSettings.getS32("ChatFontSize");
-
- const LLFontGL* fontp = NULL;
- switch(font_size)
- {
- case 0:
- fontp = LLFontGL::getFontSansSerifSmall();
- break;
- default:
- case 1:
- fontp = LLFontGL::getFontSansSerif();
- break;
- case 2:
- fontp = LLFontGL::getFontSansSerifBig();
- break;
- }
-
- LLStyle::Params style_params;
- style_params.color(color);
- style_params.font(fontp);
- LLUUID uuid = chat.mFromID;
- std::string from = chat.mFromName;
- std::string message = chat.mText;
- mChatHistory->appendWidgetMessage(chat, style_params);
-}
-
void LLNearbyChat::addMessage(const LLChat& chat)
{
- LLColor4 color = nearbychat_get_text_color(chat);
-
if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
{
if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
return;
if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))
{
+
+ LLColor4 txt_color;
+
+ LLViewerChat::getChatColor(chat,txt_color);
+
LLFloaterScriptDebug::addScriptLine(chat.mText,
chat.mFromName,
- color,
+ txt_color,
chat.mFromID);
return;
}
}
- // could flash the chat button in the status bar here. JC
if (!chat.mMuted)
- add_timestamped_line(chat, color);
+ {
+ mChatHistory->appendWidgetMessage(chat);
+ }
}
void LLNearbyChat::onNearbySpeakers()
@@ -292,5 +203,12 @@ void LLNearbyChat::getAllowedRect(LLRect& rect)
{
rect = gViewerWindow->getWorldViewRectRaw();
}
-
+void LLNearbyChat::setMinimized (BOOL minimize)
+{
+ if(minimize && !isDocked())
+ {
+ setVisible(FALSE);
+ }
+ LLDockableFloater::setMinimized(minimize);
+}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index cb4654654a..1f4e57cf89 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -35,7 +35,7 @@
#include "lldockablefloater.h"
#include "llscrollbar.h"
-#include "llchat.h"
+#include "llviewerchat.h"
class LLResizeBar;
class LLChatHistory;
@@ -47,8 +47,7 @@ public:
~LLNearbyChat();
BOOL postBuild ();
- void addMessage (const LLChat& message);
-
+ void addMessage (const LLChat& message);
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
@@ -57,6 +56,7 @@ public:
/*virtual*/ void onOpen (const LLSD& key);
virtual void setRect (const LLRect &rect);
+ virtual void setMinimized (BOOL minimize);
private:
virtual void applySavedVariables();
@@ -64,7 +64,6 @@ private:
void getAllowedRect (LLRect& rect);
void onNearbySpeakers ();
- void add_timestamped_line(const LLChat& chat, const LLColor4& color);
private:
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index d54545971b..8fb4ea4211 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -36,7 +36,6 @@
#include "lltrans.h"
#include "llnearbychatbar.h"
-#include "llspeakbutton.h"
#include "llbottomtray.h"
#include "llagent.h"
#include "llgesturemgr.h"
@@ -98,9 +97,10 @@ void LLGestureComboBox::refreshGestures()
clearRows();
mGestures.clear();
- LLGestureManager::item_map_t::iterator it;
+ LLGestureManager::item_map_t::const_iterator it;
+ const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
LLSD::Integer idx(0);
- for (it = LLGestureManager::instance().mActive.begin(); it != LLGestureManager::instance().mActive.end(); ++it)
+ for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
LLMultiGesture* gesture = (*it).second;
if (gesture)
@@ -234,14 +234,6 @@ BOOL LLNearbyChatBar::postBuild()
mOutputMonitor = getChild<LLOutputMonitorCtrl>("chat_zone_indicator");
mOutputMonitor->setVisible(FALSE);
- mSpeakBtn = getParent()->getChild<LLSpeakButton>("talk");
-
- // Speak button should be initially disabled because
- // it takes some time between logging in to world and connecting to voice channel.
- mSpeakBtn->setEnabled(FALSE);
-
- // Registering Chat Bar to receive Voice client status change notifications.
- gVoiceClient->addObserver(this);
return TRUE;
}
@@ -260,16 +252,6 @@ bool LLNearbyChatBar::instanceExists()
void LLNearbyChatBar::draw()
{
- LLRect rect = getRect();
- S32 max_width = getMaxWidth();
-
- if (rect.getWidth() > max_width)
- {
- rect.setLeftTopAndSize(rect.mLeft, rect.mTop, max_width, rect.getHeight());
- reshape(rect.getWidth(), rect.getHeight(), FALSE);
- setRect(rect);
- }
-
displaySpeakingIndicator();
LLPanel::draw();
}
@@ -730,27 +712,6 @@ public:
}
};
-void LLNearbyChatBar::onChange(EStatusType status, const std::string &channelURI, bool proximal)
-{
- // Time it takes to connect to voice channel might be pretty long,
- // so don't expect user login or STATUS_VOICE_ENABLED to be followed by STATUS_JOINED.
- BOOL enable = FALSE;
-
- switch (status)
- {
- // Do not add STATUS_VOICE_ENABLED because voice chat is
- // inactive until STATUS_JOINED
- case STATUS_JOINED:
- enable = TRUE;
- break;
- default:
- enable = FALSE;
- break;
- }
-
- mSpeakBtn->setEnabled(enable);
-}
-
// Creating the object registers with the dispatcher.
LLChatHandler gChatHandler;
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index 56ee706a97..224118e088 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -42,9 +42,6 @@
#include "llspeakers.h"
-class LLSpeakButton;
-
-
class LLGestureComboBox
: public LLComboBox
, public LLGestureManagerObserver
@@ -76,7 +73,6 @@ protected:
class LLNearbyChatBar
: public LLPanel
-, public LLVoiceClientStatusObserver
{
public:
// constructor for inline chat-bars (e.g. hosted in chat history window)
@@ -105,11 +101,6 @@ public:
S32 getMinWidth() const;
S32 getMaxWidth() const;
- /**
- * Implements LLVoiceClientStatusObserver::onChange()
- */
- /*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
-
protected:
static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
@@ -127,7 +118,6 @@ protected:
static S32 sLastSpecialChatChannel;
LLLineEditor* mChatBox;
- LLSpeakButton* mSpeakBtn;
LLOutputMonitorCtrl* mOutputMonitor;
LLLocalSpeakerMgr* mSpeakerMgr;
};
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index e10c506f08..458845fff3 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -63,8 +63,6 @@ class LLNearbyChatScreenChannel: public LLScreenChannelBase
public:
LLNearbyChatScreenChannel(const LLUUID& id):LLScreenChannelBase(id) { mStopProcessing = false;};
- void init (S32 channel_left, S32 channel_right);
-
void addNotification (LLSD& notification);
void arrangeToasts ();
void showToastsBottom ();
@@ -120,15 +118,6 @@ protected:
bool mStopProcessing;
};
-void LLNearbyChatScreenChannel::init(S32 channel_left, S32 channel_right)
-{
- S32 channel_top = gViewerWindow->getWorldViewRectRaw().getHeight();
- S32 channel_bottom = gViewerWindow->getWorldViewRectRaw().mBottom;
- setRect(LLRect(channel_left, channel_top, channel_right, channel_bottom));
- setVisible(TRUE);
-}
-
-
void LLNearbyChatScreenChannel::createOverflowToast(S32 bottom, F32 timer)
{
//we don't need overflow toast in nearby chat
@@ -223,7 +212,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
void LLNearbyChatScreenChannel::arrangeToasts()
{
- if(m_active_toasts.size() == 0 || mIsHovering)
+ if(m_active_toasts.size() == 0 || isHovering())
return;
hideToastsFromScreen();
@@ -332,7 +321,8 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
//only messages from AGENTS
if(CHAT_SOURCE_OBJECT == chat_msg.mSourceType)
{
- return;//dn't show toast for messages from objects
+ if(chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG)
+ return;//ok for now we don't skip messeges from object, so skip only debug messages
}
LLUUID id;
@@ -351,7 +341,14 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg)
notification["time"] = chat_msg.mTime;
notification["source"] = (S32)chat_msg.mSourceType;
notification["chat_type"] = (S32)chat_msg.mChatType;
-
+
+ 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() ;
channel->addNotification(notification);
}
diff --git a/indra/newview/llnotificationgrouphandler.cpp b/indra/newview/llnotificationgrouphandler.cpp
index fc6fb25644..26730e1f10 100644
--- a/indra/newview/llnotificationgrouphandler.cpp
+++ b/indra/newview/llnotificationgrouphandler.cpp
@@ -37,6 +37,7 @@
#include "llgroupactions.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
+#include "llnotificationmanager.h"
using namespace LLNotificationsUI;
@@ -47,6 +48,9 @@ LLGroupHandler::LLGroupHandler(e_notification_type type, const LLSD& id)
// Getting a Channel for our notifications
mChannel = LLChannelManager::getInstance()->createNotificationChannel();
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ channel->setOnRejectToastCallback(boost::bind(&LLGroupHandler::onRejectToast, this, _1));
}
//--------------------------------------------------------------------------
@@ -118,5 +122,15 @@ void LLGroupHandler::onDeleteToast(LLToast* toast)
}
//--------------------------------------------------------------------------
+void LLGroupHandler::onRejectToast(LLUUID& id)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(id);
+
+ if (notification && LLNotificationManager::getInstance()->getHandlerForNotification(notification->getType()) == this)
+ {
+ LLNotifications::instance().cancel(notification);
+ }
+}
+//--------------------------------------------------------------------------
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 23998a0e5d..42cc7cacc2 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -209,6 +209,9 @@ public:
protected:
virtual void onDeleteToast(LLToast* toast);
virtual void initChannel();
+
+ // own handlers
+ void onRejectToast(LLUUID& id);
};
/**
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 1bf7be1c4e..94e733913d 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -95,17 +95,12 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, notification->getPayload()["from_id"]);
if (!LLIMMgr::instance().hasSession(session_id))
{
- // create session with faked type to avoid creating chicklets
session_id = LLIMMgr::instance().addSession(
- notification->getSubstitutions()["NAME"], IM_NOTHING_SPECIAL,
+ notification->getSubstitutions()["OBJECTFROMNAME"], IM_NOTHING_SPECIAL,
notification->getPayload()["from_id"]);
- if (session_id != LLUUID::null)
- {
- LLIMFloater::show(session_id);
- }
}
LLIMMgr::instance().addMessage(session_id, LLUUID(),
- notification->getSubstitutions()["NAME"],
+ notification->getSubstitutions()["OBJECTFROMNAME"],
notification->getMessage());
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 823c92a94e..60a27d5154 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -91,6 +91,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)
if(nearby_chat)
{
LLChat chat_msg(notification->getMessage());
+ chat_msg.mSourceType = CHAT_SOURCE_SYSTEM;
nearby_chat->addMessage(chat_msg);
// don't show toast if Nearby Chat is opened
diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h
index 8a9ba66ec0..c2f8dbd074 100644
--- a/indra/newview/llpanelappearancetab.h
+++ b/indra/newview/llpanelappearancetab.h
@@ -53,12 +53,8 @@ public:
bool isTabVisible(); // Check if parent TabContainer is visible.
- void setPanelAppearanceButtons(LLPanelAppearance* panel);
-
protected:
- LLButton* mWearBtn;
- LLButton* mEditBtn;
LLPanelAppearance* mParent;
};
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 3b54f1546e..2254684f21 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -41,6 +41,7 @@
#include "llimview.h"
#include "lltexteditor.h"
#include "lltexturectrl.h"
+#include "lltoggleablemenu.h"
#include "lltooldraganddrop.h"
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
@@ -333,8 +334,14 @@ BOOL LLPanelAvatarProfile::postBuild()
childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
childSetCommitCallback("teleport",(boost::bind(&LLPanelAvatarProfile::onTeleportButtonClick,this)),NULL);
+ childSetCommitCallback("overflow_btn", boost::bind(&LLPanelAvatarProfile::onOverflowButtonClicked, this), NULL);
childSetCommitCallback("share",(boost::bind(&LLPanelAvatarProfile::onShareButtonClick,this)),NULL);
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
+
+ mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
LLTextureCtrl* pic = getChild<LLTextureCtrl>("2nd_life_pic");
pic->setFallbackImageName("default_profile_picture.j2c");
@@ -513,6 +520,11 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
childSetValue("acc_status_text", caption_text);
}
+void LLPanelAvatarProfile::pay()
+{
+ LLAvatarActions::pay(getAvatarId());
+}
+
void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)
{
LLWeb::loadURL(url);
@@ -552,6 +564,23 @@ void LLPanelAvatarProfile::onShareButtonClick()
//*TODO not implemented
}
+void LLPanelAvatarProfile::onOverflowButtonClicked()
+{
+ if (!mProfileMenu->toggleVisibility())
+ return;
+
+ LLView* btn = getChild<LLView>("overflow_btn");
+
+ if (mProfileMenu->getButtonRect().isEmpty())
+ {
+ mProfileMenu->setButtonRect(btn);
+ }
+ mProfileMenu->updateParent(LLMenuGL::sMenuContainer);
+
+ LLRect rect = btn->getRect();
+ LLMenuGL::showPopup(this, mProfileMenu, rect.mRight, rect.mTop);
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index ae0b8e9844..a0caf0c915 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -38,6 +38,7 @@
class LLComboBox;
class LLLineEditor;
+class LLToggleableMenu;
enum EOnlineStatus
{
@@ -160,12 +161,17 @@ protected:
* Fills Avatar's online status.
*/
virtual void fillOnlineStatus(const LLAvatarData* avatar_data);
-
+
/**
* Fills account status.
*/
virtual void fillAccountStatus(const LLAvatarData* avatar_data);
+ /**
+ * Opens "Pay Resident" dialog.
+ */
+ void pay();
+
void onUrlTextboxClicked(const std::string& url);
void onHomepageTextboxClicked();
void onAddFriendButtonClick();
@@ -173,10 +179,12 @@ protected:
void onCallButtonClick();
void onTeleportButtonClick();
void onShareButtonClick();
+ void onOverflowButtonClicked();
private:
- std::string mGroups;
+ std::string mGroups;
+ LLToggleableMenu* mProfileMenu;
};
/**
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 5679233844..67a2704501 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1167,7 +1167,9 @@ LLPanelClassifiedInfo* LLPanelClassifiedInfo::create()
BOOL LLPanelClassifiedInfo::postBuild()
{
- childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this), NULL);
+ childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this));
+ childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this));
+ childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this));
return TRUE;
}
@@ -1177,6 +1179,11 @@ void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb)
getChild<LLButton>("back_btn")->setClickedCallback(cb);
}
+void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& cb)
+{
+ getChild<LLButton>("edit_btn")->setClickedCallback(cb);
+}
+
void LLPanelClassifiedInfo::onOpen(const LLSD& key)
{
LLUUID avatar_id = key["avatar_id"];
@@ -1216,6 +1223,7 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t
setDescription(c_info->description);
setSnapshotId(c_info->snapshot_id);
setParcelId(c_info->parcel_id);
+ setPosGlobal(c_info->pos_global);
setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
@@ -1325,6 +1333,21 @@ std::string LLPanelClassifiedInfo::createLocationText(
return location_text;
}
+void LLPanelClassifiedInfo::onMapClick()
+{
+ LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
+ LLFloaterReg::showInstance("world_map", "center");
+}
+
+void LLPanelClassifiedInfo::onTeleportClick()
+{
+ if (!getPosGlobal().isExactlyZero())
+ {
+ gAgent.teleportViaLocation(getPosGlobal());
+ LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
+ }
+}
+
void LLPanelClassifiedInfo::onExit()
{
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 187bdbb37e..8b32495854 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -249,7 +249,9 @@ public:
void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
- virtual void setExitCallback(const commit_callback_t& cb);
+ void setExitCallback(const commit_callback_t& cb);
+
+ void setEditClassifiedCallback(const commit_callback_t& cb);
protected:
@@ -264,9 +266,8 @@ protected:
const std::string& sim_name,
const LLVector3d& pos_global);
- void onClickMap();
- void onClickTeleport();
- void onClickBack();
+ void onMapClick();
+ void onTeleportClick();
void onExit();
private:
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index 88aad4923d..7b5b232ad2 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -2383,12 +2383,8 @@ BOOL LLPanelGroupActionsSubTab::postBuildSubTab(LLView* root)
void LLPanelGroupActionsSubTab::activate()
{
LLPanelGroupSubTab::activate();
- lldebugs << "LLPanelGroupActionsSubTab::activate()" << llendl;
- mActionList->deselectAllItems();
- mActionMembers->deleteAllItems();
- mActionRoles->deleteAllItems();
- mActionDescription->clear();
+ update(GC_ALL);
}
void LLPanelGroupActionsSubTab::deactivate()
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 5a0c1164de..00502341fc 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -43,6 +43,7 @@
#include "llparticipantlist.h"
#include "llimview.h"
#include "llvoicechannel.h"
+#include "llsidetray.h"
void LLPanelChatControlPanel::onCallButtonClicked()
{
@@ -158,7 +159,8 @@ void LLPanelIMControlPanel::onAddFriendButtonClicked()
void LLPanelIMControlPanel::onShareButtonClicked()
{
- // *TODO: Implement
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
@@ -174,14 +176,26 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
getChild<LLAvatarIconCtrl>("avatar_icon")->setValue(mAvatarID);
- // Fetch the currect name
- gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
-
- // Disable profile button if participant is not realy SL avatar
+ // Disable most profile buttons if the participant is
+ // not really an SL avatar (e.g., an Avaline caller).
LLIMModel::LLIMSession* im_session =
im_model.findIMSession(session_id);
if( im_session && !im_session->mOtherParticipantIsAvatar )
+ {
childSetEnabled("view_profile_btn", FALSE);
+ childSetEnabled("add_friend_btn", FALSE);
+
+ childSetEnabled("share_btn", FALSE);
+ childSetEnabled("teleport_btn", FALSE);
+ childSetEnabled("pay_btn", FALSE);
+
+ getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
+ }
+ else
+ {
+ // If the participant is an avatar, fetch the currect name
+ gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
+ }
}
void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 15a75cb930..e3b2ab77aa 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -204,11 +204,6 @@ void LLPanelMainInventory::initListCommandsHandlers()
mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
- /*
- mListCommands->getChild<LLButton>("add_btn")->setHeldDownCallback(boost::bind(&LLPanelMainInventory::onAddButtonHeldDown, this));
- static const LLSD add_landmark_command("add_landmark");
- mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddAction, this, add_landmark_command));
- */
LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 29e9baa6cf..fbc0f09c50 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -35,7 +35,8 @@
#define LL_LLPANELMAININVENTORY_H
#include "llpanel.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+
#include "llfolderview.h"
class LLFolderViewItem;
diff --git a/indra/newview/llpanelmediasettingsgeneral.cpp b/indra/newview/llpanelmediasettingsgeneral.cpp
index 2cf56d5571..ad8a379cc1 100644
--- a/indra/newview/llpanelmediasettingsgeneral.cpp
+++ b/indra/newview/llpanelmediasettingsgeneral.cpp
@@ -322,13 +322,19 @@ void LLPanelMediaSettingsGeneral::updateMediaPreview()
{
if ( mHomeURL->getValue().asString().length() > 0 )
{
- mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+ if(mPreviewMedia->getCurrentNavUrl() != mHomeURL->getValue().asString())
+ {
+ mPreviewMedia->navigateTo( mHomeURL->getValue().asString() );
+ }
}
else
// new home URL will be empty if media is deleted so display a
// "preview goes here" data url page
{
- mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+ if(mPreviewMedia->getCurrentNavUrl() != CHECKERBOARD_DATA_URL)
+ {
+ mPreviewMedia->navigateTo( CHECKERBOARD_DATA_URL );
+ }
};
}
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index a5e9407a41..b1fbf789c6 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -1570,6 +1570,7 @@ void LLPanelObjectInventory::reset()
p.name = "task inventory";
p.task_id = getTaskUUID();
p.parent_panel = this;
+ p.tool_tip= p.name;
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
// this ensures that we never say "searching..." or "no items found"
mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
@@ -1711,6 +1712,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root
p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
p.root = mFolders;
p.listener = bridge;
+ p.tool_tip = p.name;
new_folder = LLUICtrlFactory::create<LLFolderViewFolder>(p);
new_folder->addToFolder(mFolders, mFolders);
new_folder->toggleOpen();
@@ -1751,6 +1753,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
p.icon_open = LLUI::getUIImage("Inv_FolderOpen");
p.root = mFolders;
p.listener = bridge;
+ p.tool_tip = p.name;
view = LLUICtrlFactory::create<LLFolderViewFolder>(p);
child_categories.put(new obj_folder_pair(obj,
(LLFolderViewFolder*)view));
@@ -1764,6 +1767,7 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
params.root(mFolders);
params.listener(bridge);
params.rect(LLRect());
+ params.tool_tip = params.name;
view = LLUICtrlFactory::create<LLFolderViewItem> (params);
}
view->addToFolder(folder, mFolders);
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 9ba94c8ca9..709525d4e2 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -54,6 +54,7 @@
#include "llfriendcard.h"
#include "llgroupactions.h"
#include "llgrouplist.h"
+#include "llinventoryobserver.h"
#include "llpanelpeoplemenus.h"
#include "llrecentpeople.h"
#include "llviewercontrol.h" // for gSavedSettings
@@ -447,6 +448,7 @@ LLPanelPeople::LLPanelPeople()
mFriendListUpdater = new LLFriendListUpdater(boost::bind(&LLPanelPeople::updateFriendList, this));
mNearbyListUpdater = new LLNearbyListUpdater(boost::bind(&LLPanelPeople::updateNearbyList, this));
mRecentListUpdater = new LLRecentListUpdater(boost::bind(&LLPanelPeople::updateRecentList, this));
+ mCommitCallbackRegistrar.add("People.addFriend", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
}
LLPanelPeople::~LLPanelPeople()
@@ -519,7 +521,6 @@ BOOL LLPanelPeople::postBuild()
LLPanel* groups_panel = getChild<LLPanel>(GROUP_TAB_NAME);
groups_panel->childSetAction("activate_btn", boost::bind(&LLPanelPeople::onActivateButtonClicked, this));
groups_panel->childSetAction("plus_btn", boost::bind(&LLPanelPeople::onGroupPlusButtonClicked, this));
- groups_panel->childSetAction("minus_btn", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this));
LLPanel* friends_panel = getChild<LLPanel>(FRIENDS_TAB_NAME);
friends_panel->childSetAction("add_btn", boost::bind(&LLPanelPeople::onAddFriendWizButtonClicked, this));
@@ -547,7 +548,6 @@ BOOL LLPanelPeople::postBuild()
boost::bind(&LLPanelPeople::onFriendsAccordionExpandedCollapsed, this, _2, mOnlineFriendList));
buttonSetAction("view_profile_btn", boost::bind(&LLPanelPeople::onViewProfileButtonClicked, this));
- buttonSetAction("add_friend_btn", boost::bind(&LLPanelPeople::onAddFriendButtonClicked, this));
buttonSetAction("group_info_btn", boost::bind(&LLPanelPeople::onGroupInfoButtonClicked, this));
buttonSetAction("chat_btn", boost::bind(&LLPanelPeople::onChatButtonClicked, this));
buttonSetAction("im_btn", boost::bind(&LLPanelPeople::onImButtonClicked, this));
@@ -568,6 +568,7 @@ BOOL LLPanelPeople::postBuild()
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
registrar.add("People.Group.Plus.Action", boost::bind(&LLPanelPeople::onGroupPlusMenuItemClicked, this, _2));
+ registrar.add("People.Group.Minus.Action", boost::bind(&LLPanelPeople::onGroupMinusButtonClicked, this));
registrar.add("People.Friends.ViewSort.Action", boost::bind(&LLPanelPeople::onFriendsViewSortMenuItemClicked, this, _2));
registrar.add("People.Nearby.ViewSort.Action", boost::bind(&LLPanelPeople::onNearbyViewSortMenuItemClicked, this, _2));
registrar.add("People.Groups.ViewSort.Action", boost::bind(&LLPanelPeople::onGroupsViewSortMenuItemClicked, this, _2));
@@ -706,7 +707,7 @@ void LLPanelPeople::updateButtons()
bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME);
bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
bool group_tab_active = (cur_tab == GROUP_TAB_NAME);
- bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
+ //bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
LLUUID selected_id;
std::vector<LLUUID> selected_uuids;
@@ -716,7 +717,6 @@ void LLPanelPeople::updateButtons()
buttonSetVisible("group_info_btn", group_tab_active);
buttonSetVisible("chat_btn", group_tab_active);
- buttonSetVisible("add_friend_btn", nearby_tab_active || recent_tab_active);
buttonSetVisible("view_profile_btn", !group_tab_active);
buttonSetVisible("im_btn", !group_tab_active);
buttonSetVisible("call_btn", !group_tab_active);
@@ -749,7 +749,9 @@ void LLPanelPeople::updateButtons()
is_friend = LLAvatarTracker::instance().getBuddyInfo(selected_id) != NULL;
}
- childSetEnabled("add_friend_btn", !is_friend);
+ LLPanel* cur_panel = mTabContainer->getCurrentPanel();
+ if (cur_panel)
+ cur_panel->childSetEnabled("add_friend_btn", !is_friend);
}
buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
@@ -1193,7 +1195,7 @@ void LLPanelPeople::onCallButtonClicked()
if (selected_uuids.size() == 1)
{
// initiate a P2P voice chat with the selected user
- LLAvatarActions::startCall(selected_uuids[0]);
+ LLAvatarActions::startCall(getCurrentItemID());
}
else if (selected_uuids.size() > 1)
{
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index c30658755a..04b4226f82 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -346,11 +346,18 @@ void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
void LLPanelPicks::onOverflowButtonClicked()
{
- LLRect rect;
- childGetRect(XML_BTN_OVERFLOW, rect);
+ if (!mOverflowMenu->toggleVisibility())
+ return;
+ LLView* btn = getChild<LLView>(XML_BTN_OVERFLOW);
+
+ if (mOverflowMenu->getButtonRect().isEmpty())
+ {
+ mOverflowMenu->setButtonRect(btn);
+ }
mOverflowMenu->updateParent(LLMenuGL::sMenuContainer);
- mOverflowMenu->setButtonRect(rect, this);
+
+ LLRect rect = btn->getRect();
LLMenuGL::showPopup(this, mOverflowMenu, rect.mRight, rect.mTop);
}
@@ -687,6 +694,10 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+
+ // order does matter, showAccordion will invoke arrange for accordions.
+ mClassifiedsAccTab->changeOpenClose(false);
+ showAccordion("tab_classifieds", true);
}
else
{
@@ -740,6 +751,7 @@ void LLPanelPicks::createClassifiedInfoPanel()
{
mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedInfo));
+ mPanelClassifiedInfo->setEditClassifiedCallback(boost::bind(&LLPanelPicks::onPanelClassifiedEdit, this));
mPanelClassifiedInfo->setVisible(FALSE);
}
}
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 61501cc1b1..0c7cc9af38 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -542,16 +542,16 @@ void LLPanelPlaceProfile::updateCovenantText(const std::string &text)
void LLPanelPlaceProfile::onForSaleBannerClick()
{
LLViewerParcelMgr* mgr = LLViewerParcelMgr::getInstance();
- LLParcelSelectionHandle hParcel = mgr->getFloatingParcelSelection();
+ LLParcel* parcel = mgr->getFloatingParcelSelection()->getParcel();
LLViewerRegion* selected_region = mgr->getSelectionRegion();
- if(!hParcel.isNull() && selected_region)
+ if(parcel && selected_region)
{
- if(hParcel->getParcel()->getLocalID() == mSelectedParcelID &&
+ if(parcel->getLocalID() == mSelectedParcelID &&
mLastSelectedRegionID ==selected_region->getRegionID())
{
- if(hParcel->getParcel()->getSalePrice() - gStatusBar->getBalance() > 0)
+ if(parcel->getSalePrice() - gStatusBar->getBalance() > 0)
{
- LLFloaterBuyCurrency::buyCurrency("Buying selected land ", hParcel->getParcel()->getSalePrice());
+ LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice());
}
else
{
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 3d0fba9426..eb10d97b37 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -601,9 +601,12 @@ void LLPanelPlaces::onOverflowButtonClicked()
if (!menu->toggleVisibility())
return;
+ if (menu->getButtonRect().isEmpty())
+ {
+ menu->setButtonRect(mOverflowBtn);
+ }
menu->updateParent(LLMenuGL::sMenuContainer);
LLRect rect = mOverflowBtn->getRect();
- menu->setButtonRect(rect, this);
LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
}
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 5c3c260549..12ad070efd 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -44,6 +44,7 @@
#include "llbutton.h"
#include "llface.h"
#include "llcombobox.h"
+#include "lllayoutstack.h"
#include "llslider.h"
#include "llhudview.h"
#include "lliconctrl.h"
@@ -84,8 +85,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mUpdateSlider(true),
mClearFaceOnFade(false),
mCurrentRate(0.0),
- mMovieDuration(0.0),
- mUpdatePercent(0)
+ mMovieDuration(0.0)
{
mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -117,25 +117,69 @@ LLPanelPrimMediaControls::~LLPanelPrimMediaControls()
BOOL LLPanelPrimMediaControls::postBuild()
{
- LLButton* scroll_up_ctrl = getChild<LLButton>("scrollup");
- scroll_up_ctrl->setClickedCallback(onScrollUp, this);
- scroll_up_ctrl->setHeldDownCallback(onScrollUpHeld, this);
- scroll_up_ctrl->setMouseUpCallback(onScrollStop, this);
- LLButton* scroll_left_ctrl = getChild<LLButton>("scrollleft");
- scroll_left_ctrl->setClickedCallback(onScrollLeft, this);
- scroll_left_ctrl->setHeldDownCallback(onScrollLeftHeld, this);
- scroll_left_ctrl->setMouseUpCallback(onScrollStop, this);
- LLButton* scroll_right_ctrl = getChild<LLButton>("scrollright");
- scroll_right_ctrl->setClickedCallback(onScrollRight, this);
- scroll_right_ctrl->setHeldDownCallback(onScrollRightHeld, this);
- scroll_right_ctrl->setMouseUpCallback(onScrollStop, this);
- LLButton* scroll_down_ctrl = getChild<LLButton>("scrolldown");
- scroll_down_ctrl->setClickedCallback(onScrollDown, this);
- scroll_down_ctrl->setHeldDownCallback(onScrollDownHeld, this);
- scroll_down_ctrl->setMouseUpCallback(onScrollStop, this);
+ mMediaRegion = getChild<LLView>("media_region");
+ mBackCtrl = getChild<LLUICtrl>("back");
+ mFwdCtrl = getChild<LLUICtrl>("fwd");
+ mReloadCtrl = getChild<LLUICtrl>("reload");
+ mPlayCtrl = getChild<LLUICtrl>("play");
+ mPauseCtrl = getChild<LLUICtrl>("pause");
+ mStopCtrl = getChild<LLUICtrl>("stop");
+ mMediaStopCtrl = getChild<LLUICtrl>("media_stop");
+ mHomeCtrl = getChild<LLUICtrl>("home");
+ mUnzoomCtrl = getChild<LLUICtrl>("close"); // This is actually "unzoom"
+ mOpenCtrl = getChild<LLUICtrl>("new_window");
+ mZoomCtrl = getChild<LLUICtrl>("zoom_frame");
+ mMediaProgressPanel = getChild<LLPanel>("media_progress_indicator");
+ mMediaProgressBar = getChild<LLProgressBar>("media_progress_bar");
+ mMediaAddressCtrl = getChild<LLUICtrl>("media_address");
+ mMediaAddress = getChild<LLUICtrl>("media_address_url");
+ mMediaPlaySliderPanel = getChild<LLUICtrl>("media_play_position");
+ mMediaPlaySliderCtrl = getChild<LLUICtrl>("media_play_slider");
+ mVolumeCtrl = getChild<LLUICtrl>("media_volume");
+ mVolumeBtn = getChild<LLButton>("media_volume_button");
+ mVolumeUpCtrl = getChild<LLUICtrl>("volume_up");
+ mVolumeDownCtrl = getChild<LLUICtrl>("volume_down");
+ mWhitelistIcon = getChild<LLIconCtrl>("media_whitelist_flag");
+ mSecureLockIcon = getChild<LLIconCtrl>("media_secure_lock_flag");
+ mMediaControlsStack = getChild<LLLayoutStack>("media_controls");
+ mLeftBookend = getChild<LLUICtrl>("left_bookend");
+ mRightBookend = getChild<LLUICtrl>("right_bookend");
+ mBackgroundImage = LLUI::getUIImage(getString("control_background_image_name"));
+
+ // These are currently removed...but getChild creates a "dummy" widget.
+ // This class handles them missing.
+ mMediaPanelScroll = findChild<LLUICtrl>("media_panel_scroll");
+ mScrollUpCtrl = findChild<LLButton>("scrollup");
+ mScrollLeftCtrl = findChild<LLButton>("scrollleft");
+ mScrollRightCtrl = findChild<LLButton>("scrollright");
+ mScrollDownCtrl = findChild<LLButton>("scrolldown");
- LLUICtrl* media_address = getChild<LLUICtrl>("media_address");
- media_address->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
+ if (mScrollUpCtrl)
+ {
+ mScrollUpCtrl->setClickedCallback(onScrollUp, this);
+ mScrollUpCtrl->setHeldDownCallback(onScrollUpHeld, this);
+ mScrollUpCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+ if (mScrollLeftCtrl)
+ {
+ mScrollLeftCtrl->setClickedCallback(onScrollLeft, this);
+ mScrollLeftCtrl->setHeldDownCallback(onScrollLeftHeld, this);
+ mScrollLeftCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+ if (mScrollRightCtrl)
+ {
+ mScrollRightCtrl->setClickedCallback(onScrollRight, this);
+ mScrollRightCtrl->setHeldDownCallback(onScrollRightHeld, this);
+ mScrollRightCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+ if (mScrollDownCtrl)
+ {
+ mScrollDownCtrl->setClickedCallback(onScrollDown, this);
+ mScrollDownCtrl->setHeldDownCallback(onScrollDownHeld, this);
+ mScrollDownCtrl->setMouseUpCallback(onScrollStop, this);
+ }
+
+ mMediaAddress->setFocusReceivedCallback(boost::bind(&LLPanelPrimMediaControls::onInputURL, _1, this ));
mInactiveTimeout = gSavedSettings.getF32("MediaControlTimeout");
mControlFadeTime = gSavedSettings.getF32("MediaControlFadeTime");
@@ -249,88 +293,64 @@ void LLPanelPrimMediaControls::updateShape()
//
// Set the state of the buttons
//
- LLUICtrl* back_ctrl = getChild<LLUICtrl>("back");
- LLUICtrl* fwd_ctrl = getChild<LLUICtrl>("fwd");
- LLUICtrl* reload_ctrl = getChild<LLUICtrl>("reload");
- LLUICtrl* play_ctrl = getChild<LLUICtrl>("play");
- LLUICtrl* pause_ctrl = getChild<LLUICtrl>("pause");
- LLUICtrl* stop_ctrl = getChild<LLUICtrl>("stop");
- LLUICtrl* media_stop_ctrl = getChild<LLUICtrl>("media_stop");
- LLUICtrl* home_ctrl = getChild<LLUICtrl>("home");
- LLUICtrl* unzoom_ctrl = getChild<LLUICtrl>("close"); // This is actually "unzoom"
- LLUICtrl* open_ctrl = getChild<LLUICtrl>("new_window");
- LLUICtrl* zoom_ctrl = getChild<LLUICtrl>("zoom_frame");
- LLPanel* media_loading_panel = getChild<LLPanel>("media_progress_indicator");
- LLUICtrl* media_address_ctrl = getChild<LLUICtrl>("media_address");
- LLUICtrl* media_play_slider_panel = getChild<LLUICtrl>("media_play_position");
- LLUICtrl* media_play_slider_ctrl = getChild<LLUICtrl>("media_play_slider");
- LLUICtrl* volume_ctrl = getChild<LLUICtrl>("media_volume");
- LLButton* volume_btn = getChild<LLButton>("media_volume_button");
- LLUICtrl* volume_up_ctrl = getChild<LLUICtrl>("volume_up");
- LLUICtrl* volume_down_ctrl = getChild<LLUICtrl>("volume_down");
- LLIconCtrl* whitelist_icon = getChild<LLIconCtrl>("media_whitelist_flag");
- LLIconCtrl* secure_lock_icon = getChild<LLIconCtrl>("media_secure_lock_flag");
-
- LLUICtrl* media_panel_scroll = getChild<LLUICtrl>("media_panel_scroll");
- LLUICtrl* scroll_up_ctrl = getChild<LLUICtrl>("scrollup");
- LLUICtrl* scroll_left_ctrl = getChild<LLUICtrl>("scrollleft");
- LLUICtrl* scroll_right_ctrl = getChild<LLUICtrl>("scrollright");
- LLUICtrl* scroll_down_ctrl = getChild<LLUICtrl>("scrolldown");
// XXX RSP: TODO: FIXME: clean this up so that it is clearer what mode we are in,
// and that only the proper controls get made visible/enabled according to that mode.
- back_ctrl->setVisible(has_focus);
- fwd_ctrl->setVisible(has_focus);
- reload_ctrl->setVisible(has_focus);
- stop_ctrl->setVisible(false);
- home_ctrl->setVisible(has_focus);
- zoom_ctrl->setVisible(!is_zoomed);
- unzoom_ctrl->setVisible(has_focus && is_zoomed);
- open_ctrl->setVisible(true);
- media_address_ctrl->setVisible(has_focus && !mini_controls);
- media_play_slider_panel->setVisible(has_focus && !mini_controls);
- volume_ctrl->setVisible(false);
- volume_up_ctrl->setVisible(false);
- volume_down_ctrl->setVisible(false);
+ mBackCtrl->setVisible(has_focus);
+ mFwdCtrl->setVisible(has_focus);
+ mReloadCtrl->setVisible(has_focus);
+ mStopCtrl->setVisible(false);
+ mHomeCtrl->setVisible(has_focus);
+ mZoomCtrl->setVisible(!is_zoomed);
+ mUnzoomCtrl->setVisible(has_focus && is_zoomed);
+ mOpenCtrl->setVisible(true);
+ mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+ mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+ mVolumeCtrl->setVisible(false);
+ mVolumeUpCtrl->setVisible(false);
+ mVolumeDownCtrl->setVisible(false);
- whitelist_icon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
+ mWhitelistIcon->setVisible(!mini_controls && (media_data)?media_data->getWhiteListEnable():false);
// Disable zoom if HUD
- zoom_ctrl->setEnabled(!objectp->isHUDAttachment());
- unzoom_ctrl->setEnabled(!objectp->isHUDAttachment());
- secure_lock_icon->setVisible(false);
+ mZoomCtrl->setEnabled(!objectp->isHUDAttachment());
+ mUnzoomCtrl->setEnabled(!objectp->isHUDAttachment());
+ mSecureLockIcon->setVisible(false);
mCurrentURL = media_impl->getCurrentMediaURL();
- back_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
- fwd_ctrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
- stop_ctrl->setEnabled(has_focus && can_navigate);
- home_ctrl->setEnabled(has_focus && can_navigate);
+ mBackCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateBack() && can_navigate);
+ mFwdCtrl->setEnabled((media_impl != NULL) && media_impl->canNavigateForward() && can_navigate);
+ mStopCtrl->setEnabled(has_focus && can_navigate);
+ mHomeCtrl->setEnabled(has_focus && can_navigate);
LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;
if(media_plugin && media_plugin->pluginSupportsMediaTime())
{
- reload_ctrl->setEnabled(FALSE);
- reload_ctrl->setVisible(FALSE);
- media_stop_ctrl->setVisible(has_focus);
- home_ctrl->setVisible(FALSE);
- back_ctrl->setEnabled(has_focus);
- fwd_ctrl->setEnabled(has_focus);
- media_address_ctrl->setVisible(false);
- media_address_ctrl->setEnabled(false);
- media_play_slider_panel->setVisible(has_focus && !mini_controls);
- media_play_slider_panel->setEnabled(has_focus && !mini_controls);
+ mReloadCtrl->setEnabled(FALSE);
+ mReloadCtrl->setVisible(FALSE);
+ mMediaStopCtrl->setVisible(has_focus);
+ mHomeCtrl->setVisible(FALSE);
+ mBackCtrl->setEnabled(has_focus);
+ mFwdCtrl->setEnabled(has_focus);
+ mMediaAddressCtrl->setVisible(false);
+ mMediaAddressCtrl->setEnabled(false);
+ mMediaPlaySliderPanel->setVisible(has_focus && !mini_controls);
+ mMediaPlaySliderPanel->setEnabled(has_focus && !mini_controls);
- volume_ctrl->setVisible(has_focus);
- volume_up_ctrl->setVisible(has_focus);
- volume_down_ctrl->setVisible(has_focus);
- volume_ctrl->setEnabled(has_focus);
-
- whitelist_icon->setVisible(false);
- secure_lock_icon->setVisible(false);
- scroll_up_ctrl->setVisible(false);
- scroll_left_ctrl->setVisible(false);
- scroll_right_ctrl->setVisible(false);
- scroll_down_ctrl->setVisible(false);
- media_panel_scroll->setVisible(false);
+ mVolumeCtrl->setVisible(has_focus);
+ mVolumeUpCtrl->setVisible(has_focus);
+ mVolumeDownCtrl->setVisible(has_focus);
+ mVolumeCtrl->setEnabled(has_focus);
+
+ mWhitelistIcon->setVisible(false);
+ mSecureLockIcon->setVisible(false);
+ if (mMediaPanelScroll)
+ {
+ mMediaPanelScroll->setVisible(false);
+ mScrollUpCtrl->setVisible(false);
+ mScrollDownCtrl->setVisible(false);
+ mScrollRightCtrl->setVisible(false);
+ mScrollDownCtrl->setVisible(false);
+ }
F32 volume = media_impl->getVolume();
// movie's url changed
@@ -343,8 +363,8 @@ void LLPanelPrimMediaControls::updateShape()
if(mMovieDuration == 0)
{
mMovieDuration = media_plugin->getDuration();
- media_play_slider_ctrl->setValue(0);
- media_play_slider_ctrl->setEnabled(false);
+ mMediaPlaySliderCtrl->setValue(0);
+ mMediaPlaySliderCtrl->setEnabled(false);
}
// TODO: What if it's not fully loaded
@@ -352,48 +372,48 @@ void LLPanelPrimMediaControls::updateShape()
{
F64 current_time = media_plugin->getCurrentTime();
F32 percent = current_time / mMovieDuration;
- media_play_slider_ctrl->setValue(percent);
- media_play_slider_ctrl->setEnabled(true);
+ mMediaPlaySliderCtrl->setValue(percent);
+ mMediaPlaySliderCtrl->setEnabled(true);
}
// video vloume
if(volume <= 0.0)
{
- volume_up_ctrl->setEnabled(TRUE);
- volume_down_ctrl->setEnabled(FALSE);
+ mVolumeUpCtrl->setEnabled(TRUE);
+ mVolumeDownCtrl->setEnabled(FALSE);
media_impl->setVolume(0.0);
- volume_btn->setToggleState(true);
+ mVolumeBtn->setToggleState(true);
}
else if (volume >= 1.0)
{
- volume_up_ctrl->setEnabled(FALSE);
- volume_down_ctrl->setEnabled(TRUE);
+ mVolumeUpCtrl->setEnabled(FALSE);
+ mVolumeDownCtrl->setEnabled(TRUE);
media_impl->setVolume(1.0);
- volume_btn->setToggleState(false);
+ mVolumeBtn->setToggleState(false);
}
else
{
- volume_up_ctrl->setEnabled(TRUE);
- volume_down_ctrl->setEnabled(TRUE);
+ mVolumeUpCtrl->setEnabled(TRUE);
+ mVolumeDownCtrl->setEnabled(TRUE);
}
switch(result)
{
case LLPluginClassMediaOwner::MEDIA_PLAYING:
- play_ctrl->setEnabled(FALSE);
- play_ctrl->setVisible(FALSE);
- pause_ctrl->setEnabled(TRUE);
- pause_ctrl->setVisible(has_focus);
- media_stop_ctrl->setEnabled(TRUE);
+ mPlayCtrl->setEnabled(FALSE);
+ mPlayCtrl->setVisible(FALSE);
+ mPauseCtrl->setEnabled(TRUE);
+ mPauseCtrl->setVisible(has_focus);
+ mMediaStopCtrl->setEnabled(TRUE);
break;
case LLPluginClassMediaOwner::MEDIA_PAUSED:
default:
- pause_ctrl->setEnabled(FALSE);
- pause_ctrl->setVisible(FALSE);
- play_ctrl->setEnabled(TRUE);
- play_ctrl->setVisible(has_focus);
- media_stop_ctrl->setEnabled(FALSE);
+ mPauseCtrl->setEnabled(FALSE);
+ mPauseCtrl->setVisible(FALSE);
+ mPlayCtrl->setEnabled(TRUE);
+ mPlayCtrl->setVisible(has_focus);
+ mMediaStopCtrl->setEnabled(FALSE);
break;
}
}
@@ -408,33 +428,36 @@ void LLPanelPrimMediaControls::updateShape()
mCurrentURL.clear();
}
- play_ctrl->setVisible(FALSE);
- pause_ctrl->setVisible(FALSE);
- media_stop_ctrl->setVisible(FALSE);
- media_address_ctrl->setVisible(has_focus && !mini_controls);
- media_address_ctrl->setEnabled(has_focus && !mini_controls);
- media_play_slider_panel->setVisible(FALSE);
- media_play_slider_panel->setEnabled(FALSE);
-
- volume_ctrl->setVisible(FALSE);
- volume_up_ctrl->setVisible(FALSE);
- volume_down_ctrl->setVisible(FALSE);
- volume_ctrl->setEnabled(FALSE);
- volume_up_ctrl->setEnabled(FALSE);
- volume_down_ctrl->setEnabled(FALSE);
+ mPlayCtrl->setVisible(FALSE);
+ mPauseCtrl->setVisible(FALSE);
+ mMediaStopCtrl->setVisible(FALSE);
+ mMediaAddressCtrl->setVisible(has_focus && !mini_controls);
+ mMediaAddressCtrl->setEnabled(has_focus && !mini_controls);
+ mMediaPlaySliderPanel->setVisible(FALSE);
+ mMediaPlaySliderPanel->setEnabled(FALSE);
- scroll_up_ctrl->setVisible(has_focus);
- scroll_left_ctrl->setVisible(has_focus);
- scroll_right_ctrl->setVisible(has_focus);
- scroll_down_ctrl->setVisible(has_focus);
- media_panel_scroll->setVisible(has_focus);
+ mVolumeCtrl->setVisible(FALSE);
+ mVolumeUpCtrl->setVisible(FALSE);
+ mVolumeDownCtrl->setVisible(FALSE);
+ mVolumeCtrl->setEnabled(FALSE);
+ mVolumeUpCtrl->setEnabled(FALSE);
+ mVolumeDownCtrl->setEnabled(FALSE);
+
+ if (mMediaPanelScroll)
+ {
+ mMediaPanelScroll->setVisible(has_focus);
+ mScrollUpCtrl->setVisible(has_focus);
+ mScrollDownCtrl->setVisible(has_focus);
+ mScrollRightCtrl->setVisible(has_focus);
+ mScrollDownCtrl->setVisible(has_focus);
+ }
// TODO: get the secure lock bool from media plug in
std::string prefix = std::string("https://");
std::string test_prefix = mCurrentURL.substr(0, prefix.length());
LLStringUtil::toLower(test_prefix);
if(test_prefix == prefix)
{
- secure_lock_icon->setVisible(has_focus);
+ mSecureLockIcon->setVisible(has_focus);
}
if(mCurrentURL!=mPreviousURL)
@@ -445,17 +468,17 @@ void LLPanelPrimMediaControls::updateShape()
if(result == LLPluginClassMediaOwner::MEDIA_LOADING)
{
- reload_ctrl->setEnabled(FALSE);
- reload_ctrl->setVisible(FALSE);
- stop_ctrl->setEnabled(TRUE);
- stop_ctrl->setVisible(has_focus);
+ mReloadCtrl->setEnabled(FALSE);
+ mReloadCtrl->setVisible(FALSE);
+ mStopCtrl->setEnabled(TRUE);
+ mStopCtrl->setVisible(has_focus);
}
else
{
- reload_ctrl->setEnabled(TRUE);
- reload_ctrl->setVisible(has_focus);
- stop_ctrl->setEnabled(FALSE);
- stop_ctrl->setVisible(FALSE);
+ mReloadCtrl->setEnabled(TRUE);
+ mReloadCtrl->setVisible(has_focus);
+ mStopCtrl->setEnabled(FALSE);
+ mStopCtrl->setVisible(FALSE);
}
}
@@ -465,16 +488,15 @@ void LLPanelPrimMediaControls::updateShape()
//
// Handle progress bar
//
- mUpdatePercent = media_plugin->getProgressPercent();
- if(mUpdatePercent<100.0f)
- {
- media_loading_panel->setVisible(true);
- getChild<LLProgressBar>("media_progress_bar")->setPercent(mUpdatePercent);
- gFocusMgr.setTopCtrl(media_loading_panel);
+ if(LLPluginClassMediaOwner::MEDIA_LOADING == media_plugin->getStatus())
+ {
+ mMediaProgressPanel->setVisible(true);
+ mMediaProgressBar->setPercent(media_plugin->getProgressPercent());
+ gFocusMgr.setTopCtrl(mMediaProgressPanel);
}
else
{
- media_loading_panel->setVisible(false);
+ mMediaProgressPanel->setVisible(false);
gFocusMgr.setTopCtrl(NULL);
}
}
@@ -571,11 +593,10 @@ void LLPanelPrimMediaControls::updateShape()
// grow panel so that screenspace bounding box fits inside "media_region" element of HUD
LLRect media_controls_rect;
getParent()->screenRectToLocal(LLRect(screen_min.mX, screen_max.mY, screen_max.mX, screen_min.mY), &media_controls_rect);
- LLView* media_region = getChild<LLView>("media_region");
- media_controls_rect.mLeft -= media_region->getRect().mLeft;
- media_controls_rect.mBottom -= media_region->getRect().mBottom;
- media_controls_rect.mTop += getRect().getHeight() - media_region->getRect().mTop;
- media_controls_rect.mRight += getRect().getWidth() - media_region->getRect().mRight;
+ media_controls_rect.mLeft -= mMediaRegion->getRect().mLeft;
+ 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
@@ -651,6 +672,20 @@ void LLPanelPrimMediaControls::draw()
}
}
+ // Build rect for icon area in coord system of this panel
+ // Assumes layout_stack is a direct child of this panel
+ mMediaControlsStack->updateLayout();
+ LLRect icon_area = mMediaControlsStack->getRect();
+
+ // adjust to ignore space from left bookend padding
+ icon_area.mLeft += mLeftBookend->getRect().getWidth();
+
+ // ignore space from right bookend padding
+ icon_area.mRight -= mRightBookend->getRect().getWidth();
+
+ // get UI image
+ mBackgroundImage->draw( icon_area, UI_VERTEX_COLOR % alpha);
+
{
LLViewDrawContext context(alpha);
LLPanel::draw();
@@ -693,16 +728,12 @@ bool LLPanelPrimMediaControls::isMouseOver()
S32 x, y;
getWindow()->getCursorPosition(&cursor_pos_window);
getWindow()->convertCoords(cursor_pos_window, &cursor_pos_gl);
-
- LLView* controls_view = NULL;
- controls_view = getChild<LLView>("media_controls");
-
- //FIXME: rewrite as LLViewQuery or get hover set from LLViewerWindow?
- if(controls_view && controls_view->getVisible())
+
+ if(mMediaControlsStack->getVisible())
{
- controls_view->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
+ mMediaControlsStack->screenPointToLocal(cursor_pos_gl.mX, cursor_pos_gl.mY, &x, &y);
- LLView *hit_child = controls_view->childFromPoint(x, y);
+ LLView *hit_child = mMediaControlsStack->childFromPoint(x, y);
if(hit_child && hit_child->getVisible())
{
// This was useful for debugging both coordinate translation and view hieararchy problems...
@@ -984,8 +1015,7 @@ void LLPanelPrimMediaControls::onCommitURL()
{
focusOnTarget();
- LLUICtrl *media_address_ctrl = getChild<LLUICtrl>("media_address_url");
- std::string url = media_address_ctrl->getValue().asString();
+ std::string url = mMediaAddress->getValue().asString();
if(getTargetMediaImpl() && !url.empty())
{
getTargetMediaImpl()->navigateTo( url, "", true);
@@ -1014,19 +1044,18 @@ void LLPanelPrimMediaControls::onInputURL(LLFocusableElement* caller, void *user
void LLPanelPrimMediaControls::setCurrentURL()
{
#ifdef USE_COMBO_BOX_FOR_MEDIA_URL
- LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo");
- // redirects will navigate momentarily to about:blank, don't add to history
- if (media_address_combo && mCurrentURL != "about:blank")
- {
- media_address_combo->remove(mCurrentURL);
- media_address_combo->add(mCurrentURL, ADD_SORTED);
- media_address_combo->selectByValue(mCurrentURL);
- }
+// LLComboBox* media_address_combo = getChild<LLComboBox>("media_address_combo");
+// // redirects will navigate momentarily to about:blank, don't add to history
+// if (media_address_combo && mCurrentURL != "about:blank")
+// {
+// media_address_combo->remove(mCurrentURL);
+// media_address_combo->add(mCurrentURL, ADD_SORTED);
+// media_address_combo->selectByValue(mCurrentURL);
+// }
#else // USE_COMBO_BOX_FOR_MEDIA_URL
- LLLineEditor* media_address_url = getChild<LLLineEditor>("media_address_url");
- if (media_address_url && mCurrentURL != "about:blank")
+ if (mMediaAddress && mCurrentURL != "about:blank")
{
- media_address_url->setValue(mCurrentURL);
+ mMediaAddress->setValue(mCurrentURL);
}
#endif // USE_COMBO_BOX_FOR_MEDIA_URL
}
@@ -1035,12 +1064,11 @@ void LLPanelPrimMediaControls::onCommitSlider()
{
focusOnTarget();
- LLSlider* media_play_slider_ctrl = getChild<LLSlider>("media_play_slider");
LLViewerMediaImpl* media_impl = getTargetMediaImpl();
if (media_impl)
{
// get slider value
- F64 slider_value = media_play_slider_ctrl->getValue().asReal();
+ F64 slider_value = mMediaPlaySliderCtrl->getValue().asReal();
if(slider_value <= 0.0)
{
media_impl->stop();
@@ -1069,7 +1097,7 @@ void LLPanelPrimMediaControls::onCommitVolumeUp()
}
media_impl->setVolume(volume);
- getChild<LLButton>("media_volume")->setToggleState(false);
+ mVolumeBtn->setToggleState(false);
}
}
@@ -1089,7 +1117,7 @@ void LLPanelPrimMediaControls::onCommitVolumeDown()
}
media_impl->setVolume(volume);
- getChild<LLButton>("media_volume")->setToggleState(false);
+ mVolumeBtn->setToggleState(false);
}
}
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 3ec7aa2356..124fa9cce4 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -35,7 +35,11 @@
#include "llpanel.h"
#include "llviewermedia.h"
+class LLButton;
class LLCoordWindow;
+class LLIconCtrl;
+class LLLayoutStack;
+class LLProgressBar;
class LLViewerMediaImpl;
class LLPanelPrimMediaControls : public LLPanel
@@ -119,6 +123,44 @@ private:
LLViewerMediaImpl* getTargetMediaImpl();
LLViewerObject* getTargetObject();
LLPluginClassMedia* getTargetMediaPlugin();
+
+private:
+
+ LLView *mMediaRegion;
+ LLUICtrl *mBackCtrl;
+ LLUICtrl *mFwdCtrl;
+ LLUICtrl *mReloadCtrl;
+ LLUICtrl *mPlayCtrl;
+ LLUICtrl *mPauseCtrl;
+ LLUICtrl *mStopCtrl;
+ LLUICtrl *mMediaStopCtrl;
+ LLUICtrl *mHomeCtrl;
+ LLUICtrl *mUnzoomCtrl;
+ LLUICtrl *mOpenCtrl;
+ LLUICtrl *mZoomCtrl;
+ LLPanel *mMediaProgressPanel;
+ LLProgressBar *mMediaProgressBar;
+ LLUICtrl *mMediaAddressCtrl;
+ LLUICtrl *mMediaAddress;
+ LLUICtrl *mMediaPlaySliderPanel;
+ LLUICtrl *mMediaPlaySliderCtrl;
+ LLUICtrl *mVolumeCtrl;
+ LLButton *mVolumeBtn;
+ LLUICtrl *mVolumeUpCtrl;
+ LLUICtrl *mVolumeDownCtrl;
+ LLIconCtrl *mWhitelistIcon;
+ LLIconCtrl *mSecureLockIcon;
+ LLLayoutStack *mMediaControlsStack;
+ LLUICtrl *mLeftBookend;
+ LLUICtrl *mRightBookend;
+ LLUIImage* mBackgroundImage;
+
+ LLUICtrl *mMediaPanelScroll;
+ LLButton *mScrollUpCtrl;
+ LLButton *mScrollLeftCtrl;
+ LLButton *mScrollRightCtrl;
+ LLButton *mScrollDownCtrl;
+
bool mPauseFadeout;
bool mUpdateSlider;
bool mClearFaceOnFade;
@@ -137,8 +179,7 @@ private:
std::string mPreviousURL;
F64 mCurrentRate;
F64 mMovieDuration;
- int mUpdatePercent;
-
+
LLUUID mTargetObjectID;
S32 mTargetObjectFace;
LLUUID mTargetImplID;
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index f5367c0477..13bd059d45 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -130,6 +130,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
{
name.erase(found, moderator_indicator_len);
item->setName(name);
+ item->reshapeAvatarName();
}
}
}
@@ -151,6 +152,7 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
name += " ";
name += moderator_indicator;
item->setName(name);
+ item->reshapeAvatarName();
}
}
}
diff --git a/indra/newview/llpreview.h b/indra/newview/llpreview.h
index 506c135ca6..3b9f7f9882 100644
--- a/indra/newview/llpreview.h
+++ b/indra/newview/llpreview.h
@@ -37,7 +37,7 @@
#include "llresizehandle.h"
#include "llpointer.h"
#include "lluuid.h"
-#include "llinventorymodel.h" // LLInventoryObserver
+#include "llinventoryobserver.h"
#include <map>
class LLInventoryItem;
diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h
index a00f580e32..28a409d3ee 100644
--- a/indra/newview/llpreviewscript.h
+++ b/indra/newview/llpreviewscript.h
@@ -41,7 +41,6 @@
#include "lliconctrl.h"
#include "llframetimer.h"
-
class LLMessageSystem;
class LLTextEditor;
class LLButton;
@@ -52,6 +51,7 @@ struct LLEntryAndEdCore;
class LLMenuBarGL;
class LLFloaterScriptSearch;
class LLKeywordToken;
+class LLViewerInventoryItem;
// Inner, implementation class. LLPreviewScript and LLLiveLSLEditor each own one of these.
class LLScriptEdCore : public LLPanel
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index b667fbf5fd..81eb133b07 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -63,7 +63,7 @@ LLScreenChannelBase::LLScreenChannelBase(const LLUUID& id) :
,mCanStoreToasts(true)
,mHiddenToastsNum(0)
,mOverflowToastHidden(false)
- ,mIsHovering(false)
+ ,mHoveredToast(NULL)
,mControlHovering(false)
,mShowToasts(true)
{
@@ -216,8 +216,10 @@ void LLScreenChannel::deleteToast(LLToast* toast)
// update channel's Hovering state
// turning hovering off manually because onMouseLeave won't happen if a toast was closed using a keyboard
- if(toast->hasFocus())
- setHovering(false);
+ if(mHoveredToast == toast)
+ {
+ mHoveredToast = NULL;
+ }
// close the toast
toast->closeFloater();
@@ -352,7 +354,7 @@ void LLScreenChannel::modifyToastByNotificationID(LLUUID id, LLPanel* panel)
//--------------------------------------------------------------------------
void LLScreenChannel::redrawToasts()
{
- if(mToastList.size() == 0 || mIsHovering)
+ if(mToastList.size() == 0 || isHovering())
return;
hideToastsFromScreen();
@@ -453,10 +455,9 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
if(!mOverflowToastPanel)
return;
- mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::closeOverflowToastPanel, this));
+ mOverflowToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onOverflowToastHide, this));
LLTextBox* text_box = mOverflowToastPanel->getChild<LLTextBox>("toast_text");
- LLIconCtrl* icon = mOverflowToastPanel->getChild<LLIconCtrl>("icon");
std::string text = llformat(mOverflowFormatString.c_str(),mHiddenToastsNum);
if(mHiddenToastsNum == 1)
{
@@ -474,7 +475,6 @@ void LLScreenChannel::createOverflowToast(S32 bottom, F32 timer)
text_box->setValue(text);
text_box->setVisible(TRUE);
- icon->setVisible(TRUE);
mOverflowToastPanel->setVisible(TRUE);
}
@@ -532,7 +532,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));
LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
- LLIconCtrl* icon = mStartUpToastPanel->getChild<LLIconCtrl>("icon");
std::string mStartUpFormatString;
@@ -555,8 +554,6 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
text_box->setValue(text);
text_box->setVisible(TRUE);
- icon->setVisible(TRUE);
-
addChild(mStartUpToastPanel);
mStartUpToastPanel->setVisible(TRUE);
@@ -654,7 +651,14 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
// we must check this to prevent incorrect setting for hovering in a channel
std::map<LLToast*, bool>::iterator it_first, it_second;
S32 stack_size = mToastEventStack.size();
- mIsHovering = mouse_enter;
+ if(mouse_enter)
+ {
+ mHoveredToast = toast;
+ }
+ else
+ {
+ mHoveredToast = NULL;
+ }
switch(stack_size)
{
@@ -666,7 +670,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
if((*it_first).second && !mouse_enter && ((*it_first).first != toast) )
{
mToastEventStack.clear();
- mIsHovering = true;
+ mHoveredToast = toast;
}
else
{
@@ -678,7 +682,7 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
LL_ERRS ("LLScreenChannel::onToastHover: stack size error " ) << stack_size << llendl;
}
- if(!mIsHovering)
+ if(!isHovering())
redrawToasts();
}
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index fd31690622..f39b94b89d 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -93,9 +93,10 @@ public:
// Channel's behavior-functions
// set whether a channel will control hovering inside itself or not
virtual void setControlHovering(bool control) { mControlHovering = control; }
- // set Hovering flag for a channel
- virtual void setHovering(bool hovering) { mIsHovering = hovering; }
+
+ bool isHovering() { return mHoveredToast != NULL; }
+
void setCanStoreToasts(bool store) { mCanStoreToasts = store; }
void setDisplayToastsAlways(bool display_toasts) { mDisplayToastsAlways = display_toasts; }
@@ -117,7 +118,7 @@ public:
protected:
// Channel's flags
bool mControlHovering;
- bool mIsHovering;
+ LLToast* mHoveredToast;
bool mCanStoreToasts;
bool mDisplayToastsAlways;
bool mOverflowToastHidden;
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 9d2960fbed..a3efea7b7e 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -41,6 +41,7 @@
#include "llfloaterreg.h"
#include "llgroupactions.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllineeditor.h"
#include "llradiogroup.h"
#include "llviewercontrol.h"
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 34b3b00ff2..7711f3c733 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -354,7 +354,8 @@ bool LLSideTray::selectTabByName (const std::string& name)
return true;
}
-LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback)
+LLButton* LLSideTray::createButton (const std::string& name,const std::string& image,const std::string& tooltip,
+ LLUICtrl::commit_callback_t callback)
{
static LLSideTray::Params sidetray_params(LLUICtrlFactory::getDefaultParams<LLSideTray>());
@@ -375,6 +376,9 @@ LLButton* LLSideTray::createButton (const std::string& name,const std::string& i
LLButton* button = LLUICtrlFactory::create<LLButton> (bparams);
button->setLabel(name);
button->setClickedCallback(callback);
+
+ if(tooltip!="Home")
+ button->setToolTip(tooltip);
if(image.length())
{
@@ -413,12 +417,12 @@ void LLSideTray::createButtons ()
// change if the home screen becomes its own tab.
if (name == "sidebar_home")
{
- mCollapseButton = createButton("",sidebar_tab->mImage,
+ mCollapseButton = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),
boost::bind(&LLSideTray::onToggleCollapse, this));
}
else
{
- LLButton* button = createButton("",sidebar_tab->mImage,
+ LLButton* button = createButton("",sidebar_tab->mImage,sidebar_tab->getTabTitle(),
boost::bind(&LLSideTray::onTabButtonClick, this, name));
mTabButtons[name] = button;
}
@@ -669,6 +673,24 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para
return NULL;
}
+LLPanel* LLSideTray::getPanel (const std::string& panel_name)
+{
+ child_vector_const_iter_t child_it;
+ for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
+ {
+ LLView* view = (*child_it)->findChildView(panel_name,true);
+ if(view)
+ {
+ LLPanel* panel = dynamic_cast<LLPanel*>(view);
+ if(panel)
+ {
+ return panel;
+ }
+ }
+ }
+ return NULL;
+}
+
// *TODO: Eliminate magic constants.
static const S32 fake_offset = 132;
static const S32 fake_top_offset = 18;
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 5bb17eedd5..54652c1108 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -36,8 +36,8 @@
#include "llpanel.h"
#include "string"
-class LLSideTrayTab;
class LLAccordionCtrl;
+class LLSideTrayTab;
// added inheritance from LLDestroyClass<LLSideTray> to enable Side Tray perform necessary actions
// while disconnecting viewer in LLAppViewer::disconnectViewer().
@@ -97,6 +97,11 @@ public:
LLPanel* showPanel (const std::string& panel_name, const LLSD& params);
/*
+ * get the panel (don't show it or do anything else with it)
+ */
+ LLPanel* getPanel (const std::string& panel_name);
+
+ /*
* collapse SideBar, hiding visible tab and moving tab buttons
* to the right corner of the screen
*/
@@ -141,7 +146,8 @@ protected:
LLSideTrayTab* getTab (const std::string& name);
void createButtons ();
- LLButton* createButton (const std::string& name,const std::string& image,LLUICtrl::commit_callback_t callback);
+ LLButton* createButton (const std::string& name,const std::string& image,const std::string& tooltip,
+ LLUICtrl::commit_callback_t callback);
void arrange ();
void reflectCollapseChange();
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 8c5439d47e..6ca6734598 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -435,7 +435,7 @@ void LLSpatialGroup::clearDrawMap()
BOOL LLSpatialGroup::isRecentlyVisible() const
{
- return (LLDrawable::getCurrentFrame() - (S32)mVisible) < LLDrawable::getMinVisFrameRange() ;
+ return (LLDrawable::getCurrentFrame() - mVisible[LLViewerCamera::sCurCameraID]) < LLDrawable::getMinVisFrameRange() ;
}
BOOL LLSpatialGroup::isVisible() const
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 57ea018f25..51d53b2674 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -133,6 +133,16 @@ LLSpeakButton::~LLSpeakButton()
LLTransientFloaterMgr::getInstance()->removeControlView(mShowBtn);
}
+void LLSpeakButton::setSpeakToolTip(const std::string& msg)
+{
+ mSpeakBtn->setToolTip(msg);
+}
+
+void LLSpeakButton::setShowToolTip(const std::string& msg)
+{
+ mShowBtn->setToolTip(msg);
+}
+
void LLSpeakButton::onMouseDown_SpeakBtn()
{
bool down = true;
diff --git a/indra/newview/llspeakbutton.h b/indra/newview/llspeakbutton.h
index e213c562dd..02c8ab3890 100644
--- a/indra/newview/llspeakbutton.h
+++ b/indra/newview/llspeakbutton.h
@@ -62,6 +62,11 @@ public:
/*virtual*/ ~LLSpeakButton();
/*virtual*/ void draw();
+ // *HACK: Need to put tooltips in a translatable location,
+ // the panel that contains this button.
+ void setSpeakToolTip(const std::string& msg);
+ void setShowToolTip(const std::string& msg);
+
protected:
friend class LLUICtrlFactory;
LLSpeakButton(const Params& p);
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 2ed82b7d62..261bdbcfc0 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -359,6 +359,9 @@ void LLSpeakerMgr::updateSpeakerList()
LLPointer<LLSpeaker> LLSpeakerMgr::findSpeaker(const LLUUID& speaker_id)
{
+ //In some conditions map causes crash if it is empty(Windows only), adding check (EK)
+ if (mSpeakers.size() == 0)
+ return NULL;
speaker_map_t::iterator found_it = mSpeakers.find(speaker_id);
if (found_it == mSpeakers.end())
{
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 64dcd7b97f..d36ff1605e 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -873,6 +873,9 @@ bool idle_startup()
gViewerWindow->getWindow()->show();
display_startup();
+ //DEV-10530. do cleanup. remove at some later date. jan-2009
+ LLFloaterPreference::cleanupBadSetting();
+
// DEV-16927. The following code removes errant keystrokes that happen while the window is being
// first made visible.
#ifdef _WIN32
@@ -1688,8 +1691,11 @@ bool idle_startup()
//all categories loaded. lets create "My Favorites" category
gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE,true);
- // lets create "Friends" and "Friends/All" in the Inventory "Calling Cards" and fill it with buddies
- LLFriendCardsManager::instance().syncFriendsFolder();
+ // Checks whether "Friends" and "Friends/All" folders exist in "Calling Cards" folder,
+ // fetches their contents if needed and synchronizes it with buddies list.
+ // If the folders are not found they are created.
+ LLFriendCardsManager::instance().syncFriendCardsFolders();
+
// set up callbacks
llinfos << "Registering Callbacks" << llendl;
@@ -1900,9 +1906,6 @@ bool idle_startup()
//DEV-17797. get null folder. Any items found here moved to Lost and Found
LLInventoryModel::findLostItems();
- //DEV-10530. do cleanup. remove at some later date. jan-2009
- LLFloaterPreference::cleanupBadSetting();
-
LLStartUp::setStartupState( STATE_PRECACHE );
timeout.reset();
return FALSE;
@@ -2630,10 +2633,10 @@ void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
}
else
{
- LLAppearanceManager::wearOutfitByName(outfit_folder_name);
+ LLAppearanceManager::instance().wearOutfitByName(outfit_folder_name);
}
- LLAppearanceManager::wearOutfitByName(gestures);
- LLAppearanceManager::wearOutfitByName(COMMON_GESTURES_FOLDER);
+ LLAppearanceManager::instance().wearOutfitByName(gestures);
+ LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);
// This is really misnamed -- it means we have started loading
// an outfit/shape that will give the avatar a gender eventually. JC
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index 4dccdfd7e6..b649a0c38e 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -109,6 +109,7 @@ const S32 TEXT_HEIGHT = 18;
static void onClickBuyCurrency(void*);
static void onClickHealth(void*);
static void onClickScriptDebug(void*);
+static void onClickVolume(void*);
std::vector<std::string> LLStatusBar::sDays;
std::vector<std::string> LLStatusBar::sMonths;
@@ -116,6 +117,12 @@ const U32 LLStatusBar::MAX_DATE_STRING_LENGTH = 2000;
LLStatusBar::LLStatusBar(const LLRect& rect)
: LLPanel(),
+ mTextHealth(NULL),
+ mTextTime(NULL),
+ mSGBandwidth(NULL),
+ mSGPacketLoss(NULL),
+ mBtnBuyCurrency(NULL),
+ mBtnVolume(NULL),
mBalance(0),
mHealth(100),
mSquareMetersCredit(0),
@@ -148,6 +155,11 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mBtnBuyCurrency = getChild<LLButton>( "buycurrency" );
mBtnBuyCurrency->setClickedCallback( onClickBuyCurrency, this );
+ mBtnVolume = getChild<LLButton>( "volume_btn" );
+ mBtnVolume->setClickedCallback( onClickVolume, this );
+
+ gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
+
childSetAction("scriptout", onClickScriptDebug, this);
childSetAction("health", onClickHealth, this);
@@ -333,6 +345,10 @@ void LLStatusBar::refresh()
mSGBandwidth->setVisible(net_stats_visible);
mSGPacketLoss->setVisible(net_stats_visible);
childSetEnabled("stat_btn", net_stats_visible);
+
+ // update the master volume button state
+ BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
+ mBtnVolume->setToggleState(mute_audio);
}
void LLStatusBar::setVisibleForMouselook(bool visible)
@@ -488,6 +504,13 @@ static void onClickScriptDebug(void*)
LLFloaterScriptDebug::show(LLUUID::null);
}
+static void onClickVolume(void* data)
+{
+ // toggle the master mute setting
+ BOOL mute_audio = gSavedSettings.getBOOL("MuteAudio");
+ gSavedSettings.setBOOL("MuteAudio", !mute_audio);
+}
+
// sets the static variables necessary for the date
void LLStatusBar::setupDate()
{
@@ -562,6 +585,10 @@ BOOL can_afford_transaction(S32 cost)
return((cost <= 0)||((gStatusBar) && (gStatusBar->getBalance() >=cost)));
}
+void LLStatusBar::onVolumeChanged(const LLSD& newvalue)
+{
+ refresh();
+}
// Implements secondlife:///app/balance/request to request a L$ balance
// update via UDP message system. JC
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index d5629e6f1e..3ce3549961 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -91,9 +91,10 @@ private:
// simple method to setup the part that holds the date
void setupDate();
- static void onCommitSearch(LLUICtrl*, void* data);
- static void onClickSearch(void* data);
+ void onVolumeChanged(const LLSD& newvalue);
+
static void onClickStatGraph(void* data);
+
private:
LLTextBox *mTextHealth;
@@ -103,6 +104,7 @@ private:
LLStatGraph *mSGPacketLoss;
LLButton *mBtnBuyCurrency;
+ LLButton *mBtnVolume;
S32 mBalance;
S32 mHealth;
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index 4422c4b672..eada387945 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -90,9 +90,9 @@ BOOL LLSysWellWindow::postBuild()
void LLSysWellWindow::setMinimized(BOOL minimize)
{
// we don't show empty Message Well window
- if (!minimize)
+ if (!minimize && isWindowEmpty())
{
- setVisible(!isWindowEmpty());
+ return;
}
LLDockableFloater::setMinimized(minimize);
@@ -268,8 +268,11 @@ void LLSysWellWindow::toggleWindow()
{
setVisible(FALSE);
}
- //set window in foreground
- setFocus(getVisible());
+ else if(!isDocked())
+ {
+ // bring to front undocked floater
+ setVisible(TRUE);
+ }
}
//---------------------------------------------------------------------------------
@@ -501,14 +504,14 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
switch (im_chiclet_type)
{
case LLIMChiclet::TYPE_GROUP:
+ mChiclet = getChild<LLIMGroupChiclet>("group_chiclet");
+ break;
case LLIMChiclet::TYPE_AD_HOC:
- mChiclet = getChild<LLIMChiclet>("group_chiclet");
- childSetVisible("p2p_chiclet", false);
+ mChiclet = getChild<LLAdHocChiclet>("adhoc_chiclet");
break;
case LLIMChiclet::TYPE_UNKNOWN: // assign mChiclet a non-null value anyway
case LLIMChiclet::TYPE_IM:
- mChiclet = getChild<LLIMChiclet>("p2p_chiclet");
- childSetVisible("group_chiclet", false);
+ mChiclet = getChild<LLIMP2PChiclet>("p2p_chiclet");
break;
}
@@ -517,6 +520,7 @@ LLSysWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
mChiclet->setSessionId(sessionId);
mChiclet->setIMSessionName(name);
mChiclet->setOtherParticipantId(otherParticipantId);
+ mChiclet->setVisible(true);
LLTextBox* contactName = getChild<LLTextBox>("contact_name");
contactName->setValue(name);
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index 6a4b967487..c33c652935 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -834,9 +834,9 @@ bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
S32 idx = openAndReadEntry(id, entry, false);
if (idx < 0)
{
- // TODO: change to llwarns
- llerrs << "Failed to open entry: " << id << llendl;
- removeFromCache(id);
+ llwarns << "Failed to open entry: " << id << llendl;
+ removeHeaderCacheEntry(id);
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
return false;
}
else if (oldbodysize != entry.mBodySize)
@@ -1002,7 +1002,7 @@ void LLTextureCache::closeHeaderEntriesFile()
void LLTextureCache::readEntriesHeader()
{
// mHeaderEntriesInfo initializes to default values so safe not to read it
- llassert_always(mHeaderAPRFile == NULL);
+ llassert_always(mHeaderAPRFile == NULL);
if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool()))
{
LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
@@ -1192,7 +1192,7 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)
// Called from either the main thread or the worker thread
void LLTextureCache::readHeaderCache()
{
- LLMutexLock lock(&mHeaderMutex);
+ mHeaderMutex.lock();
mLRU.clear(); // always clear the LRU
@@ -1212,28 +1212,29 @@ void LLTextureCache::readHeaderCache()
if (num_entries)
{
U32 empty_entries = 0;
- typedef std::pair<U32, LLUUID> lru_data_t;
+ typedef std::pair<U32, S32> lru_data_t;
std::set<lru_data_t> lru;
- std::vector<LLUUID> purge_list;
+ std::set<LLUUID> purge_list;
for (U32 i=0; i<num_entries; i++)
{
Entry& entry = entries[i];
const LLUUID& id = entry.mID;
if (entry.mImageSize < 0)
{
- // This will be in the Free List, don't put it in the LRY
+ // This will be in the Free List, don't put it in the LRU
++empty_entries;
}
else
{
- lru.insert(std::make_pair(entry.mTime, id));
+ lru.insert(std::make_pair(entry.mTime, i));
if (entry.mBodySize > 0)
{
if (entry.mBodySize > entry.mImageSize)
{
// Shouldn't happen, failsafe only
llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
- purge_list.push_back(id);
+ purge_list.insert(entry.mID);
+ entry.mImageSize = -1; // empty/available
}
}
}
@@ -1243,22 +1244,31 @@ void LLTextureCache::readHeaderCache()
// Special case: cache size was reduced, need to remove entries
// Note: After we prune entries, we will call this again and create the LRU
U32 entries_to_purge = (num_entries-empty_entries) - sCacheMaxEntries;
+ llinfos << "Texture Cache Entries: " << num_entries << " Max: " << sCacheMaxEntries << " Empty: " << empty_entries << " Purging: " << entries_to_purge << llendl;
if (entries_to_purge > 0)
{
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- purge_list.push_back(iter->second);
- if (--entries_to_purge <= 0)
- break;
+ S32 idx = iter->second;
+ if (entries[idx].mImageSize >= 0)
+ {
+ purge_list.insert(entries[idx].mID);
+ entries[idx].mImageSize = -1;
+ if (purge_list.size() >= entries_to_purge)
+ break;
+ }
}
}
+ llassert_always(purge_list.size() >= entries_to_purge);
}
else
{
S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- mLRU.insert(iter->second);
+ S32 idx = iter->second;
+ const LLUUID& id = entries[idx].mID;
+ mLRU.insert(id);
// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
if (--lru_entries <= 0)
break;
@@ -1267,9 +1277,12 @@ void LLTextureCache::readHeaderCache()
if (purge_list.size() > 0)
{
- for (std::vector<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+ for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
{
- removeFromCache(*iter);
+ const LLUUID& id = *iter;
+ bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1
+ llassert_always(res);
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
}
// If we removed any entries, we need to rebuild the entries list,
// write the header, and call this again
@@ -1285,7 +1298,9 @@ void LLTextureCache::readHeaderCache()
llassert_always(new_entries.size() <= sCacheMaxEntries);
mHeaderEntriesInfo.mEntries = new_entries.size();
writeEntriesAndClose(new_entries);
+ mHeaderMutex.unlock(); // unlock the mutex before calling again
readHeaderCache(); // repeat with new entries file
+ mHeaderMutex.lock();
}
else
{
@@ -1293,6 +1308,7 @@ void LLTextureCache::readHeaderCache()
}
}
}
+ mHeaderMutex.unlock();
}
//////////////////////////////////////////////////////////////////////////////
@@ -1307,6 +1323,7 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
for (S32 i=0; i<16; i++)
{
std::string dirname = mTexturesDirName + delem + subdirs[i];
+ llinfos << "Deleting files in directory: " << dirname << llendl;
gDirUtilp->deleteFilesInDir(dirname,mask);
if (purge_directories)
{
@@ -1337,9 +1354,12 @@ void LLTextureCache::purgeTextures(bool validate)
return;
}
- // *FIX:Mani - watchdog off.
- LLAppViewer::instance()->pauseMainloopTimeout();
-
+ if (!mThreaded)
+ {
+ // *FIX:Mani - watchdog off.
+ LLAppViewer::instance()->pauseMainloopTimeout();
+ }
+
LLMutexLock lock(&mHeaderMutex);
llinfos << "TEXTURE CACHE: Purging." << llendl;
@@ -1486,7 +1506,7 @@ S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
// Writes imagesize to the header, updates timestamp
S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
{
- LLMutexLock lock(&mHeaderMutex);
+ mHeaderMutex.lock();
llassert_always(imagesize >= 0);
Entry entry;
S32 idx = openAndReadEntry(id, entry, true);
@@ -1494,11 +1514,15 @@ S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
{
entry.mImageSize = imagesize;
writeEntryAndClose(idx, entry);
+ mHeaderMutex.unlock();
}
else // retry
{
+ mHeaderMutex.unlock();
readHeaderCache(); // We couldn't write an entry, so refresh the LRU
+ mHeaderMutex.lock();
llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
+ mHeaderMutex.unlock();
idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion
}
return idx;
@@ -1541,23 +1565,24 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
{
lockWorkers();
handle_map_t::iterator iter = mReaders.find(handle);
- llassert_always(iter != mReaders.end() || abort);
- LLTextureCacheWorker* worker = iter->second;
- if (!worker)
- return false;
- bool res = worker->complete();
- if (res || abort)
+ LLTextureCacheWorker* worker = NULL;
+ bool complete = false;
+ if (iter != mReaders.end())
+ {
+ worker = iter->second;
+ complete = worker->complete();
+ }
+ if (worker && (complete || abort))
{
- mReaders.erase(handle);
+ mReaders.erase(iter);
unlockWorkers();
worker->scheduleDelete();
- return true;
}
else
{
unlockWorkers();
- return false;
}
+ return (complete || abort);
}
LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 priority,
@@ -1623,24 +1648,20 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
//////////////////////////////////////////////////////////////////////////////
// Called from MAIN thread (endWork())
-
+// Ensure that mHeaderMutex is locked first!
bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
{
- if (!mReadOnly)
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ if (idx >= 0)
{
- LLMutexLock lock(&mHeaderMutex);
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- if (idx >= 0)
- {
- entry.mImageSize = -1;
- entry.mBodySize = 0;
- writeEntryAndClose(idx, entry);
- mFreeList.insert(idx);
- mHeaderIDMap.erase(id);
- mTexturesSizeMap.erase(id);
- return true;
- }
+ entry.mImageSize = -1;
+ entry.mBodySize = 0;
+ writeEntryAndClose(idx, entry);
+ mFreeList.insert(idx);
+ mHeaderIDMap.erase(id);
+ mTexturesSizeMap.erase(id);
+ return true;
}
return false;
}
@@ -1650,6 +1671,7 @@ void LLTextureCache::removeFromCache(const LLUUID& id)
//llwarns << "Removing texture from cache: " << id << llendl;
if (!mReadOnly)
{
+ LLMutexLock lock(&mHeaderMutex);
removeHeaderCacheEntry(id);
LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index de00ca8420..5f7c2f5080 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -48,7 +48,7 @@
#include "llfoldervieweventlistener.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
-#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
#include "lllineeditor.h"
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index c918f98895..6f3dabe5a7 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -524,6 +524,7 @@ void LLTextureFetchWorker::setDesiredDiscard(S32 discard, S32 size)
mDesiredSize = size;
prioritize = true;
}
+ mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);
if ((prioritize && mState == INIT) || mState == DONE)
{
mState = INIT;
@@ -613,6 +614,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mCacheReadHandle = LLTextureCache::nullHandle();
mCacheWriteHandle = LLTextureCache::nullHandle();
mState = LOAD_FROM_TEXTURE_CACHE;
+ mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE); // min desired size is TEXTURE_CACHE_ENTRY_SIZE
LL_DEBUGS("Texture") << mID << ": Priority: " << llformat("%8.0f",mImagePriority)
<< " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;
// fall through
@@ -681,7 +683,6 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == CACHE_POST)
{
- mDesiredSize = llmax(mDesiredSize, TEXTURE_CACHE_ENTRY_SIZE);
mCachedSize = mFormattedImage.notNull() ? mFormattedImage->getDataSize() : 0;
// Successfully loaded
if ((mCachedSize >= mDesiredSize) || mHaveAllData)
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 903df21e78..ed2cedbd10 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -225,6 +225,7 @@ void LLToast::setVisible(BOOL show)
{
mTimer.start();
}
+ LLModalDialog::setFrontmost(FALSE);
}
LLPanel::setVisible(show);
if(mPanel)
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index c02fd7a5ef..1ea5f515b7 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -50,14 +50,26 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
mMessage = getChild<LLTextBox>("message");
mReplyBtn = getChild<LLButton>("reply");
- mMessage->setValue(p.message);
+ LLStyle::Params style_params;
+ //Handle IRC styled /me messages.
+ std::string prefix = p.message.substr(0, 4);
+ if (prefix == "/me " || prefix == "/me'")
+ {
+ mMessage->clear();
+ style_params.font.style= "ITALIC";
+ mMessage->appendText(p.from + " ", FALSE, style_params);
+ style_params.font.style= "UNDERLINE";
+ mMessage->appendText(p.message.substr(3), FALSE, style_params);
+ }
+ else
+ mMessage->setValue(p.message);
mUserName->setValue(p.from);
mTime->setValue(p.time);
mSessionID = p.session_id;
mNotification = p.notification;
// if message comes from the system - there shouldn't be a reply btn
- if(p.from == "Second Life")
+ if(p.from == SYSTEM_FROM)
{
mAvatar->setVisible(FALSE);
sys_msg_icon->setVisible(TRUE);
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 0c23947a8c..48b68e4292 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -128,6 +128,7 @@ mAddedDefaultBtn(false)
// *TODO: magic numbers(???) - copied from llnotify.cpp(250)
const S32 MAX_LENGTH = 512 + 20 + DB_FIRST_NAME_BUF_SIZE + DB_LAST_NAME_BUF_SIZE + DB_INV_ITEM_NAME_BUF_SIZE;
+ mTextBox->setMaxTextLength(MAX_LENGTH);
mTextBox->setVisible(TRUE);
mTextBox->setValue(notification->getMessage());
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 959cb3f182..fbd86d0edf 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -2508,7 +2508,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
if(drop)
{
BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
- LLAppearanceManager::wearInventoryCategory(category, false, append);
+ LLAppearanceManager::instance().wearInventoryCategory(category, false, append);
}
return ACCEPT_YES_MULTI;
}
@@ -2516,7 +2516,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
{
if(drop)
{
- LLAppearanceManager::wearInventoryCategory(category, true, false);
+ LLAppearanceManager::instance().wearInventoryCategory(category, true, false);
}
return ACCEPT_YES_MULTI;
}
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d49ea5109d..9c8fca3552 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -526,7 +526,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
}
static LLCachedControl<bool> enable_highlight(
- gSavedSettings, "RenderHighlightEnable", false);
+ gSavedSettings, "RenderHoverGlowEnable", false);
LLDrawable* drawable = NULL;
if (enable_highlight && show_highlight && object)
{
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 1a61717658..407cc23d0d 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -55,6 +55,7 @@
#include "llhudtext.h"
#include "llhudview.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "lllandmarklist.h"
#include "llsky.h"
#include "llui.h"
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index a3daca6fa4..9e064d8135 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -364,9 +364,9 @@ bool LLURLDispatcher::dispatchRightClick(const std::string& url)
bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url)
{
// *NOTE: Text editors are considered sources of trusted URLs
- // in order to make objectim and avatar profile links in chat
- // history work. While a malicious resident could chat an app
- // SLURL, the receiving resident will see it and must affirmatively
+ // in order to make avatar profile links in chat history work.
+ // While a malicious resident could chat an app SLURL, the
+ // receiving resident will see it and must affirmatively
// click on it.
// *TODO: Make this trust model more refined. JC
const bool trusted_browser = true;
diff --git a/indra/newview/llviewerassettype.cpp b/indra/newview/llviewerassettype.cpp
index c974171c2c..b382ff6306 100644
--- a/indra/newview/llviewerassettype.cpp
+++ b/indra/newview/llviewerassettype.cpp
@@ -71,7 +71,6 @@ LLViewerAssetDictionary::LLViewerAssetDictionary()
addEntry(LLViewerAssetType::AT_OBJECT, new ViewerAssetEntry(DAD_OBJECT));
addEntry(LLViewerAssetType::AT_NOTECARD, new ViewerAssetEntry(DAD_NOTECARD));
addEntry(LLViewerAssetType::AT_CATEGORY, new ViewerAssetEntry(DAD_CATEGORY));
- addEntry(LLViewerAssetType::AT_ROOT_CATEGORY, new ViewerAssetEntry(DAD_ROOT_CATEGORY));
addEntry(LLViewerAssetType::AT_LSL_TEXT, new ViewerAssetEntry(DAD_SCRIPT));
addEntry(LLViewerAssetType::AT_LSL_BYTECODE, new ViewerAssetEntry(DAD_NONE));
addEntry(LLViewerAssetType::AT_TEXTURE_TGA, new ViewerAssetEntry(DAD_NONE));
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
new file mode 100644
index 0000000000..d65a060bbc
--- /dev/null
+++ b/indra/newview/llviewerchat.cpp
@@ -0,0 +1,203 @@
+/**
+ * @file llviewerchat.cpp
+ * @brief Builds menus out of items.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-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 "llviewerchat.h"
+
+// newview includes
+#include "llagent.h" // gAgent
+#include "lluicolortable.h"
+#include "llviewercontrol.h" // gSavedSettings
+
+// LLViewerChat
+
+//static
+void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
+{
+ if(chat.mMuted)
+ {
+ r_color= LLUIColorTable::instance().getColor("LtGray");
+ }
+ else
+ {
+ switch(chat.mSourceType)
+ {
+ case CHAT_SOURCE_SYSTEM:
+ r_color = LLUIColorTable::instance().getColor("SystemChatColor");
+ break;
+ case CHAT_SOURCE_AGENT:
+ if (chat.mFromID.isNull())
+ {
+ r_color = LLUIColorTable::instance().getColor("SystemChatColor");
+ }
+ else
+ {
+ if(gAgentID == chat.mFromID)
+ {
+ r_color = LLUIColorTable::instance().getColor("UserChatColor");
+ }
+ else
+ {
+ r_color = LLUIColorTable::instance().getColor("AgentChatColor");
+ }
+ }
+ break;
+ case CHAT_SOURCE_OBJECT:
+ if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+ {
+ r_color = LLUIColorTable::instance().getColor("ScriptErrorColor");
+ }
+ else if ( chat.mChatType == CHAT_TYPE_OWNER )
+ {
+ r_color = LLUIColorTable::instance().getColor("llOwnerSayChatColor");
+ }
+ else
+ {
+ r_color = LLUIColorTable::instance().getColor("ObjectChatColor");
+ }
+ break;
+ default:
+ r_color.setToWhite();
+ }
+
+ if (!chat.mPosAgent.isExactlyZero())
+ {
+ LLVector3 pos_agent = gAgent.getPositionAgent();
+ F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+ if (distance > gAgent.getNearChatRadius())
+ {
+ // diminish far-off chat
+ r_color.mV[VALPHA] = 0.8f;
+ }
+ }
+ }
+}
+
+
+//static
+void LLViewerChat::getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha)
+{
+ if(chat.mMuted)
+ {
+ r_color_name = "LtGray";
+ }
+ else
+ {
+ switch(chat.mSourceType)
+ {
+ case CHAT_SOURCE_SYSTEM:
+ r_color_name = "SystemChatColor";
+ break;
+
+ case CHAT_SOURCE_AGENT:
+ if (chat.mFromID.isNull())
+ {
+ r_color_name = "SystemChatColor";
+ }
+ else
+ {
+ if(gAgentID == chat.mFromID)
+ {
+ r_color_name = "UserChatColor";
+ }
+ else
+ {
+ r_color_name = "AgentChatColor";
+ }
+ }
+ break;
+
+ case CHAT_SOURCE_OBJECT:
+ if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
+ {
+ r_color_name = "ScriptErrorColor";
+ }
+ else if ( chat.mChatType == CHAT_TYPE_OWNER )
+ {
+ r_color_name = "llOwnerSayChatColor";
+ }
+ else
+ {
+ r_color_name = "ObjectChatColor";
+ }
+ break;
+ default:
+ r_color_name = "White";
+ }
+
+ if (!chat.mPosAgent.isExactlyZero())
+ {
+ LLVector3 pos_agent = gAgent.getPositionAgent();
+ F32 distance = dist_vec(pos_agent, chat.mPosAgent);
+ if (distance > gAgent.getNearChatRadius())
+ {
+ // diminish far-off chat
+ r_color_alpha = 0.8f;
+ }
+ else
+ {
+ r_color_alpha = 1.0f;
+ }
+ }
+ }
+
+}
+
+
+//static
+LLFontGL* LLViewerChat::getChatFont()
+{
+ S32 font_size = gSavedSettings.getS32("ChatFontSize");
+ LLFontGL* fontp = NULL;
+ switch(font_size)
+ {
+ case 0:
+ fontp = LLFontGL::getFontSansSerifSmall();
+ break;
+ default:
+ case 1:
+ fontp = LLFontGL::getFontSansSerif();
+ break;
+ case 2:
+ fontp = LLFontGL::getFontSansSerifBig();
+ break;
+ }
+
+ return fontp;
+
+}
+
+//static
+S32 LLViewerChat::getChatFontSize()
+{
+ return gSavedSettings.getS32("ChatFontSize");
+}
diff --git a/indra/newview/llviewerchat.h b/indra/newview/llviewerchat.h
new file mode 100644
index 0000000000..d8840d5dd2
--- /dev/null
+++ b/indra/newview/llviewerchat.h
@@ -0,0 +1,53 @@
+/**
+ * @file llviewerchat.h
+ * @brief wrapper of LLChat in viewer
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-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_LLVIEWERCHAT_H
+#define LL_LLVIEWERCHAT_H
+
+#include "llchat.h"
+#include "llfontgl.h"
+#include "v4color.h"
+
+
+class LLViewerChat
+{
+public:
+ static void getChatColor(const LLChat& chat, LLColor4& r_color);
+ static void getChatColor(const LLChat& chat, std::string& r_color_name, F32& r_color_alpha);
+ static LLFontGL* getChatFont();
+ static S32 getChatFontSize();
+
+
+
+};
+
+#endif
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index edbac69e1b..7772f613f0 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -112,6 +112,7 @@
#include "llinspectavatar.h"
#include "llinspectgroup.h"
#include "llinspectobject.h"
+#include "llinspectremoteobject.h"
#include "llmediaremotectrl.h"
#include "llmoveview.h"
#include "llnearbychat.h"
@@ -176,6 +177,7 @@ void LLViewerFloaterReg::registerFloaters()
LLInspectAvatarUtil::registerFloater();
LLInspectGroupUtil::registerFloater();
LLInspectObjectUtil::registerFloater();
+ LLInspectRemoteObjectUtil::registerFloater();
LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>);
LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>);
@@ -195,7 +197,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
LLFloaterReg::add("openobject", "floater_openobject.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterOpenObject>);
-
+ LLFloaterReg::add("outgoing_call", "floater_outgoing_call.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutgoingCallDialog>);
LLFloaterReg::add("parcel_info", "floater_preview_url.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterParcelInfo>);
LLFloaterPayUtil::registerFloater();
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 384538364f..6aabcb11b8 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -109,8 +109,7 @@ LLViewerFolderDictionary::LLViewerFolderDictionary()
addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga"));
addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga"));
addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga"));
- addEntry(LLFolderType::FT_CATEGORY, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga"));
- addEntry(LLFolderType::FT_ROOT_CATEGORY, new ViewerFolderEntry("Inventory", ""));
+ addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", ""));
addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga"));
addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga"));
addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga"));
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 493457704b..70490d3a6e 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -54,6 +54,8 @@
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signals2.hpp>
+/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "AutoPlayMedia";
+
// Move this to its own file.
LLViewerMediaEventEmitter::~LLViewerMediaEventEmitter()
@@ -135,9 +137,19 @@ public:
LLMimeDiscoveryResponder( viewer_media_t media_impl)
: mMediaImpl(media_impl),
mInitialized(false)
- {}
-
+ {
+ if(mMediaImpl->mMimeTypeProbe != NULL)
+ {
+ llerrs << "impl already has an outstanding responder" << llendl;
+ }
+
+ mMediaImpl->mMimeTypeProbe = this;
+ }
+ ~LLMimeDiscoveryResponder()
+ {
+ disconnectOwner();
+ }
virtual void completedHeader(U32 status, const std::string& reason, const LLSD& content)
{
@@ -149,23 +161,63 @@ public:
virtual void error( U32 status, const std::string& reason )
{
- // completeAny(status, "none/none");
+ if(status == 401)
+ {
+ // This is the "you need to authenticate" status.
+ // Treat this like an html page.
+ completeAny(status, "text/html");
+ }
+ else
+ {
+ llwarns << "responder failed with status " << status << ", reason " << reason << llendl;
+
+ if(mMediaImpl)
+ {
+ mMediaImpl->mMediaSourceFailed = true;
+ }
+ }
}
void completeAny(U32 status, const std::string& mime_type)
{
- if(!mInitialized && ! mime_type.empty())
+ // the call to initializeMedia may disconnect the responder, which will clear mMediaImpl.
+ // Make a local copy so we can call loadURI() afterwards.
+ LLViewerMediaImpl *impl = mMediaImpl;
+
+ if(impl && !mInitialized && ! mime_type.empty())
{
- if(mMediaImpl->initializeMedia(mime_type))
+ if(impl->initializeMedia(mime_type))
{
mInitialized = true;
- mMediaImpl->loadURI();
+ impl->loadURI();
+ disconnectOwner();
}
}
}
+
+ void cancelRequest()
+ {
+ disconnectOwner();
+ }
+
+private:
+ void disconnectOwner()
+ {
+ if(mMediaImpl)
+ {
+ if(mMediaImpl->mMimeTypeProbe != this)
+ {
+ llerrs << "internal error: mMediaImpl->mMimeTypeProbe != this" << llendl;
+ }
- public:
- viewer_media_t mMediaImpl;
+ mMediaImpl->mMimeTypeProbe = NULL;
+ }
+ mMediaImpl = NULL;
+ }
+
+
+public:
+ LLViewerMediaImpl *mMediaImpl;
bool mInitialized;
};
static LLViewerMedia::impl_list sViewerMediaImplList;
@@ -272,7 +324,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
// do a navigate.
- if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))) && !update_from_self)
+ if((was_loaded || (media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))) && !update_from_self)
{
needs_navigate = (media_entry->getCurrentURL() != previous_url);
}
@@ -289,7 +341,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
media_impl->setHomeURL(media_entry->getHomeURL());
- if(media_entry->getAutoPlay() && gSavedSettings.getBOOL("AutoPlayMedia"))
+ if(media_entry->getAutoPlay() && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))
{
needs_navigate = true;
}
@@ -489,6 +541,16 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView
// The item with user focus always comes to the front of the list, period.
return false;
}
+ else if(i1->isParcelMedia())
+ {
+ // The parcel media impl sorts above all other inworld media, unless one has focus.
+ return true;
+ }
+ else if(i2->isParcelMedia())
+ {
+ // The parcel media impl sorts above all other inworld media, unless one has focus.
+ return false;
+ }
else if(i1->getUsedInUI() && !i2->getUsedInUI())
{
// i1 is a UI element, i2 is not. This makes i1 "less than" i2, so it sorts earlier in our list.
@@ -499,14 +561,14 @@ bool LLViewerMedia::priorityComparitor(const LLViewerMediaImpl* i1, const LLView
// i2 is a UI element, i1 is not. This makes i2 "less than" i1, so it sorts earlier in our list.
return false;
}
- else if(i1->isParcelMedia())
+ else if(i1->isPlayable() && !i2->isPlayable())
{
- // The parcel media impl sorts above all other inworld media, unless one has focus.
+ // Playable items sort above ones that wouldn't play even if they got high enough priority
return true;
}
- else if(i2->isParcelMedia())
+ else if(!i1->isPlayable() && i2->isPlayable())
{
- // The parcel media impl sorts above all other inworld media, unless one has focus.
+ // Playable items sort above ones that wouldn't play even if they got high enough priority
return false;
}
else
@@ -577,10 +639,12 @@ void LLViewerMedia::updateMedia()
else if(pimpl->hasFocus())
{
new_priority = LLPluginClassMedia::PRIORITY_HIGH;
+ impl_count_interest_normal++; // count this against the count of "normal" instances for priority purposes
}
else if(pimpl->getUsedInUI())
{
new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
+ impl_count_interest_normal++;
}
else
{
@@ -588,7 +652,17 @@ void LLViewerMedia::updateMedia()
// Heuristic -- if the media texture's approximate screen area is less than 1/4 of the native area of the texture,
// turn it down to low instead of normal. This may downsample for plugins that support it.
- bool media_is_small = pimpl->getInterest() < (pimpl->getApproximateTextureInterest() / 4);
+ bool media_is_small = false;
+ F64 approximate_interest = pimpl->getApproximateTextureInterest();
+ if(approximate_interest == 0.0f)
+ {
+ // this media has no current size, which probably means it's not loaded.
+ media_is_small = true;
+ }
+ else if(pimpl->getInterest() < (approximate_interest / 4))
+ {
+ media_is_small = true;
+ }
if(pimpl->getInterest() == 0.0f)
{
@@ -626,7 +700,7 @@ void LLViewerMedia::updateMedia()
}
}
- if(new_priority != LLPluginClassMedia::PRIORITY_UNLOADED)
+ if(!pimpl->getUsedInUI() && (new_priority != LLPluginClassMedia::PRIORITY_UNLOADED))
{
impl_count_total++;
}
@@ -708,6 +782,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mIsDisabled(false),
mIsParcelMedia(false),
mProximity(-1),
+ mMimeTypeProbe(NULL),
mIsUpdated(false)
{
@@ -811,7 +886,9 @@ void LLViewerMediaImpl::destroyMediaSource()
{
oldImage->setPlaying(FALSE) ;
}
-
+
+ cancelMimeTypeProbe();
+
if(mMediaSource)
{
delete mMediaSource;
@@ -1316,6 +1393,8 @@ void LLViewerMediaImpl::unload()
//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::navigateTo(const std::string& url, const std::string& mime_type, bool rediscover_type, bool server_request)
{
+ cancelMimeTypeProbe();
+
if(mMediaURL != url)
{
// Don't carry media play state across distinct URLs.
@@ -1358,6 +1437,12 @@ void LLViewerMediaImpl::navigateInternal()
// Helpful to have media urls in log file. Shouldn't be spammy.
llinfos << "media id= " << mTextureId << " url=" << mMediaURL << " mime_type=" << mMimeType << llendl;
+ if(mMimeTypeProbe != NULL)
+ {
+ llwarns << "MIME type probe already in progress -- bailing out." << llendl;
+ return;
+ }
+
if(mNavigateServerRequest)
{
setNavState(MEDIANAVSTATE_SERVER_SENT);
@@ -1390,7 +1475,7 @@ void LLViewerMediaImpl::navigateInternal()
if(scheme.empty() || "http" == scheme || "https" == scheme)
{
- LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this));
+ LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);
}
else if("data" == scheme || "file" == scheme || "about" == scheme)
{
@@ -1521,7 +1606,19 @@ void LLViewerMediaImpl::update()
{
if(mMediaSource == NULL)
{
- if(mPriority != LLPluginClassMedia::PRIORITY_UNLOADED)
+ if(mPriority == LLPluginClassMedia::PRIORITY_UNLOADED)
+ {
+ // This media source should not be loaded.
+ }
+ else if(mPriority <= LLPluginClassMedia::PRIORITY_SLIDESHOW)
+ {
+ // Don't load new instances that are at PRIORITY_SLIDESHOW or below. They're just kept around to preserve state.
+ }
+ else if(mMimeTypeProbe != NULL)
+ {
+ // this media source is doing a MIME type probe -- don't try loading it again.
+ }
+ else
{
// This media may need to be loaded.
if(sMediaCreateTimer.hasExpired())
@@ -1644,7 +1741,7 @@ LLViewerMediaTexture* LLViewerMediaImpl::updatePlaceholderImage()
// MEDIAOPT: seems insane that we actually have to make an imageraw then
// immediately discard it
LLPointer<LLImageRaw> raw = new LLImageRaw(texture_width, texture_height, texture_depth);
- raw->clear(0x0f, 0x0f, 0x0f, 0xff);
+ raw->clear(0x00, 0x00, 0x00, 0xff);
int discard_level = 0;
// ask media source for correct GL image format constants
@@ -1745,7 +1842,7 @@ bool LLViewerMediaImpl::isMediaPaused()
//////////////////////////////////////////////////////////////////////////////////////////
//
-bool LLViewerMediaImpl::hasMedia()
+bool LLViewerMediaImpl::hasMedia() const
{
return mMediaSource != NULL;
}
@@ -1780,6 +1877,31 @@ bool LLViewerMediaImpl::isForcedUnloaded() const
}
//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isPlayable() const
+{
+ if(isForcedUnloaded())
+ {
+ // All of the forced-unloaded criteria also imply not playable.
+ return false;
+ }
+
+ if(hasMedia())
+ {
+ // Anything that's already playing is, by definition, playable.
+ return true;
+ }
+
+ if(!mMediaURL.empty())
+ {
+ // If something has navigated the instance, it's ready to be played.
+ return true;
+ }
+
+ return false;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent event)
{
switch(event)
@@ -2023,7 +2145,13 @@ F64 LLViewerMediaImpl::getApproximateTextureInterest()
result = mMediaSource->getFullWidth();
result *= mMediaSource->getFullHeight();
}
-
+ else
+ {
+ // No media source is loaded -- all we have to go on is the texture size that has been set on the impl, if any.
+ result = mMediaWidth;
+ result *= mMediaHeight;
+ }
+
return result;
}
@@ -2064,7 +2192,7 @@ void LLViewerMediaImpl::setPriority(LLPluginClassMedia::EPriority priority)
{
if(mPriority != priority)
{
- LL_INFOS("PluginPriority")
+ LL_DEBUGS("PluginPriority")
<< "changing priority of media id " << mTextureId
<< " from " << LLPluginClassMedia::priorityToString(mPriority)
<< " to " << LLPluginClassMedia::priorityToString(priority)
@@ -2120,6 +2248,21 @@ void LLViewerMediaImpl::setNavState(EMediaNavState state)
}
}
+void LLViewerMediaImpl::cancelMimeTypeProbe()
+{
+ if(mMimeTypeProbe != NULL)
+ {
+ // There doesn't seem to be a way to actually cancel an outstanding request.
+ // Simulate it by telling the LLMimeDiscoveryResponder not to write back any results.
+ mMimeTypeProbe->cancelRequest();
+
+ // The above should already have set mMimeTypeProbe to NULL.
+ if(mMimeTypeProbe != NULL)
+ {
+ llerrs << "internal error: mMimeTypeProbe is not NULL after cancelling request." << llendl;
+ }
+ }
+}
void LLViewerMediaImpl::addObject(LLVOVolume* obj)
{
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 3f5f3ca746..a06079786e 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -48,6 +48,7 @@ class LLUUID;
class LLViewerMediaTexture;
class LLMediaEntry;
class LLVOVolume ;
+class LLMimeDiscoveryResponder;
typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
///////////////////////////////////////////////////////////////////////////////
@@ -73,6 +74,9 @@ class LLViewerMedia
LOG_CLASS(LLViewerMedia);
public:
+ // String to get/set media autoplay in gSavedSettings
+ static const char *AUTO_PLAY_MEDIA_SETTING;
+
typedef std::vector<LLViewerMediaImpl*> impl_list;
// Special case early init for just web browser component
@@ -190,7 +194,7 @@ public:
bool isMediaPlaying();
bool isMediaPaused();
- bool hasMedia();
+ bool hasMedia() const;
bool isMediaFailed() const { return mMediaSourceFailed; };
void resetPreviousMediaState();
@@ -200,6 +204,9 @@ public:
// returns true if this instance should not be loaded (disabled, muted object, crashed, etc.)
bool isForcedUnloaded() const;
+ // returns true if this instance could be playable based on autoplay setting, current load state, etc.
+ bool isPlayable() const;
+
void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; };
bool isParcelMedia() const { return mIsParcelMedia; };
@@ -294,6 +301,7 @@ public:
EMediaNavState getNavState() { return mMediaNavState; }
void setNavState(EMediaNavState state);
+ void cancelMimeTypeProbe();
public:
// a single media url with some data and an impl.
LLPluginClassMedia* mMediaSource;
@@ -331,7 +339,8 @@ public:
bool mIsDisabled;
bool mIsParcelMedia;
S32 mProximity;
-
+ LLMimeDiscoveryResponder *mMimeTypeProbe;
+
private:
BOOL mIsUpdated ;
std::list< LLVOVolume* > mObjectList ;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 976d89a5b7..68a9aaef75 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -1879,7 +1879,9 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
handle_debug_avatar_textures(NULL);
+#endif
return true;
}
};
@@ -1893,7 +1895,9 @@ class LLAdvancedDumpAvatarLocalTextures : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+#ifndef LL_RELEASE_FOR_DOWNLOAD
handle_dump_avatar_local_textures(NULL);
+#endif
return true;
}
};
@@ -3875,8 +3879,7 @@ void god_force_inv_owner_permissive(LLViewerObject* object,
InventoryObjectList::const_iterator inv_end = inventory->end();
for ( ; inv_it != inv_end; ++inv_it)
{
- if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY)
- && ((*inv_it)->getType() != LLAssetType::AT_ROOT_CATEGORY))
+ if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))
{
LLInventoryObject* obj = *inv_it;
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem((LLViewerInventoryItem*)obj);
@@ -6420,13 +6423,13 @@ void handle_selected_texture_info(void*)
void handle_test_male(void*)
{
- LLAppearanceManager::wearOutfitByName("Male Shape & Outfit");
+ LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit");
//gGestureList.requestResetFromServer( TRUE );
}
void handle_test_female(void*)
{
- LLAppearanceManager::wearOutfitByName("Female Shape & Outfit");
+ LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit");
//gGestureList.requestResetFromServer( FALSE );
}
@@ -7860,10 +7863,8 @@ void initialize_menus()
view_listener_t::addMenu(new LLAdvancedCheckDebugCharacterVis(), "Advanced.CheckDebugCharacterVis");
view_listener_t::addMenu(new LLAdvancedDumpAttachments(), "Advanced.DumpAttachments");
view_listener_t::addMenu(new LLAdvancedRebakeTextures(), "Advanced.RebakeTextures");
- #ifndef LL_RELEASE_FOR_DOWNLOAD
view_listener_t::addMenu(new LLAdvancedDebugAvatarTextures(), "Advanced.DebugAvatarTextures");
view_listener_t::addMenu(new LLAdvancedDumpAvatarLocalTextures(), "Advanced.DumpAvatarLocalTextures");
- #endif
// Advanced > Network
view_listener_t::addMenu(new LLAdvancedEnableMessageLog(), "Advanced.EnableMessageLog");
view_listener_t::addMenu(new LLAdvancedDisableMessageLog(), "Advanced.DisableMessageLog");
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index a90790c59a..0153116887 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -43,7 +43,7 @@
#include "llfloaterbump.h"
#include "llassetstorage.h"
#include "llcachename.h"
-#include "llchat.h"
+
#include "lldbstrings.h"
#include "lleconomy.h"
#include "llfilepicker.h"
@@ -89,6 +89,7 @@
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
#include "llmenugl.h"
@@ -115,6 +116,7 @@
#include "llui.h" // for make_ui_sound
#include "lluploaddialog.h"
#include "llviewercamera.h"
+#include "llviewerchat.h"
#include "llviewergenericmessage.h"
#include "llviewerinventory.h"
#include "llviewermenu.h"
@@ -1365,7 +1367,9 @@ void inventory_offer_handler(LLOfferInfo* info, BOOL from_task)
payload["from_id"] = info->mFromID;
args["OBJECTFROMNAME"] = info->mFromName;
- args["NAME"] = info->mFromName;
+ args["NAME"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+ std::string verb = "highlight?name=" + msg;
+ args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
LLNotification::Params p("ObjectGiveItem");
p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
@@ -1431,6 +1435,17 @@ bool goto_url_callback(const LLSD& notification, const LLSD& response)
}
static LLNotificationFunctorRegistration goto_url_callback_reg("GotoURL", goto_url_callback);
+bool inspect_remote_object_callback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ LLFloaterReg::showInstance("inspect_remote_object", notification["payload"]);
+ }
+ return false;
+}
+static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback);
+
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
if (gNoRender)
@@ -1498,15 +1513,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
std::string separator_string(": ");
- int message_offset = 0;
-
- //Handle IRC styled /me messages.
- std::string prefix = message.substr(0, 4);
- if (prefix == "/me " || prefix == "/me'")
- {
- separator_string = "";
- message_offset = 3;
- }
LLSD args;
switch(dialog)
@@ -1558,7 +1564,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// now store incoming IM in chat history
- buffer = message.substr(message_offset);
+ buffer = message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
@@ -1576,7 +1582,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
true);
// pretend this is chat generated by self, so it does not show up on screen
- chat.mText = std::string("IM: ") + name + separator_string + message.substr(message_offset);
+ chat.mText = std::string("IM: ") + name + separator_string + message;
LLFloaterChat::addChat( chat, TRUE, TRUE );
}
else if (from_id.isNull())
@@ -1596,7 +1602,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Treat like a system message and put in chat history.
// Claim to be from a local agent so it doesn't go into
// console.
- chat.mText = name + separator_string + message.substr(message_offset);
+ chat.mText = name + separator_string + message;
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
if(nearby_chat)
@@ -1612,7 +1618,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
}
- buffer = saved + message.substr(message_offset);
+ buffer = saved + message;
LL_INFOS("Messaging") << "process_improved_im: session_id( " << session_id << " ), from_id( " << from_id << " )" << LL_ENDL;
@@ -1634,7 +1640,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
region_id,
position,
true);
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+ chat.mText = std::string("IM: ") + name + separator_string + saved + message;
BOOL local_agent = FALSE;
LLFloaterChat::addChat( chat, TRUE, local_agent );
@@ -1922,7 +1928,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
{
saved = llformat("(Saved %s) ", formatted_time(timestamp).c_str());
}
- buffer = saved + message.substr(message_offset);
+ buffer = saved + message;
BOOL is_this_agent = FALSE;
if(from_id == gAgentID)
{
@@ -1940,7 +1946,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
position,
true);
- chat.mText = std::string("IM: ") + name + separator_string + saved + message.substr(message_offset);
+ chat.mText = std::string("IM: ") + name + separator_string + saved + message;
LLFloaterChat::addChat(chat, TRUE, is_this_agent);
}
break;
@@ -1952,9 +1958,23 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
return;
}
+ // Build a link to open the object IM info window.
+ std::string location = ll_safe_string((char*)binary_bucket, binary_bucket_size-1);
+
LLSD substitutions;
- substitutions["MSG"] = message.substr(message_offset);
- LLNotifications::instance().add("ServerObjectMessage", substitutions);
+ substitutions["NAME"] = name;
+ substitutions["MSG"] = message;
+
+ LLSD payload;
+ payload["object_id"] = session_id;
+ payload["owner_id"] = from_id;
+ payload["slurl"] = location;
+ payload["name"] = name;
+ if (from_group)
+ {
+ payload["groupowned"] = "true";
+ }
+ LLNotifications::instance().add("ServerObjectMessage", substitutions, payload);
}
break;
case IM_FROM_TASK_AS_ALERT:
@@ -1978,7 +1998,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
else
{
// TODO: after LLTrans hits release, get "busy response" into translatable file
- buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.substr(message_offset).c_str());
+ buffer = llformat("%s (%s): %s", name.c_str(), "busy response", message.c_str());
gIMMgr->addMessage(session_id, from_id, name, buffer);
}
break;
@@ -2232,7 +2252,7 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)
void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
{
- LLChat chat;
+ LLChat chat;
std::string mesg;
std::string from_name;
U8 source_temp;
@@ -2832,7 +2852,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
// Chat the "back" SLURL. (DEV-4907)
LLChat chat("Teleport completed from " + gAgent.getTeleportSourceSLURL());
chat.mSourceType = CHAT_SOURCE_SYSTEM;
- LLFloaterChat::addChatHistory(chat);
+ LLFloaterChat::addChatHistory(chat);
// Set the new position
avatarp->setPositionAgent(agent_pos);
@@ -4604,7 +4624,7 @@ void notify_cautioned_script_question(const LLSD& notification, const LLSD& resp
if (caution)
{
LLChat chat(notice.getString());
- LLFloaterChat::addChat(chat, FALSE, FALSE);
+ // LLFloaterChat::addChat(chat, FALSE, FALSE);
}
}
}
@@ -4817,8 +4837,7 @@ void container_inventory_arrived(LLViewerObject* object,
InventoryObjectList::const_iterator end = inventory->end();
for ( ; it != end; ++it)
{
- if ((*it)->getType() != LLAssetType::AT_CATEGORY &&
- (*it)->getType() != LLAssetType::AT_ROOT_CATEGORY)
+ if ((*it)->getType() != LLAssetType::AT_CATEGORY)
{
LLInventoryObject* obj = (LLInventoryObject*)(*it);
LLInventoryItem* item = (LLInventoryItem*)(obj);
@@ -4853,8 +4872,7 @@ void container_inventory_arrived(LLViewerObject* object,
// one actual object
InventoryObjectList::iterator it = inventory->begin();
- if ((*it)->getType() == LLAssetType::AT_CATEGORY ||
- (*it)->getType() == LLAssetType::AT_ROOT_CATEGORY)
+ if ((*it)->getType() == LLAssetType::AT_CATEGORY)
{
++it;
}
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index 336d7f684e..7559fd8e72 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -324,10 +324,36 @@ std::string LLViewerParcelMedia::getMimeType()
{
return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none";
}
+
+//static
+std::string LLViewerParcelMedia::getURL()
+{
+ std::string url;
+ if(sMediaImpl.notNull())
+ url = sMediaImpl->getMediaURL();
+
+ if (url.empty())
+ url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL();
+
+ if (url.empty())
+ url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL();
+
+ return url;
+}
+
+//static
+std::string LLViewerParcelMedia::getName()
+{
+ if(sMediaImpl.notNull())
+ return sMediaImpl->getName();
+ return "";
+}
+
viewer_media_t LLViewerParcelMedia::getParcelMedia()
{
return sMediaImpl;
}
+
//////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerParcelMedia::processParcelMediaCommandMessage( LLMessageSystem *msg, void ** )
diff --git a/indra/newview/llviewerparcelmedia.h b/indra/newview/llviewerparcelmedia.h
index 3f7f898356..19e1ef78d4 100644
--- a/indra/newview/llviewerparcelmedia.h
+++ b/indra/newview/llviewerparcelmedia.h
@@ -71,6 +71,8 @@ class LLViewerParcelMedia : public LLViewerMediaObserver
static LLPluginClassMediaOwner::EMediaStatus getStatus();
static std::string getMimeType();
+ static std::string getURL();
+ static std::string getName();
static viewer_media_t getParcelMedia();
static void processParcelMediaCommandMessage( LLMessageSystem *msg, void ** );
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 9923c9ac74..0d29efaedf 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -206,33 +206,31 @@ LLPointer<LLViewerTexture> LLViewerTextureManager::getLocalTexture(const U32 wid
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(
const LLUUID &image_id,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
LLHost request_from_host)
{
- llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
return gTextureList.getImage(image_id, usemipmaps, boost_priority, texture_type, internal_format, primary_format, request_from_host) ;
}
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromFile(
const std::string& filename,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
const LLUUID& force_id)
{
- llassert_always(boost_priority >= LLViewerTexture::BOOST_NONE) ;
return gTextureList.getImageFromFile(filename, usemipmaps, boost_priority, texture_type, internal_format, primary_format, force_id) ;
}
//static
LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTextureFromUrl(const std::string& url,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -1485,9 +1483,8 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
if ( mBoostLevel > BOOST_HIGH)
{
priority += 10000000.f;
- }
-
- if(mAdditionalDecodePriority > 0.0f)
+ }
+ else if(mAdditionalDecodePriority > 0.0f)
{
// 1-9
S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round
@@ -2124,10 +2121,11 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
llassert_always(mGLTexturep.notNull()) ;
llassert_always(discard_level >= 0);
llassert_always(mComponents > 0);
+
if (mRawImage.notNull())
{
- llerrs << "called with existing mRawImage" << llendl;
- mRawImage = NULL;
+ //mRawImage is in use by somebody else, do not delete it.
+ return NULL ;
}
if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)
@@ -3147,8 +3145,7 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
if(mNeedsResetMaxVirtualSize)
{
- mMaxVirtualSize = 0.f ;//reset
- mNeedsResetMaxVirtualSize = FALSE ;
+ addTextureStats(0.f, FALSE) ;//reset
}
if(mIsPlaying) //media is playing
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index bde87d1dd5..141979052d 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -107,12 +107,11 @@ public:
enum EBoostLevel
{
- //skip 0 and 1 to avoid mistakenly mixing boost level with boolean numbers.
- BOOST_NONE = 2,
- BOOST_AVATAR_BAKED = 3,
- BOOST_AVATAR = 4,
- BOOST_CLOUDS = 5,
- BOOST_SCULPTED = 6,
+ BOOST_NONE = 0,
+ BOOST_AVATAR_BAKED = 1,
+ BOOST_AVATAR = 2,
+ BOOST_CLOUDS = 3,
+ BOOST_SCULPTED = 4,
BOOST_HIGH = 10,
BOOST_TERRAIN = 11, // has to be high priority for minimap / low detail
@@ -668,7 +667,7 @@ public:
static LLViewerFetchedTexture* getFetchedTexture(const LLUUID &image_id,
BOOL usemipmap = TRUE,
- S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -677,7 +676,7 @@ public:
static LLViewerFetchedTexture* getFetchedTextureFromFile(const std::string& filename,
BOOL usemipmap = TRUE,
- S32 boost_priority = LLViewerTexture::BOOST_NONE,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -686,7 +685,7 @@ public:
static LLViewerFetchedTexture* getFetchedTextureFromUrl(const std::string& url,
BOOL usemipmap = TRUE,
- S32 boost_priority = LLViewerTexture::BOOST_NONE,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE,
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index 081b7cc483..703a13976c 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -325,7 +325,7 @@ void LLViewerTextureList::restoreGL()
LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string& filename,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -345,7 +345,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromFile(const std::string&
LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string& url,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -411,7 +411,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImageFromUrl(const std::string&
LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -441,7 +441,7 @@ LLViewerFetchedTexture* LLViewerTextureList::getImage(const LLUUID &image_id,
//when this function is called, there is no such texture in the gTextureList with image_id.
LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
BOOL usemipmaps,
- S32 boost_priority,
+ LLViewerTexture::EBoostLevel boost_priority,
S8 texture_type,
LLGLint internal_format,
LLGLenum primary_format,
@@ -1346,7 +1346,7 @@ LLUIImagePtr LLUIImageList::getUIImageByID(const LLUUID& image_id, S32 priority)
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByID(image_id, use_mips, scale_rect, priority);
+ return loadUIImageByID(image_id, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priority)
@@ -1360,21 +1360,27 @@ LLUIImagePtr LLUIImageList::getUIImage(const std::string& image_name, S32 priori
const BOOL use_mips = FALSE;
const LLRect scale_rect = LLRect::null;
- return loadUIImageByName(image_name, image_name, use_mips, scale_rect, priority);
+ return loadUIImageByName(image_name, image_name, use_mips, scale_rect, (LLViewerTexture::EBoostLevel)priority);
}
LLUIImagePtr LLUIImageList::loadUIImageByName(const std::string& name, const std::string& filename,
- BOOL use_mips, const LLRect& scale_rect, S32 boost_priority )
+ BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority )
{
- if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+ if (boost_priority == LLViewerTexture::BOOST_NONE)
+ {
+ boost_priority = LLViewerTexture::BOOST_UI;
+ }
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTextureFromFile(filename, MIPMAP_NO, boost_priority);
return loadUIImage(imagep, name, use_mips, scale_rect);
}
LLUIImagePtr LLUIImageList::loadUIImageByID(const LLUUID& id,
- BOOL use_mips, const LLRect& scale_rect, S32 boost_priority)
+ BOOL use_mips, const LLRect& scale_rect, LLViewerTexture::EBoostLevel boost_priority)
{
- if (boost_priority == 0) boost_priority = LLViewerFetchedTexture::BOOST_UI;
+ if (boost_priority == LLViewerTexture::BOOST_NONE)
+ {
+ boost_priority = LLViewerTexture::BOOST_UI;
+ }
LLViewerFetchedTexture* imagep = LLViewerTextureManager::getFetchedTexture(id, MIPMAP_NO, boost_priority);
return loadUIImage(imagep, id.asString(), use_mips, scale_rect);
}
diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h
index 3c9c81a689..028f8441ab 100644
--- a/indra/newview/llviewertexturelist.h
+++ b/indra/newview/llviewertexturelist.h
@@ -130,7 +130,7 @@ private:
LLViewerFetchedTexture * getImage(const LLUUID &image_id,
BOOL usemipmap = TRUE,
- S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -139,7 +139,7 @@ private:
LLViewerFetchedTexture * getImageFromFile(const std::string& filename,
BOOL usemipmap = TRUE,
- S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -148,7 +148,7 @@ private:
LLViewerFetchedTexture* getImageFromUrl(const std::string& url,
BOOL usemipmap = TRUE,
- BOOL level_immediate = FALSE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -157,7 +157,7 @@ private:
LLViewerFetchedTexture* createImage(const LLUUID &image_id,
BOOL usemipmap = TRUE,
- S32 boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_NONE, // Get the requested level immediately upon creation.
S8 texture_type = LLViewerTexture::FETCHED_TEXTURE,
LLGLint internal_format = 0,
LLGLenum primary_format = 0,
@@ -228,9 +228,11 @@ public:
static void onUIImageLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata );
private:
LLUIImagePtr loadUIImageByName(const std::string& name, const std::string& filename,
- BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+ BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
LLUIImagePtr loadUIImageByID(const LLUUID& id,
- BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null, S32 boost_priority = 0);
+ BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null,
+ LLViewerTexture::EBoostLevel boost_priority = LLViewerTexture::BOOST_UI);
LLUIImagePtr loadUIImage(LLViewerFetchedTexture* imagep, const std::string& name, BOOL use_mips = FALSE, const LLRect& scale_rect = LLRect::null);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 1054223dcf..90a79698f6 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1015,7 +1015,10 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
}
// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues
- gAgent.changeCameraToDefault();
+ if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ {
+ gAgent.changeCameraToDefault();
+ }
send_agent_pause();
diff --git a/indra/newview/llvlcomposition.cpp b/indra/newview/llvlcomposition.cpp
index 999701ece1..6340189c93 100644
--- a/indra/newview/llvlcomposition.cpp
+++ b/indra/newview/llvlcomposition.cpp
@@ -287,17 +287,22 @@ BOOL LLVLComposition::generateTexture(const F32 x, const F32 y,
min_dim /= 2;
}
- mDetailTextures[i]->reloadRawImage(ddiscard) ;
+ BOOL delete_raw = (mDetailTextures[i]->reloadRawImage(ddiscard) != NULL) ;
if(mDetailTextures[i]->getRawImageLevel() != ddiscard)//raw iamge is not ready, will enter here again later.
{
- mDetailTextures[i]->destroyRawImage() ;
+ if(delete_raw)
+ {
+ mDetailTextures[i]->destroyRawImage() ;
+ }
lldebugs << "cached raw data for terrain detail texture is not ready yet: " << mDetailTextures[i]->getID() << llendl;
return FALSE;
}
mRawImages[i] = mDetailTextures[i]->getRawImage() ;
- mDetailTextures[i]->destroyRawImage() ;
-
+ if(delete_raw)
+ {
+ mDetailTextures[i]->destroyRawImage() ;
+ }
if (mDetailTextures[i]->getWidth(ddiscard) != BASE_SIZE ||
mDetailTextures[i]->getHeight(ddiscard) != BASE_SIZE ||
mDetailTextures[i]->getComponents() != 3)
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 52023b2139..b6c1ee2f11 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -624,7 +624,6 @@ F32 LLVOAvatar::sGreyUpdateTime = 0.f;
// Helper functions
//-----------------------------------------------------------------------------
static F32 calc_bouncy_animation(F32 x);
-static U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures);
//-----------------------------------------------------------------------------
// LLVOAvatar()
@@ -6591,7 +6590,7 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
{
if (interp_params)
{
- startAppearanceAnimation(FALSE, FALSE);
+ startAppearanceAnimation();
}
updateVisualParams();
@@ -7637,9 +7636,17 @@ void LLVOAvatar::idleUpdateRenderCost()
return;
}
- U32 shame = 1;
+ U32 shame = 0;
- std::set<LLUUID> textures;
+ for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
+ {
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
+ ETextureIndex tex_index = baked_dict->mTextureIndex;
+ if (isTextureVisible(tex_index))
+ {
+ shame +=20;
+ }
+ }
for (attachment_map_t::const_iterator iter = mAttachmentPoints.begin();
iter != mAttachmentPoints.end();
@@ -7660,15 +7667,13 @@ void LLVOAvatar::idleUpdateRenderCost()
const LLVOVolume* volume = drawable->getVOVolume();
if (volume)
{
- shame += calc_shame(volume, textures);
+ shame += volume->getRenderCost();
}
}
}
}
}
- shame += textures.size() * 5;
-
setDebugText(llformat("%d", shame));
F32 green = 1.f-llclamp(((F32) shame-1024.f)/1024.f, 0.f, 1.f);
F32 red = llmin((F32) shame/1024.f, 1.f);
@@ -7713,110 +7718,6 @@ const std::string LLVOAvatar::getBakedStatusForPrintout() const
}
-U32 calc_shame(const LLVOVolume* volume, std::set<LLUUID> &textures)
-{
- if (!volume)
- {
- return 0;
- }
-
- U32 shame = 0;
-
- U32 invisi = 0;
- U32 shiny = 0;
- U32 glow = 0;
- U32 alpha = 0;
- U32 flexi = 0;
- U32 animtex = 0;
- U32 particles = 0;
- U32 scale = 0;
- U32 bump = 0;
- U32 planar = 0;
-
- if (volume->isFlexible())
- {
- flexi = 1;
- }
- if (volume->isParticleSource())
- {
- particles = 1;
- }
-
- const LLVector3& sc = volume->getScale();
- scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
-
- const LLDrawable* drawablep = volume->mDrawable;
-
- if (volume->isSculpted())
- {
- const LLSculptParams *sculpt_params = (LLSculptParams *) volume->getParameterEntry(LLNetworkData::PARAMS_SCULPT);
- LLUUID sculpt_id = sculpt_params->getSculptTexture();
- textures.insert(sculpt_id);
- }
-
- for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
- {
- const LLFace* face = drawablep->getFace(i);
- const LLTextureEntry* te = face->getTextureEntry();
- const LLViewerTexture* img = face->getTexture();
-
- textures.insert(img->getID());
-
- if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
- {
- alpha++;
- }
- else if (img->getPrimaryFormat() == GL_ALPHA)
- {
- invisi = 1;
- }
-
- if (te)
- {
- if (te->getBumpmap())
- {
- bump = 1;
- }
- if (te->getShiny())
- {
- shiny = 1;
- }
- if (te->getGlow() > 0.f)
- {
- glow = 1;
- }
- if (face->mTextureMatrix != NULL)
- {
- animtex++;
- }
- if (te->getTexGen())
- {
- planar++;
- }
- }
- }
-
- shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
-
- LLViewerObject::const_child_list_t& child_list = volume->getChildren();
- for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
- iter != child_list.end();
- ++iter)
- {
- const LLViewerObject* child_objectp = *iter;
- const LLDrawable* child_drawablep = child_objectp->mDrawable;
- if (child_drawablep)
- {
- const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
- if (child_volumep)
- {
- shame += calc_shame(child_volumep, textures);
- }
- }
- }
-
- return shame;
-}
//virtual
S32 LLVOAvatar::getTexImageSize() const
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 185274d40d..711e9f90fc 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -487,18 +487,10 @@ BOOL LLVOAvatarSelf::buildMenus()
}
// add in requested order to pie menu, inserting separators as necessary
- S32 cur_pie_slice = 0;
for (std::multimap<S32, S32>::iterator attach_it = attachment_pie_menu_map.begin();
attach_it != attachment_pie_menu_map.end(); ++attach_it)
{
- S32 requested_pie_slice = attach_it->first;
S32 attach_index = attach_it->second;
- while (cur_pie_slice < requested_pie_slice)
- {
- gAttachBodyPartPieMenus[group]->addSeparator();
- gDetachBodyPartPieMenus[group]->addSeparator();
- cur_pie_slice++;
- }
LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attach_index, (LLViewerJointAttachment*)NULL);
if (attachment)
@@ -520,7 +512,6 @@ BOOL LLVOAvatarSelf::buildMenus()
item_params.on_enable.parameter = attach_index;
item = LLUICtrlFactory::create<LLMenuItemCallGL>(item_params);
gDetachBodyPartPieMenus[group]->addChild(item);
- cur_pie_slice++;
}
}
}
@@ -1039,7 +1030,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
if (attachment->isObjectAttached(viewer_object))
{
const LLUUID& attachment_id = viewer_object->getItemID();
- LLAppearanceManager::registerAttachment(attachment_id);
+ LLAppearanceManager::instance().registerAttachment(attachment_id);
}
return attachment;
@@ -1078,7 +1069,7 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
}
else
{
- LLAppearanceManager::unregisterAttachment(attachment_id);
+ LLAppearanceManager::instance().unregisterAttachment(attachment_id);
}
return TRUE;
@@ -1587,7 +1578,7 @@ void LLVOAvatarSelf::dumpLocalTextures() const
llinfos << "LocTex " << name << ": Baked " << getTEImage(baked_equiv)->getID() << llendl;
#endif
}
- else if (local_tex_obj->getImage() != NULL)
+ else if (local_tex_obj && local_tex_obj->getImage() != NULL)
{
if (local_tex_obj->getImage()->getID() == IMG_DEFAULT_AVATAR)
{
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 89649407ff..ae32ec7d11 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -306,8 +306,10 @@ void LLVoiceChannel::activate()
// activating the proximal channel between IM calls
LLVoiceChannel* old_channel = sCurrentVoiceChannel;
sCurrentVoiceChannel = this;
+ mCallDialogPayload["old_channel_name"] = "";
if (old_channel)
{
+ mCallDialogPayload["old_channel_name"] = old_channel->getSessionName();
old_channel->deactivate();
}
}
@@ -868,16 +870,60 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
void LLVoiceChannelP2P::setState(EState state)
{
- // HACK: Open/close the call window if needed.
+ // *HACK: Open/close the call window if needed.
toggleCallWindowIfNeeded(state);
-
- // you only "answer" voice invites in p2p mode
- // so provide a special purpose message here
- if (mReceivedCall && state == STATE_RINGING)
+
+ if (mReceivedCall) // incoming call
{
- gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
- doSetState(state);
- return;
+ // you only "answer" voice invites in p2p mode
+ // so provide a special purpose message here
+ if (mReceivedCall && state == STATE_RINGING)
+ {
+ gIMMgr->addSystemMessage(mSessionID, "answering", mNotifyArgs);
+ doSetState(state);
+ return;
+ }
+ }
+ else // outgoing call
+ {
+ mCallDialogPayload["session_id"] = mSessionID;
+ mCallDialogPayload["session_name"] = mSessionName;
+ mCallDialogPayload["other_user_id"] = mOtherUserID;
+ if (state == STATE_RINGING)
+ {
+ // *HACK: open outgoing call floater if needed, might be better done elsewhere.
+ // *TODO: should move this squirrelly ui-fudging crap into LLOutgoingCallDialog itself
+ if (!mSessionName.empty())
+ {
+ LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+ if (ocd)
+ {
+ ocd->getChild<LLTextBox>("calling")->setVisible(true);
+ ocd->getChild<LLTextBox>("leaving")->setVisible(true);
+ ocd->getChild<LLTextBox>("connecting")->setVisible(false);
+ }
+ }
+ }
+ /*else if (state == STATE_CONNECTED)
+ {
+ LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+ if (ocd)
+ {
+ ocd->getChild<LLTextBox>("calling")->setVisible(false);
+ ocd->getChild<LLTextBox>("leaving")->setVisible(false);
+ ocd->getChild<LLTextBox>("connecting")->setVisible(true);
+ }
+ }*/
+ else if (state == STATE_HUNG_UP ||
+ state == STATE_CONNECTED)
+ {
+ LLOutgoingCallDialog *ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+ if (ocd)
+ {
+ ocd->closeFloater();
+ }
+ }
}
+
LLVoiceChannel::setState(state);
}
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 20b6157b48..639585de55 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -109,6 +109,7 @@ protected:
EState mState;
std::string mSessionName;
LLSD mNotifyArgs;
+ LLSD mCallDialogPayload;
BOOL mIgnoreNextSessionLeave;
LLHandle<LLPanel> mLoginNotificationHandle;
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 39d4bb0c02..5fedfc943b 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1598,7 +1598,7 @@ void LLVoiceClient::stateMachine()
}
else
{
- LL_WARNS("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
+ LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
}
}
}
@@ -4273,7 +4273,7 @@ void LLVoiceClient::mediaStreamUpdatedEvent(
if(incoming)
{
// Send the voice chat invite to the GUI layer
- // TODO: Question: Should we correlate with the mute list here?
+ // *TODO: Question: Should we correlate with the mute list here?
session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
session->mVoiceInvitePending = true;
if(session->mName.empty())
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 2def905bbb..e5531a1497 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -2541,6 +2541,107 @@ const LLMatrix4 LLVOVolume::getRenderMatrix() const
return mDrawable->getWorldMatrix();
}
+U32 LLVOVolume::getRenderCost() const
+{
+ U32 shame = 0;
+
+ U32 invisi = 0;
+ U32 shiny = 0;
+ U32 glow = 0;
+ U32 alpha = 0;
+ U32 flexi = 0;
+ U32 animtex = 0;
+ U32 particles = 0;
+ U32 scale = 0;
+ U32 bump = 0;
+ U32 planar = 0;
+
+ if (isFlexible())
+ {
+ flexi = 1;
+ }
+ if (isParticleSource())
+ {
+ particles = 1;
+ }
+
+ const LLVector3& sc = getScale();
+ scale += (U32) sc.mV[0] + (U32) sc.mV[1] + (U32) sc.mV[2];
+
+ const LLDrawable* drawablep = mDrawable;
+
+ if (isSculpted())
+ {
+ const LLSculptParams *sculpt_params = (LLSculptParams *) getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID sculpt_id = sculpt_params->getSculptTexture();
+ shame += 5;
+ }
+
+ for (S32 i = 0; i < drawablep->getNumFaces(); ++i)
+ {
+ const LLFace* face = drawablep->getFace(i);
+ const LLTextureEntry* te = face->getTextureEntry();
+ const LLViewerTexture* img = face->getTexture();
+
+ shame += 5;
+
+ if (face->getPoolType() == LLDrawPool::POOL_ALPHA)
+ {
+ alpha++;
+ }
+ else if (img->getPrimaryFormat() == GL_ALPHA)
+ {
+ invisi = 1;
+ }
+
+ if (te)
+ {
+ if (te->getBumpmap())
+ {
+ bump = 1;
+ }
+ if (te->getShiny())
+ {
+ shiny = 1;
+ }
+ if (te->getGlow() > 0.f)
+ {
+ glow = 1;
+ }
+ if (face->mTextureMatrix != NULL)
+ {
+ animtex++;
+ }
+ if (te->getTexGen())
+ {
+ planar++;
+ }
+ }
+ }
+
+ shame += invisi + shiny + glow + alpha*4 + flexi*8 + animtex*4 + particles*16+bump*4+scale+planar;
+
+ LLViewerObject::const_child_list_t& child_list = getChildren();
+ for (LLViewerObject::child_list_t::const_iterator iter = child_list.begin();
+ iter != child_list.end();
+ ++iter)
+ {
+ const LLViewerObject* child_objectp = *iter;
+ const LLDrawable* child_drawablep = child_objectp->mDrawable;
+ if (child_drawablep)
+ {
+ const LLVOVolume* child_volumep = child_drawablep->getVOVolume();
+ if (child_volumep)
+ {
+ shame += child_volumep->getRenderCost();
+ }
+ }
+ }
+
+ return shame;
+
+}
+
//static
void LLVOVolume::preUpdateGeom()
{
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index 10fc8865fc..fb543efc04 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -120,7 +120,7 @@ public:
const LLMatrix4& getRelativeXform() const { return mRelativeXform; }
const LLMatrix3& getRelativeXformInvTrans() const { return mRelativeXformInvTrans; }
/*virtual*/ const LLMatrix4 getRenderMatrix() const;
-
+ U32 getRenderCost() const;
/*virtual*/ BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
S32 face = -1, // which face to check, -1 = ALL_SIDES
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index c5c97e7649..e37dffd526 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -831,6 +831,7 @@ void LLWearable::addVisualParam(LLVisualParam *param)
}
param->setIsDummy(FALSE);
mVisualParamIndexMap[param->getID()] = param;
+ mSavedVisualParamMap[param->getID()] = param->getDefaultWeight();
}
void LLWearable::setVisualParams()
@@ -933,11 +934,39 @@ void LLWearable::setClothesColor( S32 te, const LLColor4& new_color, BOOL upload
void LLWearable::revertValues()
{
//update saved settings so wearable is no longer dirty
+ // non-driver params first
for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
{
S32 id = iter->first;
F32 value = iter->second;
- setVisualParamWeight(id, value, TRUE);
+ LLVisualParam *param = getVisualParam(id);
+ if(param && !dynamic_cast<LLDriverParam*>(param) )
+ {
+ setVisualParamWeight(id, value, TRUE);
+ }
+ }
+
+ //then driver params
+ for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+ {
+ S32 id = iter->first;
+ F32 value = iter->second;
+ LLVisualParam *param = getVisualParam(id);
+ if(param && dynamic_cast<LLDriverParam*>(param) )
+ {
+ setVisualParamWeight(id, value, TRUE);
+ }
+ }
+
+ // make sure that saved values are sane
+ for (param_map_t::const_iterator iter = mSavedVisualParamMap.begin(); iter != mSavedVisualParamMap.end(); iter++)
+ {
+ S32 id = iter->first;
+ LLVisualParam *param = getVisualParam(id);
+ if( param )
+ {
+ mSavedVisualParamMap[id] = param->getWeight();
+ }
}
syncImages(mSavedTEMap, mTEMap);
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index 8d3165b98c..9897f40c4e 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -196,7 +196,7 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32
// END DEBUG
//LL_INFOS("World Map") << "LLWorldMipmap::loadObjectsTile(), URL = " << imageurl << LL_ENDL;
- LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, FALSE, LLViewerTexture::LOD_TEXTURE);
+ LLPointer<LLViewerFetchedTexture> img = LLViewerTextureManager::getFetchedTextureFromUrl(imageurl, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
img->setBoostLevel(LLViewerTexture::BOOST_MAP);
// Return the smart pointer
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index 7e19a80c10..028a5844c6 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -513,7 +513,7 @@
reference="White" />
<color
name="ObjectChatColor"
- reference="LtGray" />
+ reference="0.7 0.8 0.9 1" />
<color
name="OverdrivenColor"
value="1 0 0 1" />
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index e881665578..d5293bdbb5 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -23,13 +23,13 @@
<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="AudioMute_Off.png" file_name="icons/AudioMute_Off.png" preload="false" />
- <texture name="AudioMute_Over.png" file_name="icons/AudioMute_Over.png" preload="false" />
- <texture name="AudioMute_Press.png" file_name="icons/AudioMute_Press.png" preload="false" />
+ <texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
+ <texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
+ <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" />
- <texture name="Audio_Off.png" file_name="icons/Audio_Off.png" preload="false" />
- <texture name="Audio_Over.png" file_name="icons/Audio_Over.png" preload="false" />
- <texture name="Audio_Press.png" file_name="icons/Audio_Press.png" preload="false" />
+ <texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
+ <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" />
+ <texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
<texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />
<texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
@@ -109,9 +109,9 @@
<texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
- <texture name="ExternalBrowser_Off.png" file_name="icons/ExternalBrowser_Off.png" preload="false" />
- <texture name="ExternalBrowser_Over.png" file_name="icons/ExternalBrowser_Over.png" preload="false" />
- <texture name="ExternalBrowser_Press.png" file_name="icons/ExternalBrowser_Press.png" preload="false" />
+ <texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
+ <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" />
+ <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" />
<texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
<texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
@@ -338,12 +338,12 @@
<texture name="parcel_lght_Voice" file_name="icons/parcel_lght_Voice.png" preload="false" />
<texture name="parcel_lght_VoiceNo" file_name="icons/parcel_lght_VoiceNo.png" preload="false" />
- <texture name="Pause_Off.png" file_name="icons/Pause_Off.png" preload="false" />
- <texture name="Pause_Over.png" file_name="icons/Pause_Over.png" preload="false" />
- <texture name="Pause_Press.png" file_name="icons/Pause_Press.png" preload="false" />
- <texture name="Play_Off.png" file_name="icons/Play_Off.png" preload="false" />
- <texture name="Play_Over.png" file_name="icons/Play_Over.png" preload="false" />
- <texture name="Play_Press.png" file_name="icons/Play_Press.png" preload="false" />
+ <texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
+ <texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
+ <texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+ <texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
+ <texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
+ <texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
<texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
<texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
@@ -425,12 +425,12 @@
<texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SkipBackward_Off.png" file_name="icons/SkipBackward_Off.png" preload="false" />
- <texture name="SkipBackward_Over.png" file_name="icons/SkipBackward_Over.png" preload="false" />
- <texture name="SkipBackward_Press.png" file_name="icons/SkipBackward_Press.png" preload="false" />
- <texture name="SkipForward_Off.png" file_name="icons/SkipForward_Off.png" preload="false" />
- <texture name="SkipForward_Over.png" file_name="icons/SkipForward_Over.png" preload="false" />
- <texture name="SkipForward_Press.png" file_name="icons/SkipForward_Press.png" preload="false" />
+ <texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
+ <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" />
+ <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" />
+ <texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
+ <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" />
+ <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" />
<texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
<texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
@@ -449,9 +449,9 @@
<texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="true" />
<texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="true" />
- <texture name="StopReload_Off.png" file_name="icons/StopReload_Off.png" preload="false" />
- <texture name="StopReload_Over.png" file_name="icons/StopReload_Over.png" preload="false" />
- <texture name="StopReload_Press.png" file_name="icons/StopReload_Press.png" preload="false" />
+ <texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
+ <texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
+ <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />
<texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />
<texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
@@ -532,6 +532,8 @@
<texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" />
<texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" />
+ <texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
+
<texture name="TrashItem_Disabled" file_name="icons/TrashItem_Disabled.png" preload="false" />
<texture name="TrashItem_Off" file_name="icons/TrashItem_Off.png" preload="false" />
<texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
@@ -561,9 +563,9 @@
<texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
- <texture name="Zoom_Off.png" file_name="icons/Zoom_Off.png" preload="false" />
- <texture name="Zoom_Over.png" file_name="icons/Zoom_Over.png" preload="false" />
- <texture name="Zoom_Press.png" file_name="icons/Zoom_Press.png" preload="false" />
+ <texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
+ <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" />
+ <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />
<!--WARNING OLD ART *do not use*-->
diff --git a/indra/newview/skins/default/textures/widgets/Tooltip.png b/indra/newview/skins/default/textures/widgets/Tooltip.png
new file mode 100644
index 0000000000..f989ac9083
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/Tooltip.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
index a0f9bb59fd..3a1499eaaa 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_picker.xml
@@ -16,7 +16,7 @@
</floater.string>
<floater.string
name="no_one_near">
- No-one near
+ No one near
</floater.string>
<floater.string
name="no_results">
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index 5c09bc3a02..f553184c19 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -49,22 +49,57 @@
top="22"
visible="false"
width="78" />
- <!--TODO: replace with slider, + - images -->
- <joystick_zoom
- follows="top|left"
- height="78"
- image_unselected="ScrollThumb_Vert"
- layout="topleft"
- left="7"
- minus_image="ScrollThumb_Vert"
- name="zoom"
- plus_image="ScrollThumb_Vert"
- quadrant="left"
- scale_image="false"
- sound_flags="3"
- tool_tip="Zoom camera toward focus"
- top="22"
- width="20" />
+ <!--TODO: replace + - images -->
+ <panel
+ border="false"
+ class="camera_zoom_panel"
+ height="94"
+ layout="topleft"
+ left="7"
+ mouse_opaque="false"
+ name="zoom"
+ top="22"
+ width="18">
+ <button
+ follows="top|left"
+ height="18"
+ image_disabled="AddItem_Disabled"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ layout="topleft"
+ name="zoom_plus_btn"
+ width="18">
+ <commit_callback
+ function="Zoom.plus" />
+ <mouse_held_callback
+ function="Zoom.plus" />
+ </button>
+ <slider_bar
+ height="48"
+ layout="topleft"
+ name="zoom_slider"
+ orientation="vertical"
+ tool_tip="Zoom camera toward focus"
+ top_pad="0"
+ width="18">
+ <commit_callback function="Slider.value_changed"/>
+ </slider_bar>
+ <button
+ follows="top|left"
+ height="18"
+ image_disabled="AddItem_Disabled"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ layout="topleft"
+ name="zoom_minus_btn"
+ top_pad="0"
+ width="18">
+ <commit_callback
+ function="Zoom.minus" />
+ <mouse_held_callback
+ function="Zoom.minus" />
+ </button>
+ </panel>
<joystick_rotate
follows="top|left"
height="78"
@@ -72,6 +107,7 @@
image_unselected="Cam_Rotate_Out"
layout="topleft"
left="45"
+ mouse_opaque="false"
name="cam_rotate_stick"
quadrant="left"
scale_image="false"
@@ -80,7 +116,7 @@
tool_tip="Orbit camera around focus"
top="22"
width="78" />
- <panel
+ <panel
height="78"
layout="topleft"
left="36"
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 6c4f10e61e..9d2a811d9f 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -3383,6 +3383,16 @@ scratch and wear it.
bottom="536"
follows="right|bottom"
height="20"
+ label="Make Outfit"
+ label_selected="Make Outfit"
+ layout="topleft"
+ name="make_outfit_btn"
+ right="-216"
+ width="100" />
+ <button
+ bottom="536"
+ follows="right|bottom"
+ height="20"
label="Cancel"
label_selected="Cancel"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_gesture.xml b/indra/newview/skins/default/xui/en/floater_gesture.xml
index b23482655c..a3ac878202 100644
--- a/indra/newview/skins/default/xui/en/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_gesture.xml
@@ -84,21 +84,21 @@
top_delta="0"
width="18" />
<button
- follows="bottom|left"
+ follows="bottom|right"
font="SansSerifBigBold"
height="18"
image_selected="TrashItem_Press"
image_unselected="TrashItem_Off"
image_disabled="TrashItem_Disabled"
layout="topleft"
- left_pad="230"
name="del_btn"
+ right="-5"
tool_tip="Delete this gesture"
top_delta="0"
width="18" />
</panel>
<button
- follows="bottom|right"
+ follows="left|bottom"
height="23"
label="Edit"
layout="topleft"
@@ -107,7 +107,7 @@
top_pad="5"
width="83" />
<button
- follows="bottom|right"
+ follows="left|bottom"
height="23"
label="Play"
layout="topleft"
@@ -116,7 +116,7 @@
top_delta="0"
width="83" />
<button
- follows="bottom|right"
+ follows="left|bottom"
height="23"
label="Stop"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 16873df310..526fda90d1 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -4,13 +4,17 @@
can_close="false"
can_minimize="false"
can_tear_off="false"
- height="200"
+ height="125"
layout="topleft"
name="incoming call"
help_topic="incoming_call"
title="UNKNOWN PERSON IS CALLING"
- width="240">
- <floater.string
+ width="410">
+ <floater.string
+ name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string
name="anonymous">
anonymous
</floater.string>
@@ -31,18 +35,26 @@
left_delta="19"
top="35"
width="36" />
- <text_editor
- font="SansSerif"
- height="64"
- border_visible="false"
+ <text
+ font="SansSerifLarge"
+ height="20"
layout="topleft"
left="77"
- max_length="2147483647"
name="caller name"
- read_only="true"
- top="21"
- width="163"
+ top="27"
+ width="315"
word_wrap="true" />
+ <text
+ font="SansSerif"
+ height="50"
+ layout="topleft"
+ left="77"
+ name="question"
+ top="52"
+ width="315"
+ word_wrap="true">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
+ </text>
<button
height="24"
label="Accept"
@@ -57,16 +69,14 @@
label="Reject"
label_selected="Reject"
layout="topleft"
- left_delta="0"
name="Reject"
- top_pad="12"
+ left_pad="10"
width="100" />
<button
height="24"
label="Start IM"
layout="topleft"
- left_delta="0"
name="Start IM"
- top_pad="12"
+ left_pad="10"
width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index 30639f955f..b48c962413 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -36,10 +36,10 @@
filename="panel_main_inventory.xml"
follows="all"
layout="topleft"
+ hide_top_panel="true"
left="0"
label="Inventory Panel"
name="Inventory Panel"
top="15"
- width="467">
-</panel>
+ width="467" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_media_settings.xml b/indra/newview/skins/default/xui/en/floater_media_settings.xml
index 68dd2001af..8122386fae 100644
--- a/indra/newview/skins/default/xui/en/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_settings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- bottom="-666"
+ bottom="666"
can_close="true"
can_drag_on_left="false"
can_minimize="true"
@@ -12,14 +12,14 @@
width="365"
height="535"
left="330"
- min_height="430"
- min_width="620"
+ min_height="535"
+ min_width="365"
mouse_opaque="true"
- name="Media Settings"
+ name="media_settings"
help_topic = "media_settings"
title="MEDIA SETTINGS">
<button
- bottom="-525"
+ bottom="525"
enabled="true"
follows="right|bottom"
font="SansSerif"
@@ -61,7 +61,7 @@
scale_image="true"
width="90" />
<tab_container
- bottom="-500"
+ bottom="500"
enabled="true"
follows="left|top|right|bottom"
height="485"
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
new file mode 100644
index 0000000000..82417de8a7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_close="false"
+ can_minimize="false"
+ can_tear_off="false"
+ height="125"
+ layout="topleft"
+ name="outgoing call"
+ help_topic="outgoing_call"
+ title="CALLING"
+ width="410">
+ <floater.string
+ name="localchat">
+ Nearby Voice Chat
+ </floater.string>
+ <floater.string
+ name="anonymous">
+ anonymous
+ </floater.string>
+ <floater.string
+ name="VoiceInviteP2P">
+ is calling.
+ </floater.string>
+ <floater.string
+ name="VoiceInviteAdHoc">
+ has joined a Voice Chat call with a conference chat.
+ </floater.string>
+ <avatar_icon
+ enabled="false"
+ follows="left|top"
+ height="36"
+ image_name="icon_avatar_online.tga"
+ layout="topleft"
+ left_delta="19"
+ top="35"
+ width="36" />
+ <text
+ font="SansSerifLarge"
+ height="20"
+ layout="topleft"
+ left="77"
+ name="connecting"
+ top="27"
+ visible="false"
+ width="315"
+ word_wrap="true">
+Connecting to [CALLEE_NAME]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="20"
+ layout="topleft"
+ left="77"
+ name="calling"
+ top="27"
+ width="315"
+ word_wrap="true">
+Calling [CALLEE_NAME]
+ </text>
+ <text
+ font="SansSerif"
+ height="50"
+ layout="topleft"
+ left="77"
+ name="leaving"
+ top="52"
+ width="315"
+ word_wrap="true">
+Leaving [CURRENT_CHAT].
+ </text>
+ <button
+ height="24"
+ label="Cancel"
+ label_selected="Cancel"
+ left="70"
+ layout="topleft"
+ name="Cancel"
+ left_pad="10"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index b9cf456842..d9498586af 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -25,7 +25,7 @@
Done
</floater.string>
<layout_stack
- bottom="400"
+ bottom="512"
follows="left|right|top|bottom"
layout="topleft"
left="10"
@@ -54,7 +54,7 @@
layout="topleft"
left_delta="0"
name="status_text"
- top_pad="4"
+ top_pad="5"
width="150" />
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/floater_test_slider.xml b/indra/newview/skins/default/xui/en/floater_test_slider.xml
index 57d8e686ce..86ff82e01f 100644
--- a/indra/newview/skins/default/xui/en/floater_test_slider.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_slider.xml
@@ -57,6 +57,13 @@
width="200" />
<slider_bar
bottom="320"
+ height="100"
+ left="20"
+ name="slider_bar_vertical"
+ orientation="vertical"
+ width="20" />
+ <slider_bar
+ bottom="300"
height="20"
increment="1"
initial_value="2.0"
@@ -64,6 +71,7 @@
layout="topleft"
max_val="5"
min_val="1"
+ left_pad="20"
name="slider_bar"
width="300" />
<slider
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index c33d7cf31d..b2f46bc433 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -262,6 +262,18 @@
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
+
+ <text
+ text_color="LtGray_50"
+ follows="top|left"
+ halign="left"
+ left="13"
+ name="RenderingCost"
+ top_pad="9"
+ type="string"
+ width="100">
+ þ: [COUNT]
+ </text>
<check_box
control_name="ScaleUniform"
height="19"
@@ -325,7 +337,7 @@
<button.commit_callback
function="BuildTool.gridOptions"/>
</button>
- <button
+ <button
follows="left|top"
height="20"
image_disabled="Object_Cube"
@@ -701,6 +713,7 @@
function="BuildTool.applyToSelection"/>
</button>
<text
+ text_color="LtGray_50"
type="string"
length="1"
height="12"
@@ -714,6 +727,7 @@
Objects: [COUNT]
</text>
<text
+ text_color="LtGray_50"
type="string"
length="1"
follows="left|top"
@@ -730,7 +744,7 @@
halign="center"
left="0"
name="Object Info Tabs"
- tab_max_width="55"
+ tab_max_width="54"
tab_min_width="40"
tab_position="top"
tab_height="25"
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index 4e2cce1428..1adb824e2a 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -53,22 +53,6 @@
Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE],
you must accept the agreement.
</text>
- <text_editor
- type="string"
- length="1"
- follows="left|top"
- font="SansSerif"
- height="283"
- layout="topleft"
- left_delta="0"
- max_length="65536"
- name="tos_text"
- top_pad="43"
- width="568"
- handle_edit_keys_directly="true"
- word_wrap="true">
- TOS_TEXT
- </text_editor>
<web_browser
follows="left|top"
height="340"
@@ -76,6 +60,6 @@ you must accept the agreement.
left_delta="0"
name="tos_html"
start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E"
- top_delta="-27"
+ top_delta="0"
width="568" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index e5e5007c56..f48af2f97e 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -31,7 +31,7 @@
use_ellipses="true"
width="240"
word_wrap="false">
- Grumpity's Grumpy Group of Moose
+ Grumpity&apos;s Grumpy Group of Moose
</text>
<text
follows="all"
diff --git a/indra/newview/skins/default/xui/en/inspect_remote_object.xml b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
new file mode 100644
index 0000000000..07c684d904
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/inspect_remote_object.xml
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater
+ legacy_header_height="18"
+ bevel_style="in"
+ bg_opaque_image="Inspector_Background"
+ can_close="false"
+ can_minimize="false"
+ height="145"
+ layout="topleft"
+ name="inspect_remote_object"
+ single_instance="true"
+ sound_flags="0"
+ visible="true"
+ width="300">
+ <text
+ follows="all"
+ font="SansSerifLargeBold"
+ height="16"
+ left="8"
+ name="object_name"
+ text_color="White"
+ top="5"
+ use_ellipses="true"
+ width="290">
+ Test Object Name That Is Really Long
+ </text>
+ <text
+ follows="all"
+ font="SansSerif"
+ height="20"
+ left="8"
+ name="object_owner_label"
+ width="55"
+ top_pad="20">
+ Owner:
+ </text>
+ <text
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ left_pad="10"
+ name="object_owner"
+ use_ellipses="true"
+ width="200"
+ word_wrap="false">
+ Longavatarname Johnsonlongstonnammer
+ </text>
+ <text
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ left="8"
+ name="object_slurl_label"
+ top_pad="10"
+ width="55">
+ Location:
+ </text>
+ <text
+ follows="top|left"
+ height="20"
+ left_pad="10"
+ name="object_slurl"
+ width="240"
+ use_ellipses="true"
+ word_wrap="false">
+ http://slurl.com/Ahern/50/50/50
+ </text>
+ <button
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ label="Map"
+ left="10"
+ name="map_btn"
+ top="114"
+ width="75" />
+ <button
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ label="Block"
+ left_pad="5"
+ name="block_btn"
+ top_delta="0"
+ width="75" />
+ <button
+ follows="top|left"
+ font="SansSerif"
+ height="20"
+ label="Close"
+ right="-10"
+ name="close_btn"
+ top_delta="0"
+ width="75" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 08f7ee456e..9e35c95d45 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -51,6 +51,13 @@
name="main_view"
user_resize="true"
width="500">
+ <view bottom="500"
+ follows="all"
+ height="500"
+ left="0"
+ mouse_opaque="false"
+ name="world_view_rect"
+ width="500"/>
<layout_stack border_size="0"
bottom="500"
follows="all"
@@ -66,13 +73,6 @@
mouse_opaque="false"
name="hud container"
width="500">
- <view bottom="500"
- follows="all"
- height="500"
- left="0"
- mouse_opaque="false"
- name="world_view_rect"
- width="500"/>
<panel follows="right|top|bottom"
height="500"
mouse_opaque="false"
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 8b6ab4e4d8..b65a49eaed 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -356,9 +356,9 @@
parameter="restore" />
</menu_item_call>
<menu_item_call
- label="Goto Link"
+ label="Find Original"
layout="topleft"
- name="Goto Link">
+ name="Find Original">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="goto" />
@@ -434,9 +434,9 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
- label="Take Off Items"
+ label="Remove From Outfit"
layout="topleft"
- name="Take Off Items">
+ name="Remove From Outfit">
<menu_item_call.on_click
function="Inventory.DoToSelected"
parameter="removefromoutfit" />
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index bd60574a95..07940e18b6 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -193,6 +193,13 @@
function="ShowFloater"
parameter="test_widgets" />
</menu_item_call>
+ <menu_item_call
+ label="Inspectors Test"
+ name="Inspectors Test">
+ <menu_item_call.on_click
+ function="ShowFloater"
+ parameter="test_inspectors" />
+ </menu_item_call>
<menu_item_check
label="Reg In Client Test (restart)"
name="Reg In Client Test (restart)">
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index 6dd44255bf..304492bedb 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -13,15 +13,11 @@
function="CheckControl"
parameter="GroupListShowIcons" />
</menu_item_check>
- <menu_item_check
+ <menu_item_call
label="Leave Selected Group"
layout="topleft"
name="Leave Selected Group">
- <menu_item_check.on_click
- function="People.Groups.ViewSort.Action"
- parameter="show_icons" />
- <menu_item_check.on_check
- function="CheckControl"
- parameter="GroupListShowIcons" />
- </menu_item_check>
+ <menu_item_call.on_click
+ function="People.Group.Minus.Action"/>
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
new file mode 100644
index 0000000000..7b52fecef7
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ height="50"
+ layout="topleft"
+ mouse_opaque="false"
+ name="profile_overflow_menu"
+ width="120">
+ <menu_item_call
+ label="Pay"
+ layout="topleft"
+ name="pay">
+ <menu_item_call.on_click
+ function="Profile.Pay" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index e98a6d57bb..181994a1bd 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2572,10 +2572,10 @@
name="Hover Glow Objects">
<menu_item_check.on_check
function="CheckControl"
- parameter="RenderHighlightEnable" />
+ parameter="RenderHoverGlowEnable" />
<menu_item_check.on_click
function="ToggleControl"
- parameter="RenderHighlightEnable" />
+ parameter="RenderHoverGlowEnable" />
</menu_item_check>
</menu>
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index ccd8bc569e..9fe03859bb 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -4696,7 +4696,12 @@ The objects on the selected parcel that are NOT owned by you have been returned
icon="notify.tga"
name="ServerObjectMessage"
type="notify">
+Message from [NAME]:
[MSG]
+ <usetemplate
+ name="okcancelbuttons"
+ notext="OK"
+ yestext="Inspect"/>
</notification>
<notification
@@ -4952,8 +4957,9 @@ No valid parcel could be found.
<notification
icon="notify.tga"
name="ObjectGiveItem"
- type="notify">
-An object named [OBJECTFROMNAME] owned by [FIRST] [LAST] has given you a [OBJECTTYPE] named [OBJECTNAME].
+ type="offer">
+An object named [OBJECTFROMNAME] owned by [NAME] has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button
index="0"
@@ -4995,7 +5001,8 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
icon="notify.tga"
name="UserGiveItem"
type="offer">
-[NAME] has given you a [OBJECTTYPE] named &apos;[OBJECTNAME]&apos;.
+[NAME] has offered you [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button
index="0"
@@ -5013,6 +5020,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you a
name="GodMessage"
type="notify">
[NAME]
+
[MESSAGE]
</notification>
@@ -5579,7 +5587,7 @@ We&apos;re sorry. This area has reached maximum capacity for voice conversation
icon="notifytip.tga"
name="VoiceChannelDisconnected"
type="notifytip">
-You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to spatial voice chat.
+You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -5589,7 +5597,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="VoiceChannelDisconnectedP2P"
type="notifytip">
-[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -5599,7 +5607,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="P2PCallDeclined"
type="notifytip">
-[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] has declined your call. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -5609,7 +5617,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="P2PCallNoAnswer"
type="notifytip">
-[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to spatial voice chat.
+[VOICE_CHANNEL_NAME] is not available to take your call. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -5619,7 +5627,7 @@ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnect
icon="notifytip.tga"
name="VoiceChannelJoinFailed"
type="notifytip">
-Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to spatial voice chat.
+Failed to connect to [VOICE_CHANNEL_NAME], please try again later. You will now be reconnected to Nearby Voice Chat.
<unique>
<context key="VOICE_CHANNEL_NAME"/>
</unique>
@@ -5733,6 +5741,15 @@ Are you sure you want to delete your teleport history?
yestext="OK"/>
</notification>
+ <notification
+ icon="alert.tga"
+ name="BottomTrayButtonCanNotBeShown"
+ type="alert">
+Selected button can not be shown right now.
+The button will be shown when there is enough space for it.
+ </notification>
+
+
<global name="UnsupportedCPU">
- Your CPU speed does not meet the minimum requirements.
</global>
diff --git a/indra/newview/skins/default/xui/en/panel_activeim_row.xml b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
index 8b815b0f71..38294c907a 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -7,7 +7,9 @@
left="0"
height="35"
width="318"
- background_visible="false">
+ background_opaque="false"
+ background_visible="true"
+ bg_alpha_color="0.0 0.0 0.0 0.0" >
<chiclet_im_p2p
name="p2p_chiclet"
layout="topleft"
@@ -15,7 +17,16 @@
top="3"
left="5"
height="25"
- width="25">
+ width="25"
+ visible="false"
+ speaker.name="speaker_p2p"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
</chiclet_im_p2p>
<chiclet_im_group
name="group_chiclet"
@@ -24,14 +35,41 @@
top="3"
left="5"
height="25"
- width="25">
+ width="25"
+ visible="false"
+ speaker.name="speaker_grp"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
</chiclet_im_group>
+ <chiclet_im_adhoc
+ name="adhoc_chiclet"
+ layout="topleft"
+ follows="left"
+ top="3"
+ left="5"
+ height="25"
+ width="25"
+ visible="false"
+ speaker.name="speaker_hoc"
+ speaker.width="20"
+ speaker.height="25"
+ speaker.left="25"
+ speaker.top="25"
+ speaker.auto_update="true"
+ speaker.draw_border="false"
+ speaker.visible="false">
+ </chiclet_im_adhoc>
<text
type="string"
name="contact_name"
layout="topleft"
top="10"
- left_pad="0"
+ left_pad="20"
height="14"
width="245"
length="1"
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 0c42686531..2eaa3a94ee 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
@@ -30,7 +30,7 @@
<avatar_icon
follows="top|left"
height="20"
- image_name="smile.png"
+ default_icon_name="Generic_Person"
layout="topleft"
left="5"
mouse_opaque="true"
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index ca6d8334a2..a902f50582 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -13,6 +13,8 @@
chrome="true"
border_visible="false"
width="1000">
+ <string name="SpeakBtnToolTip">Turns microphone on/off</string>
+ <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string>
<layout_stack
mouse_opaque="false"
border_size="0"
@@ -45,7 +47,7 @@
min_height="23"
width="310"
top="0"
- min_width="310"
+ min_width="192"
name="chat_bar"
user_resize="false"
filename="panel_nearby_chat_bar.xml" />
@@ -70,9 +72,7 @@
left="0"
name="talk"
top="3"
- width="100"
- speak_button.tool_tip="Turns microphone on/off"
- show_button.tool_tip="Shows/hides voice control panel" />
+ width="100" />
</layout_panel>
<icon
auto_resize="false"
@@ -92,13 +92,13 @@
height="28"
layout="topleft"
min_height="28"
- width="80"
+ width="82"
top_delta="0"
- min_width="76"
+ min_width="82"
name="gesture_panel"
user_resize="false">
- <button
- follows="right"
+ <gesture_combo_box
+ follows="left|right"
height="23"
label="Gesture"
layout="topleft"
@@ -106,7 +106,7 @@
left="0"
top="3"
use_ellipses="true"
- width="80"
+ width="82"
tool_tip="Shows/hides gestures"/>
</layout_panel>
<icon
@@ -129,8 +129,9 @@
layout="topleft"
min_height="28"
name="movement_panel"
+ user_resize="false"
width="80"
- min_width="76">
+ min_width="80">
<button
follows="left|right"
height="23"
@@ -166,10 +167,10 @@
height="28"
layout="topleft"
min_height="28"
- min_width="76"
+ min_width="80"
name="cam_panel"
- top_delta="-10"
- width="100">
+ user_resize="false"
+ width="80">
<button
follows="left|right"
height="23"
@@ -205,6 +206,7 @@
follows="left|right"
height="28"
layout="topleft"
+ min_width="40"
name="snapshot_panel"
width="40">
<button
@@ -231,15 +233,18 @@
top="0"
name="chiclet_list_panel"
width="189"
- min_width="189"
+ min_width="180"
user_resize="false"
auto_resize="true">
+<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
+as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
<chiclet_panel
mouse_opaque="false"
follows="left|right"
height="28"
layout="topleft"
left="0"
+ min_width="180"
name="chiclet_list"
top="0"
chiclet_padding="3"
@@ -313,9 +318,9 @@
/>
<unread_notifications
width="34"
- height="23"
- left="22"
- top="23" />
+ height="20"
+ left="0"
+ top="19" />
</chiclet_notification>
</layout_panel>
<icon
@@ -328,6 +333,6 @@
min_width="4"
right="-1"
top="0"
- width="26"/>
+ width="4"/>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 4f24c7a745..58a78a0ab8 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -8,7 +8,7 @@
left="0"
top="0"
name="general_tab"
- width="303">
+ width="310">
<panel.string
name="help_text">
The General tab contains general information about this group, a list of members, general Group Preferences and member options.
@@ -32,7 +32,7 @@ Hover your mouse over the options for more help.
max_length="511"
name="charter"
top="5"
- width="303"
+ width="305"
word_wrap="true">
Group Charter
</text_editor>
@@ -43,10 +43,10 @@ Hover your mouse over the options for more help.
heading_height="16"
height="130"
layout="topleft"
- left_delta="0"
+ left="5"
name="visible_members"
- top_pad="0"
- width="303">
+ top_pad="2"
+ width="305">
<name_list.columns
label="Member"
name="name"
@@ -64,7 +64,7 @@ Hover your mouse over the options for more help.
left_delta="0"
name="active_title_label"
top_pad="5"
- width="303">
+ width="300">
My Title
</text>
<combo_box
@@ -75,7 +75,7 @@ Hover your mouse over the options for more help.
name="active_title"
tool_tip="Sets the title that appears in your avatar&apos;s name tag when this group is active."
top_pad="2"
- width="303" />
+ width="305" />
<check_box
height="16"
font="SansSerifSmall"
@@ -85,7 +85,7 @@ Hover your mouse over the options for more help.
name="receive_notices"
tool_tip="Sets whether you want to receive Notices from this group. Uncheck this box if this group is spamming you."
top_pad="5"
- width="303" />
+ width="300" />
<check_box
height="16"
label="Show in my profile"
@@ -94,7 +94,7 @@ Hover your mouse over the options for more help.
name="list_groups_in_profile"
tool_tip="Sets whether you want to show this group in your profile"
top_pad="5"
- width="303" />
+ width="295" />
<panel
background_visible="true"
bevel_style="in"
@@ -106,7 +106,7 @@ Hover your mouse over the options for more help.
left="5"
name="preferences_container"
top_pad="5"
- width="303">
+ width="305">
<check_box
follows="right|top"
height="16"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index de1323d9cb..0082128ca4 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -9,7 +9,7 @@ background_visible="true"
left="0"
top="20"
name="GroupInfo"
- width="333">
+ width="323">
<panel.string
name="default_needs_apply_text">
There are unsaved changes to the current tab
@@ -117,28 +117,17 @@ background_visible="true"
width="120" />
<accordion
follows="all"
- height="425"
+ height="405"
layout="topleft"
left="0"
name="groups_accordion"
top_pad="15"
- width="336">
+ width="323">
<accordion_tab
expanded="true"
layout="topleft"
name="group_general_tab"
title="General">
- <scroll_container
- color="DkGray2"
- opaque="true"
- height="323"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- name="general_scroll"
- reserve_scroll_corner="false"
- width="333">
<panel
border="false"
class="panel_group_general"
@@ -146,27 +135,15 @@ background_visible="true"
layout="topleft"
left="0"
help_topic="group_general_tab"
- name="group_general_tab_panel"
+ name="group_general_tab_panel"
top="0"
- width="303" />
- </scroll_container>
+ width="300" />
</accordion_tab>
<accordion_tab
expanded="false"
layout="topleft"
name="group_roles_tab"
title="Roles">
- <scroll_container
- color="DkGray2"
- opaque="true"
- height="323"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- name="roles_scroll"
- reserve_scroll_corner="false"
- width="333">
<panel
border="false"
class="panel_group_roles"
@@ -177,24 +154,12 @@ background_visible="true"
name="group_roles_tab_panel"
top="0"
width="303" />
- </scroll_container>
</accordion_tab>
<accordion_tab
expanded="false"
layout="topleft"
name="group_notices_tab"
title="Notices">
- <scroll_container
- color="DkGray2"
- opaque="true"
- height="323"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- name="notices_scroll"
- reserve_scroll_corner="false"
- width="333">
<panel
border="false"
class="panel_group_notices"
@@ -205,24 +170,12 @@ background_visible="true"
name="group_notices_tab_panel"
top="0"
width="303" />
- </scroll_container>
</accordion_tab>
<accordion_tab
expanded="false"
layout="topleft"
name="group_land_tab"
title="Land/Assets">
- <scroll_container
- color="DkGray2"
- opaque="true"
- height="323"
- follows="all"
- layout="topleft"
- left="0"
- top="0"
- name="land_scroll"
- reserve_scroll_corner="false"
- width="333">
<panel
border="false"
class="panel_group_land_money"
@@ -232,8 +185,7 @@ background_visible="true"
help_topic="group_land_money_tab"
name="group_land_tab_panel"
top="0"
- width="313" />
- </scroll_container>
+ width="300" />
</accordion_tab>
</accordion>
<button
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 0c6f81f8fd..2c649642c3 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -5,10 +5,10 @@
height="510"
label="Land &amp; L$"
layout="topleft"
- left="1"
+ left="0"
name="land_money_tab"
top="0"
- width="313">
+ width="310">
<panel.string
name="help_text">
Parcels owned by a group are listed along with contribution details. A warning appears until the Total Land in Use is less than or = to the Total Contribution.
@@ -47,10 +47,10 @@
heading_height="20"
height="150"
layout="topleft"
- left="0"
+ left="2"
name="group_parcel_list"
top_pad="0"
- width="313">
+ width="305">
<scroll_list.columns
label="Parcel"
name="name"
@@ -79,7 +79,7 @@
label_selected="Map"
layout="topleft"
name="map_button"
- right="-10"
+ right="-5"
top_pad="5"
width="95"
enabled="false" />
@@ -185,7 +185,9 @@
layout="topleft"
left_pad="3"
name="your_contribution_units"
- top_delta="2">
+ top_delta="2"
+ width="40"
+ >
</text>
<text
@@ -210,17 +212,17 @@
visible="false"
width="16" />
<text
- follows="left|top"
+ follows="left|top"
type="string"
word_wrap="true"
font="SansSerifSmall"
height="35"
layout="topleft"
- left_pad="0"
+ left_pad="5"
name="group_over_limit_text"
text_color="EmphasisColor"
top_delta="0"
- width="290">
+ width="260">
Group members must contribute more land credits to support land in use
</text>
<text
@@ -241,7 +243,7 @@
height="200"
halign="center"
layout="topleft"
- left="10"
+ left="5"
name="group_money_tab_container"
tab_position="top"
tab_height="20"
@@ -268,7 +270,7 @@
left="0"
max_length="4096"
name="group_money_planning_text"
- top="0"
+ top="2"
width="300"
word_wrap="true">
Loading...
@@ -293,7 +295,7 @@
left="0"
max_length="4096"
name="group_money_details_text"
- top="0"
+ top="2"
width="300"
word_wrap="true">
Loading...
@@ -305,8 +307,8 @@
layout="topleft"
name="earlier_details_button"
tool_tip="Back"
- top_pad="3"
- right="-35"
+ top_pad="5"
+ right="-45"
width="31" />
<button
follows="left|top"
@@ -327,7 +329,7 @@
left_delta="0"
help_topic="group_money_sales_tab"
name="group_money_sales_tab"
- top_delta="-1"
+ top="5"
width="300">
<text_editor
type="string"
@@ -337,7 +339,7 @@
left="0"
max_length="4096"
name="group_money_sales_text"
- top="0"
+ top="2"
width="300"
word_wrap="true">
Loading...
@@ -349,8 +351,8 @@
layout="topleft"
name="earlier_sales_button"
tool_tip="Back"
- top_pad="3"
- right="-35"
+ top_pad="5"
+ right="-45"
width="31" />
<button
follows="left|top"
@@ -358,7 +360,7 @@
image_overlay="Arrow_Right_Off"
layout="topleft"
left_pad="10"
- name="later_sales_button"
+ name="later_sales_button"
tool_tip="Next"
width="31" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_notices.xml b/indra/newview/skins/default/xui/en/panel_group_notices.xml
index 24a4005a45..e56db6414f 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -7,7 +7,7 @@
left="0"
name="notices_tab"
top="0"
- width="313">
+ width="310">
<panel.string
name="help_text">
Notices are a quick way to communicate across a
@@ -27,7 +27,7 @@ the General tab.
word_wrap="true"
height="30"
layout="topleft"
- left="10"
+ left="5"
name="lbl2"
top="5"
width="300">
@@ -41,10 +41,10 @@ Groups are limited to 200 notices/group daily
heading_height="16"
height="125"
layout="topleft"
- left="0"
+ left="2"
name="notice_list"
top_pad="0"
- width="303">
+ width="305">
<scroll_list.columns
label=""
name="icon"
@@ -81,10 +81,10 @@ Groups are limited to 200 notices/group daily
image_disabled="AddItem_Disabled"
layout="topleft"
label="Create a new notice"
- left="15"
+ left="5"
name="create_new_notice"
tool_tip="Create a new notice"
- top_delta="-5"
+ top_delta="0"
width="18" />
<button
follows="top|left"
@@ -93,7 +93,7 @@ Groups are limited to 200 notices/group daily
layout="topleft"
name="refresh_notices"
right="-5"
- top_delta="5"
+ top_delta="0"
width="23" />
<panel
follows="left|top"
@@ -219,7 +219,7 @@ Groups are limited to 200 notices/group daily
label_selected="Send Notice"
layout="topleft"
right="-10"
- top_pad="20"
+ top_pad="10"
name="send_notice"
width="100" />
<group_drop_target
diff --git a/indra/newview/skins/default/xui/en/panel_group_notify.xml b/indra/newview/skins/default/xui/en/panel_group_notify.xml
index ef3120174e..984a799b41 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notify.xml
@@ -1,77 +1,117 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel background_visible="true" bevel_style="in" bg_alpha_color="0 0 0 0"
- height="155" label="instant_message" layout="topleft" left="0"
- name="panel_group_notify" top="0" width="350">
- <string
- name="message_max_lines_count">
- 4
- </string>
- <panel follows="top" background_visible="true" bevel_style="in" bg_alpha_color="black"
- height="30" label="header" layout="topleft" left="0" name="header"
- top="0" width="350">
- <icon follows="left|top|right|bottom" height="20" width="20" layout="topleft"
- top="5" left="5" mouse_opaque="true" name="group_icon"/>
- <text type="string" length="1" follows="left|top|right|bottom"
- font="SansSerifBigBold" height="20" layout="topleft" left_pad="10" name="title"
- text_color="GroupNotifyTextColor" top="5" width="275" use_ellipses="true">
- Sender Name / Group Name
- </text>
- </panel>
- <text
- follows="top"
- height="20"
- layout="topleft"
- left="25"
- name="subject"
- text_color="GroupNotifyTextColor"
- font="SansSerifBig"
- top="40"
- use_ellipses="true"
- value="subject"
- width="300"
- word_wrap="true">
- subject
- </text>
- <text
- follows="top"
- height="20"
- layout="topleft"
- left="25"
- name="datetime"
- text_color="GroupNotifyTextColor"
- font="SansSerif"
- top="80"
- use_ellipses="true"
- value="datetime"
- width="300"
- word_wrap="true">
- datetime
- </text>
- <text
- follows="left|top|bottom|right"
- height="0"
- layout="topleft"
- left="25"
- name="message"
- text_color="GroupNotifyTextColor"
- top="100"
- use_ellipses="true"
- value="message"
- width="300"
- word_wrap="true"
- visible="true" >
- </text>
- <icon
- follows="left|bottom|right" height="15" width="15"
- layout="topleft" bottom="122" left="25" mouse_opaque="true" name="attachment_icon" visible="true"
- />
- <text font="SansSerif" font.style="UNDERLINE" font_shadow="none"
- type="string" length="1" follows="left|bottom|right" layout="topleft"
- left="45" bottom="122" height="15" width="280" name="attachment"
- text_color="GroupNotifyTextColor" visible="true">
- Attachment
- </text>
-
- <button label="OK" layout="topleft" bottom="145" left="140" height="20"
- width="70" name="btn_ok" follows="bottom" />
-</panel> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="0 0 0 0"
+ height="135"
+ label="instant_message"
+ layout="topleft"
+ left="0"
+ name="panel_group_notify"
+ top="0"
+ width="305">
+ <string
+ name="message_max_lines_count"
+ value="4" />
+ <panel
+ background_visible="true"
+ bevel_style="in"
+ bg_alpha_color="black"
+ follows="top"
+ height="30"
+ label="header"
+ layout="topleft"
+ left="0"
+ name="header"
+ top="0"
+ width="305">
+ <icon
+ follows="left|top|right|bottom"
+ height="20"
+ layout="topleft"
+ left="5"
+ mouse_opaque="true"
+ name="group_icon"
+ top="5"
+ width="20" />
+ <text
+ follows="left|top|right|bottom"
+ font="SansSerifBigBold"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="GroupNotifyTextColor"
+ top="5"
+ use_ellipses="true"
+ value="Sender Name / Group Name"
+ width="230" />
+ </panel>
+ <text
+ follows="top"
+ font="SansSerifBig"
+ height="20"
+ layout="topleft"
+ left="25"
+ name="subject"
+ text_color="GroupNotifyTextColor"
+ top="40"
+ use_ellipses="true"
+ value="subject"
+ width="270"
+ wrap="true" />
+ <text
+ follows="top"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="25"
+ name="datetime"
+ text_color="GroupNotifyTextColor"
+ top="80"
+ use_ellipses="true"
+ value="datetime"
+ width="270"
+ wrap="true" />
+ <text
+ follows="left|top|bottom|right"
+ height="0"
+ layout="topleft"
+ left="25"
+ name="message"
+ text_color="GroupNotifyTextColor"
+ top="100"
+ use_ellipses="true"
+ value="message"
+ width="270"
+ wrap="true" />
+ <icon
+ bottom="122"
+ follows="left|bottom|right"
+ height="15"
+ layout="topleft"
+ left="25"
+ mouse_opaque="true"
+ name="attachment_icon"
+ width="15" />
+ <text
+ bottom="122"
+ follows="left|bottom|right"
+ font="SansSerif"
+ height="15"
+ layout="topleft"
+ left="45"
+ name="attachment"
+ text_color="GroupNotifyTextColor"
+ value="Attachment"
+ width="280" />
+ <button
+ bottom="130"
+ follows="bottom"
+ height="20"
+ label="OK"
+ layout="topleft"
+ left="25"
+ name="btn_ok"
+ width="70" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 4129d7b448..604fb81c8e 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -7,7 +7,7 @@
left="0"
top="0"
name="roles_tab"
- width="313">
+ width="310">
<panel.string
name="default_needs_apply_text">
There are unsaved changes to the current tab
@@ -28,9 +28,9 @@
name="roles_tab_container"
tab_position="top"
tab_height="20"
- tab_min_width="96"
+ tab_min_width="75"
top="3"
- width="303">
+ width="300">
<panel
border="false"
height="220"
@@ -51,23 +51,13 @@ clicking on their names.
<filter_editor
layout="topleft"
top="10"
- left="4"
+ left="5"
width="280"
height="20"
follows="left|top|right"
max_length="250"
label="Filter Members"
name="filter_input" />
- <!-- <button
- enabled="false"
- font="SansSerifSmall"
- height="20"
- label="Show All"
- layout="topleft"
- left_pad="-90"
- name="show_all_button"
- top_delta="-6"
- width="80" />-->
<name_list
column_padding="0"
draw_heading="true"
@@ -111,14 +101,6 @@ clicking on their names.
right="-5"
name="member_eject"
width="100" />
- <!--What is this?-->
- <icon
- height="16"
- image_name="Inv_FolderClosed"
- layout="topleft"
- name="power_folder_icon"
- visible="false"
- width="16" />
</panel>
<panel
border="false"
@@ -156,7 +138,7 @@ including the Everyone and Owner Roles.
<filter_editor
layout="topleft"
top="10"
- left="4"
+ left="5"
width="280"
height="20"
follows="left|top|right"
@@ -179,12 +161,12 @@ including the Everyone and Owner Roles.
draw_stripes="false"
follows="left|top"
heading_height="20"
- height="150"
+ height="160"
layout="topleft"
search_column="1"
left="0"
name="role_list"
- top_pad="4"
+ top_pad="2"
width="300">
<scroll_list.columns
label="Role"
@@ -238,24 +220,13 @@ things in this group. There&apos;s a broad variety of Abilities.
<filter_editor
layout="topleft"
top="10"
- left="4"
+ left="5"
width="280"
height="20"
follows="left|top|right"
max_length="250"
label="Filter Abilities"
name="filter_input" />
- <!--
- <button
- enabled="false"
- font="SansSerifSmall"
- height="20"
- label="Show All"
- layout="topleft"
- left_pad="0"
- name="show_all_button"
- top_delta="0"
- width="80" /> -->
<scroll_list
column_padding="0"
draw_stripes="false"
@@ -267,14 +238,14 @@ things in this group. There&apos;s a broad variety of Abilities.
name="action_list"
search_column="1"
tool_tip="Select an Ability to view more details"
- top_pad="6"
+ top_pad="2"
width="300">
<scroll_list.columns
label=""
name="icon"
width="16" />
<scroll_list.columns
- label=""
+ label="Action"
name="action"
width="247" />
</scroll_list>
@@ -293,9 +264,9 @@ things in this group. There&apos;s a broad variety of Abilities.
follows="left|top"
left="10"
name="members_footer"
- top_pad="10"
+ top="245"
top_delta="0"
- width="300">
+ width="290">
<text
type="string"
height="16"
@@ -304,7 +275,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
name="static"
top_pad="5"
- width="295">
+ width="285">
Assigned Roles
</text>
<scroll_list
@@ -315,7 +286,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
name="member_assigned_roles"
top_pad="0"
- width="295">
+ width="285">
<scroll_list.columns
label=""
name="checkbox"
@@ -323,7 +294,7 @@ things in this group. There&apos;s a broad variety of Abilities.
<scroll_list.columns
label=""
name="role"
- width="265" />
+ width="255" />
</scroll_list>
<text
type="string"
@@ -333,7 +304,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
name="static2"
top_pad="5"
- width="295">
+ width="285">
Allowed Abilities
</text>
<scroll_list
@@ -345,7 +316,7 @@ things in this group. There&apos;s a broad variety of Abilities.
search_column="2"
tool_tip="For details of each allowed ability see the abilities tab"
top_pad="0"
- width="295">
+ width="285">
<scroll_list.columns
label=""
name="icon"
@@ -353,7 +324,7 @@ things in this group. There&apos;s a broad variety of Abilities.
<scroll_list.columns
label=""
name="action"
- width="275" />
+ width="265" />
</scroll_list>
</panel>
<panel
@@ -364,7 +335,7 @@ things in this group. There&apos;s a broad variety of Abilities.
top_delta="0"
top="245"
visible="false"
- width="300">
+ width="290">
<text
type="string"
height="16"
@@ -386,7 +357,7 @@ things in this group. There&apos;s a broad variety of Abilities.
max_length="295"
name="role_name"
top_pad="0"
- width="295">
+ width="290">
Employees
</line_editor>
<text
@@ -395,7 +366,7 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft"
name="static3"
top_pad="5"
- width="295">
+ width="290">
Title
</text>
<line_editor
@@ -408,7 +379,7 @@ things in this group. There&apos;s a broad variety of Abilities.
max_length="295"
name="role_title"
top_pad="0"
- width="295">
+ width="290">
(waiting)
</line_editor>
<text
@@ -442,7 +413,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
name="static4"
top_pad="5"
- width="295">
+ width="290">
Assigned Roles
</text>
<name_list
@@ -452,7 +423,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
name="role_assigned_members"
top_pad="0"
- width="295" />
+ width="290" />
<check_box
height="15"
label="Reveal members"
@@ -469,7 +440,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
name="static5"
top_pad="5"
- width="295">
+ width="290">
Allowed Abilities
</text>
<scroll_list
@@ -504,7 +475,7 @@ things in this group. There&apos;s a broad variety of Abilities.
top_delta="0"
top="245"
visible="false"
- width="300">
+ width="290">
<text
type="string"
height="16"
@@ -550,7 +521,7 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft"
name="static3"
top_pad="5"
- width="295">
+ width="290">
Members with this ability
</text>
<name_list
@@ -558,6 +529,6 @@ things in this group. There&apos;s a broad variety of Abilities.
layout="topleft"
name="action_members"
top_pad="0"
- width="295" />
+ width="290" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index 26d8304551..be56866119 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -79,7 +79,7 @@
text_color="white"
top="33"
use_ellipses="true"
- value="MESSAGE"
+ value=""
width="285"
word_wrap="true"
max_length="350" />
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index a12797d96b..ecf35523cd 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -9,7 +9,7 @@
top="21"
width="310">
<string name="min_width">
- 310
+ 192
</string>
<string name="max_width">
320
@@ -23,11 +23,11 @@
layout="topleft"
left_delta="7"
left="0"
- max_length="254"
+ max_length="512"
name="chat_box"
tool_tip="Press Enter to say, Ctrl+Enter to shout"
top="0"
- width="250" />
+ width="279" />
<output_monitor
auto_update="true"
follows="right"
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 34a185fb44..462188ee24 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -10,7 +10,7 @@
left="0"
name="notification_panel"
top="0"
- height="10"
+ height="140"
width="305">
<!-- THIS PANEL CONTROLS TOAST HEIGHT? -->
<panel
@@ -20,18 +20,18 @@
bg_alpha_color="0.3 0.3 0.3 0"
bg_opaque_color="0.3 0.3 0.3 0"
follows="left|right|top"
- height="10"
+ height="100"
label="info_panel"
layout="topleft"
left="0"
name="info_panel"
top="0"
width="305">
- <!-- <text
+ <text
border_visible="false"
follows="left|right|top|bottom"
font="SansSerif"
- height="90"
+ height="85"
layout="topleft"
left="10"
name="text_box"
@@ -39,21 +39,21 @@
text_color="white"
top="10"
visible="false"
- width="300"
+ width="285"
wrap="true"/>
<text
border_visible="false"
follows="left|right|top|bottom"
font="SansSerifBold"
- height="90"
+ height="85"
layout="topleft"
- left="45"
+ left="10"
name="caution_text_box"
text_color="1 0.82 0.46 1"
- top="5"
+ top="10"
visible="false"
- width="300"
- wrap="true"/> -->
+ width="285"
+ wrap="true"/>
<text_editor
h_pad="0"
v_pad="0"
@@ -63,6 +63,7 @@
enabled="false"
follows="left|right|top|bottom"
font="SansSerif"
+ height="85"
layout="topleft"
left="10"
mouse_opaque="false"
@@ -74,17 +75,20 @@
top="10"
visible="false"
width="285"
- wrap="true"/>
+ wrap="true"
+ parse_highlights="true"
+ allow_html="true"/>
</panel>
<panel
background_visible="false"
follows="left|right|bottom"
+ height="40"
label="control_panel"
layout="topleft"
left="0"
left_delta="-38"
name="control_panel"
- top="20">
+ top_pad="0">
</panel>
<!--
<icon
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 15fdd73bdc..a370b450e9 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -16,7 +16,7 @@ background_visible="true"
value="No people" />
<string
name="no_one_near"
- value="No-one near" />
+ value="No one near" />
<string
name="no_friends_online"
value="No friends online" />
@@ -107,7 +107,10 @@ background_visible="true"
name="add_friend_btn"
top_delta="0"
tool_tip="Add selected resident to your friends List"
- width="18" />
+ width="18">
+ <commit_callback
+ function="People.addFriend" />
+ </button>
</panel>
</panel>
<panel
@@ -325,7 +328,10 @@ background_visible="true"
name="add_friend_btn"
top_delta="0"
tool_tip="Add selected resident to your friends List"
- width="18" />
+ width="18">
+ <commit_callback
+ function="People.addFriend" />
+ </button>
</panel>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index dbe76e553b..9cfbed432a 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -22,6 +22,7 @@
left="0"
name="accordion"
top="0"
+ single_expansion="true"
width="313">
<accordion_tab
can_resize="false"
@@ -46,7 +47,7 @@
layout="topleft"
height="235"
name="tab_classifieds"
- title="Classified"
+ title="Classifieds"
visible="false">
<flat_list_view
color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index a6ca73d4b7..6bb937e3c6 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -66,11 +66,7 @@
label="Italiano (Italian) - Beta"
name="Italian"
value="it" />
- <combo_box.item
- enabled="true"
- label="Magyar (Hungarian) - Beta"
- name="Hungarian"
- value="hu" />
+
<combo_box.item
enabled="true"
label="Nederlands (Dutch) - Beta"
@@ -86,36 +82,16 @@
label="Portugués (Portuguese) - Beta"
name="Portugese"
value="pt" />
- <combo_box.item
- enabled="true"
- label="Русский (Russian) - Beta"
- name="Russian"
- value="ru" />
- <combo_box.item
- enabled="true"
- label="Türkçe (Turkish) - Beta"
- name="Turkish"
- value="tr" />
- <combo_box.item
- enabled="true"
- label="Українська (Ukrainian) - Beta"
- name="Ukrainian"
- value="uk" />
- <combo_box.item
- enabled="true"
- label="中文 (简体) (Chinese) - Beta"
- name="Chinese"
- value="zh" />
+
+
+
+
<combo_box.item
enabled="true"
label="日本語 (Japanese) - Beta"
name="(Japanese)"
value="ja" />
- <combo_box.item
- enabled="true"
- label="한국어 (Korean) - Beta"
- name="(Korean)"
- value="ko" />
+
<combo_box.item
enabled="true"
label="Test Language"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 9cf0bd26d8..5cabae5fa0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -169,12 +169,12 @@
decimal_digits="0"
follows="left|top"
height="15"
- increment="10"
- initial_value="50"
+ increment="16"
+ initial_value="512"
layout="topleft"
left_delta="150"
- max_val="1000"
- min_val="10"
+ max_val="1024"
+ min_val="32"
name="cache_size"
top_delta="-1"
width="180" />
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 3bdd7114ee..98025e28db 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
@@ -2,19 +2,18 @@
<panel
follows="left|right|top|bottom"
name="MediaControls"
- bg_alpha_color="1 1 1 0"
+ background_visible="false"
height="160"
layout="topleft"
mouse_opaque="false"
width="800">
+ <string name="control_background_image_name">Inspector_Background</string>
<panel
name="media_region"
bottom="125"
follows="left|right|top|bottom"
layout="topleft"
- left="20"
mouse_opaque="false"
- right="-20"
top="20" />
<layout_stack
follows="left|right|bottom"
@@ -33,6 +32,7 @@
name="media_progress_indicator"
height="22"
layout="topleft"
+ visible="false"
left="0"
top="0"
auto_resize="false"
@@ -64,6 +64,7 @@
top="128">
<!-- outer layout_panels center the inner one -->
<layout_panel
+ name="left_bookend"
width="0"
layout="topleft"
user_resize="false" />
@@ -76,13 +77,18 @@
width="22"
top="4">
<button
+ image_overlay="Arrow_Left_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
auto_resize="false"
height="22"
- image_selected="media_btn_back.png"
- image_unselected="media_btn_back.png"
layout="topleft"
tool_tip="Step back"
width="22"
+ left="0"
top_delta="4">
<button.commit_callback
function="MediaCtrl.Back" />
@@ -94,37 +100,25 @@
user_resize="false"
layout="topleft"
top="10"
- min_width="17"
- width="17">
+ min_width="22"
+ width="22">
<button
+ image_overlay="Arrow_Right_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
height="22"
- image_selected="media_btn_forward.png"
- image_unselected="media_btn_forward.png"
layout="topleft"
tool_tip="Step forward"
top_delta="0"
- min_width="17"
- width="17">
+ min_width="22"
+ width="22">
<button.commit_callback
function="MediaCtrl.Forward" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
name="home"
auto_resize="false"
@@ -134,11 +128,15 @@
min_width="22"
width="22">
<button
- height="22"
- image_selected="media_btn_home.png"
- image_unselected="media_btn_home.png"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_overlay="Home_Off"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip="Home page"
+ height="22"
min_width="22"
width="22">
<button.commit_callback
@@ -153,10 +151,15 @@
top="2"
min_width="22"
width="22">
+ <!-- The stop button here is temporary artwork -->
<button
+ image_overlay="media_btn_stoploading.png"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
height="22"
- image_selected="button_anim_stop.tga"
- image_unselected="button_anim_stop.tga"
layout="topleft"
tool_tip="Stop media"
min_width="22"
@@ -165,22 +168,6 @@
function="MediaCtrl.Stop" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
name="reload"
auto_resize="false"
@@ -191,8 +178,12 @@
width="22">
<button
height="22"
- image_selected="media_btn_reload.png"
- image_unselected="media_btn_reload.png"
+ image_overlay="Refresh_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip="Reload"
min_width="22"
@@ -211,8 +202,12 @@
width="22">
<button
height="22"
- image_selected="media_btn_stoploading.png"
- image_unselected="media_btn_stoploading.png"
+ image_overlay="StopReload_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip = "Stop loading"
min_width="22"
@@ -230,11 +225,15 @@
min_width="22"
width="22">
<button
- height="22"
- image_selected="button_anim_play.tga"
- image_unselected="button_anim_play.tga"
+ image_overlay="Play_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip = "Play media"
+ height="22"
min_width="22"
width="22">
<button.commit_callback
@@ -250,10 +249,14 @@
min_width="22"
width="22">
<button
- height="22"
- image_selected="button_anim_pause.tga"
- image_unselected="button_anim_pause.tga"
+ image_overlay="Pause_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
+ height="22"
tool_tip = "Pause media">
<button.commit_callback
function="MediaCtrl.Pause" />
@@ -264,7 +267,7 @@
name="media_address"
auto_resize="true"
user_resize="false"
- height="22"
+ height="24"
follows="left|right|bottom"
layout="topleft"
width="190"
@@ -294,31 +297,43 @@ function="MediaCtrl.CommitURL" />
function="MediaCtrl.CommitURL"/>
</line_editor>
<layout_stack
+ name="media_address_url_icons"
animate="false"
follows="right"
- width="32"
- min_width="32"
- height="16"
- top="3"
- orientation="horizontal"
- left_pad="-38">
- <icon
- name="media_whitelist_flag"
- follows="top|right"
- height="16"
- image_name="smicon_warn.tga"
+ height="20"
+ width="38"
+ right="-2"
+ top="-1"
+ orientation="horizontal">
+ <layout_panel
layout="topleft"
- tool_tip="White List enabled"
- min_width="16"
- width="16" />
- <icon
- name="media_secure_lock_flag"
- height="16"
- image_name="inv_item_eyes.tga"
+ width="16"
+ auto_resize="false"
+ user_resize="false">
+ <icon
+ name="media_whitelist_flag"
+ follows="top|right"
+ height="16"
+ image_name="Flag"
+ layout="topleft"
+ tool_tip="White List enabled"
+ min_width="16"
+ width="16" />
+ </layout_panel>
+ <layout_panel
layout="topleft"
- tool_tip="Secured Browsing"
- min_width="16"
- width="16" />
+ width="16"
+ auto_resize="false"
+ user_resize="false">
+ <icon
+ name="media_secure_lock_flag"
+ height="16"
+ image_name="Lock2"
+ layout="topleft"
+ tool_tip="Secured Browsing"
+ min_width="16"
+ width="16" />
+ </layout_panel>
</layout_stack>
</layout_panel>
<layout_panel
@@ -337,6 +352,7 @@ function="MediaCtrl.CommitURL" />
initial_value="0.5"
layout="topleft"
tool_tip="Movie play progress"
+ top="8"
min_width="100"
width="200">
<slider_bar.commit_callback
@@ -348,43 +364,55 @@ function="MediaCtrl.CommitURL" />
auto_resize="false"
user_resize="false"
layout="topleft"
- height="24"
- min_width="24"
- width="24">
+ height="22"
+ min_width="22"
+ width="22">
+ <!-- Note: this isn't quite right either...the mute button is not the -->
+ <!-- same as the others because it can't have the "image_overlay" be -->
+ <!-- two different images. -->
<button
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ hover_glow_amount="0.15"
name="media_volume_button"
height="22"
- image_selected="icn_speaker-muted_dark.tga"
- image_unselected="icn_speaker_dark.tga"
is_toggle="true"
layout="topleft"
scale_image="false"
tool_tip="Mute This Media"
- top_delta="22"
- min_width="24"
- width="24" >
+ top_delta="18"
+ min_width="22"
+ width="22" >
<button.commit_callback
function="MediaCtrl.ToggleMute" />
</button>
</layout_panel>
+ <!-- We don't have a design yet for "volume", so this is a temporary -->
+ <!-- solution. See DEV-42827. -->
<layout_panel
name="volume_up"
auto_resize="false"
user_resize="false"
layout="topleft"
- min_width="20"
+ min_width="14"
height="14"
- width="20">
+ width="14">
<button
- top="-3"
+ image_overlay="media_btn_scrollup.png"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="-5"
height="14"
- image_selected="media_btn_scrollup.png"
- image_unselected="media_btn_scrollup.png"
layout="topleft"
tool_tip="Volume up"
scale_image="true"
- min_width="20"
- width="20" >
+ min_width="14"
+ width="14" >
<button.commit_callback
function="MediaCtrl.CommitVolumeUp" />
</button>
@@ -394,26 +422,32 @@ function="MediaCtrl.CommitURL" />
auto_resize="false"
user_resize="false"
layout="topleft"
- min_width="20"
+ min_width="14"
height="14"
- width="20">
+ width="14">
<button
- top="-5"
- height="14"
- image_selected="media_btn_scrolldown.png"
- image_unselected="media_btn_scrolldown.png"
+ image_overlay="media_btn_scrolldown.png"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
layout="topleft"
tool_tip="Volume down"
scale_image="true"
- min_width="20"
- width="20">
+ top="-5"
+ height="14"
+ min_width="14"
+ width="14">
<button.commit_callback
function="MediaCtrl.CommitVolumeDown" />
</button>
</layout_panel>
<!-- Scroll pad -->
-<!--
-disabled
+ <!-- This was removed from the design, but is still here because it is -->
+ <!-- complex, and recreating it would be hard. In case the design -->
+ <!-- changes, here it lies: -->
+ <!--
<layout_panel
name="media_panel_scroll"
auto_resize="false"
@@ -479,8 +513,21 @@ disabled
min_width="8"
width="8" />
</layout_panel>
-disabled
--->
+ -->
+ <panel
+ height="28"
+ layout="topleft"
+ auto_resize="false"
+ min_width="3"
+ width="3">
+ <icon
+ height="26"
+ image_name="media_panel_divider.png"
+ layout="topleft"
+ top="0"
+ min_width="3"
+ width="3" />
+ </panel>
<layout_panel
name="zoom_frame"
auto_resize="false"
@@ -490,9 +537,13 @@ disabled
min_width="22"
width="22">
<button
+ image_overlay="Zoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
height="22"
- image_selected="media_btn_optimalzoom.png"
- image_unselected="media_btn_optimalzoom.png"
layout="topleft"
tool_tip="Zoom into media"
min_width="22"
@@ -508,10 +559,15 @@ disabled
layout="topleft"
min_width="21"
width="21" >
+ <!-- There is no "Zoom out" icon, so we use this temporarily -->
<button
+ image_overlay="ForwardArrow_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
height="22"
- image_selected="media_btn_done.png"
- image_unselected="media_btn_done.png"
layout="topleft"
tool_tip ="Zoom Back"
top_delta="-4"
@@ -520,22 +576,6 @@ disabled
function="MediaCtrl.Close" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
<layout_panel
name="new_window"
auto_resize="false"
@@ -544,35 +584,25 @@ disabled
min_width="22"
width="22">
<button
+ image_overlay="ExternalBrowser_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
height="22"
- image_selected="media_btn_newwindow.png"
- image_unselected="media_btn_newwindow.png"
layout="topleft"
tool_tip = "Open URL in browser"
- top_delta="-3"
+ top_delta="-4"
min_width="24"
width="24" >
<button.commit_callback
function="MediaCtrl.Open" />
</button>
</layout_panel>
-<!--
- <panel
- height="22"
- layout="topleft"
- auto_resize="false"
- min_width="3"
- width="3">
- <icon
- height="22"
- image_name="media_panel_divider.png"
- layout="topleft"
- top="0"
- min_width="3"
- width="3" />
- </panel>
--->
+ <!-- bookend panel -->
<layout_panel
+ name="right_bookend"
width="0"
layout="topleft"
user_resize="false" />
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 0f5e96416d..5110b6b2ef 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -283,7 +283,7 @@
mouse_opaque="false"
name="add_friend"
top="5"
- width="75" />
+ width="76" />
<button
follows="bottom|left"
height="19"
@@ -292,7 +292,7 @@
name="im"
top="5"
left_pad="5"
- width="45" />
+ width="31" />
<button
follows="bottom|left"
height="19"
@@ -301,7 +301,7 @@
name="call"
left_pad="5"
top="5"
- width="45" />
+ width="40" />
<button
enabled="false"
follows="bottom|left"
@@ -311,7 +311,7 @@
name="show_on_map_btn"
top="5"
left_pad="5"
- width="45" />
+ width="42" />
<button
follows="bottom|left"
height="19"
@@ -320,7 +320,17 @@
name="teleport"
left_pad="5"
top="5"
- width="80" />
+ width="64" />
+ <button
+ follows="bottom|right"
+ font="SansSerifSmall"
+ height="19"
+ label="▼"
+ layout="topleft"
+ name="overflow_btn"
+ right="-1"
+ top="5"
+ width="21" />
</panel>
<panel
follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index a9874f4553..a419a02d75 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -94,7 +94,7 @@
<sidetray_tab
name="sidebar_me"
help_topic="sidebar_me"
- tab_title="Me"
+ tab_title="My Profile"
description="Edit your public profile and Picks."
image="TabIcon_Me_Off"
image_selected="TabIcon_Me_Selected"
@@ -112,7 +112,7 @@
<sidetray_tab
name="sidebar_appearance"
help_topic="sidebar_appearance"
- tab_title="Appearance"
+ tab_title="My Appearance"
description="Change your appearance and current look."
image="TabIcon_Appearance_Off"
image_selected="TabIcon_Appearance_Selected"
@@ -131,7 +131,7 @@
<sidetray_tab
name="sidebar_inventory"
help_topic="sidebar_inventory"
- tab_title="Inventory"
+ tab_title="My Inventory"
description="Browse your inventory."
image="TabIcon_Things_Off"
image_selected="TabIcon_Things_Selected"
diff --git a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
index 9636e32187..566fc95230 100644
--- a/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/en/panel_sidetray_home_tab.xml
@@ -227,7 +227,7 @@
right="-10"
top="10"
width="20"
- image_name="TabIcon_Inventory_Selected"/>
+ image_name="TabIcon_Things_Selected"/>
<text
follows="all"
height="90"
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 1171a8f0b5..8fc78c6701 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -46,14 +46,24 @@
font="SansSerifSmall"
image_selected="BuyArrow_Over"
image_unselected="BuyArrow_Off"
- image_pressed="BuyArrow_Press"
+ image_pressed="BuyArrow_Press"
height="16"
- left="-220"
+ left="-245"
name="buycurrency"
pad_right="22px"
tool_tip="My Balance: Click to buy more L$"
top="1"
width="117" />
+ <button
+ follows="right|bottom"
+ height="16"
+ image_selected="parcel_drk_VoiceNo"
+ image_unselected="parcel_drk_Voice"
+ is_toggle="true"
+ left_pad="15"
+ top="1"
+ name="volume_btn"
+ width="16" />
<text
type="string"
length="1"
@@ -61,9 +71,9 @@
follows="right|bottom"
halign="right"
height="16"
- top="3"
+ top="5"
layout="topleft"
- left_pad="15"
+ left_pad="7"
name="TimeText"
text_color="TimeTextColor"
tool_tip="Current time (Pacific)"
diff --git a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
index 7722583ce2..63e60aab78 100644
--- a/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_sys_well_item.xml
@@ -9,7 +9,10 @@
width="300"
height="35"
layout="topleft"
- follows="left|right">
+ follows="left|right"
+ background_opaque="false"
+ background_visible="true"
+ bg_alpha_color="0.0 0.0 0.0 0.0" >
<text
top="2"
left="10"
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index 7f7777586c..f16329f8d7 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- All our XML is utf-8 encoded. -->
-<!-- All this does is establish the position of the "close" button on the toast. -->
+<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
<floater
legacy_header_height="18"
@@ -9,6 +9,7 @@
title=""
visible="false"
layout="topleft"
+ height="40"
width="305"
left="0"
top="0"
@@ -26,36 +27,21 @@
drop_shadow_visible = "false"
border = "false"
>
-
- <!--
+ <!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
<text
visible="false"
follows="left|top|right|bottom"
font="SansSerifBold"
- height="40"
+ height="20"
layout="topleft"
- left="60"
+ left="20"
name="toast_text"
word_wrap="true"
text_color="white"
- top="20"
- width="290">
+ top="5"
+ width="260">
Toast text;
</text>
- <icon
- top="20"
- left="10"
- width="32"
- height="32"
- follows="top|left"
- layout="topleft"
- visible="false"
- color="1 1 1 1"
- enabled="true"
- image_name="notify_tip_icon.tga"
- mouse_opaque="true"
- name="icon"
- />-->
<button
layout="topleft"
top="-6"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index b0a406a277..761c17cfd2 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2850,7 +2850,6 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="IM_to_label">To</string>
<string name="IM_moderator_label">(Moderator)</string>
-
<string name="ringing-im">
Joining Voice Chat...
</string>
@@ -2864,7 +2863,7 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Connecting...
</string>
<string name="conference-title">
- Friends Conference
+ Ad-hoc Conference
</string>
<string name="inventory_item_offered-im">
Inventory item offered
diff --git a/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
new file mode 100644
index 0000000000..a35e2c3663
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/avatar_icon.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+
+<avatar_icon default_icon_name="Generic_Person_Large">
+</avatar_icon>
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index bc1ca339a2..706c89f5ed 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -4,6 +4,8 @@
thumb_center_color="SliderThumbCenterColor"
thumb_image="SliderThumb_Off"
thumb_image_pressed="SliderThumb_Press"
- thumb_image_disabled="SliderThumb_Disabled"
- track_image="SliderTrack_Horiz"
- track_highlight_image="SliderTrack_Horiz" />
+ thumb_image_disabled="SliderThumb_Disabled"
+ track_image_horizontal="SliderTrack_Horiz"
+ track_image_vertical="SliderTrack_Vert"
+ track_highlight_horizontal_image="SliderTrack_Horiz"
+ track_highlight_vertical_image="SliderTrack_Vert" />
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index d31a81e128..7b28a3b72c 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -76,6 +76,7 @@ LLControlGroup::LLControlGroup(const std::string& name) :
LLControlGroup::~LLControlGroup() {}
void LLControlGroup::setBOOL(const std::string& name, BOOL val) {}
BOOL LLControlGroup::getBOOL(const std::string& name) { return FALSE; }
+F32 LLControlGroup::getF32(const std::string& name) { return 0.0f; }
U32 LLControlGroup::saveToFile(const std::string& filename, BOOL nondefault_only) { return 1; }
void LLControlGroup::setString(const std::string& name, const std::string& val) {}
std::string LLControlGroup::getString(const std::string& name) { return "test_string"; }