summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt261
-rw-r--r--indra/newview/app_settings/settings.xml61
-rw-r--r--indra/newview/linux_tools/client-readme-voice.txt51
-rw-r--r--indra/newview/linux_tools/client-readme.txt5
-rw-r--r--indra/newview/llagentwearables.cpp6
-rw-r--r--indra/newview/llappearancemgr.cpp55
-rw-r--r--indra/newview/llappviewer.cpp2
-rw-r--r--indra/newview/llavataractions.cpp16
-rw-r--r--indra/newview/llavatarlist.cpp15
-rw-r--r--indra/newview/llavatarlist.h12
-rw-r--r--indra/newview/llbottomtray.cpp67
-rw-r--r--indra/newview/llbottomtray.h14
-rw-r--r--indra/newview/llcallfloater.cpp36
-rw-r--r--indra/newview/llcallfloater.h8
-rw-r--r--indra/newview/llchathistory.cpp37
-rw-r--r--indra/newview/llchiclet.cpp242
-rw-r--r--indra/newview/llchiclet.h100
-rw-r--r--indra/newview/llexpandabletextbox.cpp7
-rw-r--r--indra/newview/llexpandabletextbox.h1
-rw-r--r--indra/newview/llfavoritesbar.cpp345
-rw-r--r--indra/newview/llfavoritesbar.h8
-rw-r--r--indra/newview/llfloateranimpreview.cpp47
-rw-r--r--indra/newview/llfloaterland.cpp2
-rw-r--r--indra/newview/llfloatermediasettings.cpp59
-rw-r--r--indra/newview/llfloatermediasettings.h2
-rw-r--r--indra/newview/llfloateropenobject.cpp1
-rw-r--r--indra/newview/llfloaterpreference.cpp16
-rw-r--r--indra/newview/llfloaterpreference.h1
-rw-r--r--indra/newview/llfloatertelehub.cpp11
-rw-r--r--indra/newview/llfloatertools.cpp17
-rw-r--r--indra/newview/llfloatertools.h4
-rw-r--r--indra/newview/llfloaterwhitelistentry.cpp1
-rw-r--r--indra/newview/llfolderview.cpp34
-rw-r--r--indra/newview/llfolderview.h1
-rw-r--r--indra/newview/llfolderviewitem.cpp23
-rw-r--r--indra/newview/llfolderviewitem.h3
-rw-r--r--indra/newview/llimfloater.cpp34
-rw-r--r--indra/newview/llimview.cpp315
-rw-r--r--indra/newview/llimview.h29
-rw-r--r--indra/newview/llinspectavatar.cpp52
-rw-r--r--indra/newview/llinventorybridge.cpp298
-rw-r--r--indra/newview/llinventorybridge.h3
-rw-r--r--indra/newview/llinventoryfilter.cpp4
-rw-r--r--indra/newview/llinventoryfilter.h4
-rw-r--r--indra/newview/llinventoryfunctions.cpp30
-rw-r--r--indra/newview/llinventoryfunctions.h19
-rw-r--r--indra/newview/llinventoryobserver.h1
-rw-r--r--indra/newview/llinventorypanel.cpp24
-rw-r--r--indra/newview/lllogininstance.cpp2
-rw-r--r--indra/newview/llmediactrl.cpp25
-rw-r--r--indra/newview/llmediactrl.h4
-rwxr-xr-xindra/newview/llmediadataclient.cpp10
-rw-r--r--indra/newview/llnavigationbar.cpp9
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp6
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp2
-rw-r--r--indra/newview/llpanellandmarks.cpp15
-rw-r--r--indra/newview/llpanellogin.cpp9
-rw-r--r--indra/newview/llpanelmaininventory.cpp9
-rw-r--r--indra/newview/llpanelmaininventory.h1
-rw-r--r--indra/newview/llpanelmediasettingssecurity.cpp5
-rw-r--r--indra/newview/llpanelmediasettingssecurity.h6
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp86
-rw-r--r--indra/newview/llpaneloutfitsinventory.h25
-rw-r--r--indra/newview/llpanelpicks.cpp106
-rw-r--r--indra/newview/llpanelpicks.h12
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp17
-rw-r--r--indra/newview/llpanelprimmediacontrols.h3
-rw-r--r--indra/newview/llpanelprofile.cpp28
-rw-r--r--indra/newview/llparticipantlist.cpp127
-rw-r--r--indra/newview/llparticipantlist.h6
-rw-r--r--indra/newview/llpreview.cpp7
-rw-r--r--indra/newview/llpreviewgesture.cpp4
-rw-r--r--indra/newview/llselectmgr.cpp20
-rw-r--r--indra/newview/llselectmgr.h1
-rw-r--r--indra/newview/llsidepanelappearance.cpp14
-rw-r--r--indra/newview/llsidepanelappearance.h2
-rw-r--r--indra/newview/llsidepanelinventorysubpanel.cpp4
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp14
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp246
-rw-r--r--indra/newview/llsidepaneltaskinfo.h36
-rw-r--r--indra/newview/llspeakbutton.cpp3
-rw-r--r--indra/newview/llspeakers.cpp138
-rw-r--r--indra/newview/llspeakers.h35
-rw-r--r--indra/newview/llstartup.cpp14
-rw-r--r--indra/newview/llsyswellwindow.cpp159
-rw-r--r--indra/newview/llsyswellwindow.h15
-rw-r--r--indra/newview/lltexturefetch.cpp30
-rw-r--r--indra/newview/lltextureview.cpp5
-rw-r--r--indra/newview/llviewercontrol.cpp23
-rw-r--r--indra/newview/llviewermedia.cpp77
-rw-r--r--indra/newview/llviewermedia.h2
-rw-r--r--indra/newview/llviewermediafocus.cpp12
-rw-r--r--indra/newview/llviewermenu.cpp187
-rw-r--r--indra/newview/llviewermenufile.cpp12
-rw-r--r--indra/newview/llviewermessage.cpp26
-rw-r--r--indra/newview/llviewertexturelist.cpp2
-rw-r--r--indra/newview/llviewerwindow.cpp2
-rw-r--r--indra/newview/llvoavatarself.cpp37
-rw-r--r--indra/newview/llvoavatarself.h2
-rw-r--r--indra/newview/llvoicechannel.cpp10
-rw-r--r--indra/newview/llvoiceclient.cpp16
-rw-r--r--indra/newview/llvovolume.cpp35
-rw-r--r--indra/newview/llwearable.cpp2
-rw-r--r--indra/newview/llwearable.h2
-rw-r--r--indra/newview/llwearablelist.cpp4
-rw-r--r--indra/newview/skins/default/colors.xml15
-rw-r--r--indra/newview/skins/default/textures/textures.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_aaa.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_textures.xml46
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml519
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml108
-rw-r--r--indra/newview/skins/default/xui/en/floater_env_settings.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml23
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml18
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml26
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml71
-rw-r--r--indra/newview/skins/default/xui/en/floater_settings_debug.xml43
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml167
-rw-r--r--indra/newview/skins/default/xui/en/floater_telehub.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_widgets.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml69
-rw-r--r--indra/newview/skins/default/xui/en/floater_water.xml1
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml4
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml23
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml11
-rw-r--r--indra/newview/skins/default/xui/en/menu_im_well_button.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_land.xml5
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml20
-rw-r--r--indra/newview/skins/default/xui/en/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_notification_well_button.xml16
-rw-r--r--indra/newview/skins/default/xui/en/menu_participant_list.xml6
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml199
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml25
-rw-r--r--indra/newview/skins/default/xui/en/panel_activeim_row.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml12
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_gloves.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pants.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shirt.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shoes.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skirt.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_socks.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_underpants.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_undershirt.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_security.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml167
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml14
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml17
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml206
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml18
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history_item.xml1
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml78
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml262
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml20
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/color_swatch.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml12
-rw-r--r--indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text.xml1
-rwxr-xr-xindra/newview/viewer_manifest.py208
186 files changed, 4009 insertions, 2841 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 5c792fd0b4..dbd79f022a 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1354,7 +1354,6 @@ add_executable(${VIEWER_BINARY_NAME}
MACOSX_BUNDLE
${viewer_SOURCE_FILES}
)
-check_message_template(${VIEWER_BINARY_NAME})
if (LLKDU_LIBRARY)
add_dependencies(${VIEWER_BINARY_NAME} ${LLKDU_LIBRARY})
@@ -1391,45 +1390,84 @@ if (WINDOWS)
)
endif(USE_PRECOMPILED_HEADERS)
- # sets the 'working directory' for debugging from visual studio.
- if (NOT UNATTENDED)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
- ARGS
- --solution
- ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
- --workingdir
- ${VIEWER_BINARY_NAME}
- "${CMAKE_CURRENT_SOURCE_DIR}"
- COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
- )
- endif (NOT UNATTENDED)
-
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg
- COMMENT "Copying message_template.msg to the runtime folder."
- )
-
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} PRE_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml
- COMMENT "Copying message.xml to the runtime folder."
+ # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency
+ # here.
+ # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action
+ # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.
+ # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
+ # and have the build deps get tracked *please* tell me about it.
+ set(COPY_INPUT_DEPENDECIES
+ # The following commented dependencies are determined at variably at build time. Can't do this here.
+ #llkdu.dll => llkdu.dll
+ #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
+ ${CMAKE_SOURCE_DIR}/../etc/message.xml
+ ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/msvcr80.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/msvcp80.dll
+ ${SHARED_LIB_STAGING_DIR}/Release/Microsoft.VC80.CRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcr80.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/msvcp80.dll
+ ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Microsoft.VC80.CRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/Debug/msvcr80d.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/msvcp80d.dll
+ ${SHARED_LIB_STAGING_DIR}/Debug/Microsoft.VC80.DebugCRT.manifest
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll
+ ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll
+ ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
+ ${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll
+ ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll
+ ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtnetwork4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtopengl4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtwebkit4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/qtxmlpatterns4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qgif4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qico4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qjpeg4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qmng4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qsvg4.dll
+ ${ARCH_PREBUILT_DIRS_RELEASE}/imageformats/qtiff4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtcored4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtguid4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtnetworkd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtopengld4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtwebkitd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/qtxmlpatternsd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qgifd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qicod4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qjpegd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qmngd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qsvgd4.dll
+ ${ARCH_PREBUILT_DIRS_DEBUG}/imageformats/qtiffd4.dll
+ SLPlugin
+ media_plugin_quicktime
+ media_plugin_webkit
+ windows-crash-logger
+ windows-updater
)
-
+
add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
COMMAND ${PYTHON_EXECUTABLE}
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
@@ -1440,11 +1478,17 @@ if (WINDOWS)
--dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
--grid=${GRID}
--source=${CMAKE_CURRENT_SOURCE_DIR}
- DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ stage_third_party_libs
+ ${COPY_INPUT_DEPENDECIES}
COMMENT "Performing viewer_manifest copy"
)
+
+ add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat)
- add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon)
+ add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest)
if(LLKDU_LIBRARY)
# kdu may not exist!
@@ -1463,6 +1507,21 @@ if (WINDOWS)
windows-crash-logger
)
+ # sets the 'working directory' for debugging from visual studio.
+ if (NOT UNATTENDED)
+ add_custom_command(
+ TARGET ${VIEWER_BINARY_NAME} POST_BUILD
+ COMMAND ${CMAKE_SOURCE_DIR}/tools/vstool/vstool.exe
+ ARGS
+ --solution
+ ${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}.sln
+ --workingdir
+ ${VIEWER_BINARY_NAME}
+ "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMENT "Setting the ${VIEWER_BINARY_NAME} working directory for debugging."
+ )
+ endif (NOT UNATTENDED)
+
if (PACKAGE)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2
@@ -1477,7 +1536,7 @@ if (WINDOWS)
${EVENT_HOST_SCRIPTS}
${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py
)
-
+
add_custom_command(
OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat
COMMAND ${PYTHON_EXECUTABLE}
@@ -1500,6 +1559,8 @@ if (WINDOWS)
# sorted out on the parabuild cluster...
#${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/event_host.tar.bz2)
+ check_message_template(package)
+
endif (PACKAGE)
endif (WINDOWS)
@@ -1581,6 +1642,7 @@ if (LINUX)
add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
add_dependencies(package linux-crash-logger-strip-target)
add_dependencies(package linux-updater-strip-target)
+ check_message_template(package)
endif (NOT INSTALL)
endif (LINUX)
@@ -1619,6 +1681,7 @@ if (DARWIN)
if (PACKAGE)
add_custom_target(package ALL DEPENDS ${VIEWER_BINARY_NAME})
+ check_message_template(package)
add_dependencies(package mac-updater mac-crash-logger)
add_custom_command(
@@ -1722,119 +1785,3 @@ if (LL_TESTS)
endif (LL_TESTS)
-# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py
-if (WINDOWS)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- make_directory
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
- COMMENT "Creating llplugin dir."
- )
-
- get_target_property(BUILT_SLPLUGIN SLPlugin LOCATION)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${BUILT_SLPLUGIN}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}
- COMMENT "Copying SLPlugin executable to the runtime folder."
- )
-
- get_target_property(BUILT_WEBKIT_PLUGIN media_plugin_webkit LOCATION)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${BUILT_WEBKIT_PLUGIN}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
- COMMENT "Copying WebKit Plugin to the runtime folder."
- )
-
- get_target_property(BUILT_QUICKTIME_PLUGIN media_plugin_quicktime LOCATION)
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_if_different
- ${BUILT_QUICKTIME_PLUGIN}
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin
- COMMENT "Copying Quicktime Plugin to the runtime folder."
- )
-
- #*******************************
- # Copy media plugin support dlls
- # Debug config runtime files required for the plugins
- set(plugins_debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/debug")
- set(plugins_debug_files
- libeay32.dll
- qtcored4.dll
- qtguid4.dll
- qtnetworkd4.dll
- qtopengld4.dll
- qtwebkitd4.dll
- ssleay32.dll
- )
- copy_if_different(
- ${plugins_debug_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Debug/llplugin"
- out_targets
- ${plugins_debug_files}
- )
- set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
- # Release & ReleaseDebInfo config runtime files required for the plugins
- set(plugins_release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-win32/lib/release")
- set(plugins_release_files
- libeay32.dll
- qtcore4.dll
- qtgui4.dll
- qtnetwork4.dll
- qtopengl4.dll
- qtwebkit4.dll
- ssleay32.dll
- )
- copy_if_different(
- ${plugins_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/Release/llplugin"
- out_targets
- ${plugins_release_files}
- )
- set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
- copy_if_different(
- ${plugins_release_src_dir}
- "${CMAKE_CURRENT_BINARY_DIR}/RelWithDebInfo/llplugin"
- out_targets
- ${plugins_release_files}
- )
- set(media_plugin_targets ${media_plugin_targets} ${out_targets})
-
- add_custom_target(copy_media_plugin_libs ALL
- DEPENDS
- ${media_plugin_targets}
- )
-
- add_custom_command(
- TARGET ${VIEWER_BINARY_NAME} POST_BUILD
- COMMAND ${CMAKE_COMMAND}
- ARGS
- -E
- copy_directory
- ${CMAKE_BINARY_DIR}/test_apps/llplugintest/${CMAKE_CFG_INTDIR}/imageformats
- ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/imageformats
- COMMENT "Copying llpluging imageformat libs."
- )
-
- add_dependencies(${VIEWER_BINARY_NAME} llmediaplugintest copy_media_plugin_libs)
-
-endif (WINDOWS)
-
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7b0193ab5..d94d8bf341 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -8,7 +8,7 @@
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>F32</string>
+ <string>S32</string>
<key>Value</key>
<real>300.0</real>
</map>
@@ -45,17 +45,6 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>AllowIdleAFK</key>
- <map>
- <key>Comment</key>
- <string>Automatically set AFK (away from keyboard) mode when idle</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>AllowMultipleViewers</key>
<map>
<key>Comment</key>
@@ -5471,6 +5460,17 @@
<key>Value</key>
<integer>13</integer>
</map>
+ <key>PrimMediaMasterEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not Media on a Prim is enabled.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>PrimMediaControlsUseHoverControlSet</key>
<map>
<key>Comment</key>
@@ -5834,17 +5834,6 @@
<key>Value</key>
<integer>35</integer>
</map>
- <key>RenderAvatarInvisible</key>
- <map>
- <key>Comment</key>
- <string>Set your avatar as Invisible</string>
- <key>Persist</key>
- <integer>0</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
<key>RenderAvatarVP</key>
<map>
<key>Comment</key>
@@ -7792,6 +7781,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowDebugAppearanceEditor</key>
+ <map>
+ <key>Comment</key>
+ <string>Show debugging appearance editor</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>ShowEmptyFoldersWhenSearching</key>
<map>
<key>Comment</key>
@@ -7890,7 +7890,18 @@
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
- </map>
+ </map>
+ <key>ShowObjectRenderingCost</key>
+ <map>
+ <key>Comment</key>
+ <string>Show the object rendering cost in build tools</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>ShowNavbarFavoritesPanel</key>
<map>
<key>Comment</key>
@@ -9286,7 +9297,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>4</integer>
+ <integer>5</integer>
</map>
<key>UIMaxComboWidth</key>
<map>
diff --git a/indra/newview/linux_tools/client-readme-voice.txt b/indra/newview/linux_tools/client-readme-voice.txt
index 23a42f484b..bfefdf3471 100644
--- a/indra/newview/linux_tools/client-readme-voice.txt
+++ b/indra/newview/linux_tools/client-readme-voice.txt
@@ -4,36 +4,31 @@ Second Life - Linux Voice Support README
WHAT IS IT?
-=-=-=-=-=-
-Linux Voice Support is a new feature in testing which allows users
-of the Linux Second Life client to participate in voice-chat with other
-residents and groups inside Second Life, with an appropriate
-headset/microphone.
-
-Linux Voice Support is currently EXPERIMENTAL and is known to still
-have some compatibility issues.
+Linux Voice Support is a feature in testing which allows users of the Linux
+Second Life client to participate in voice-chat with other residents and
+groups inside Second Life, with an appropriate headset/microphone.
REQUIREMENTS
-=-=-=-=-=-=
* A headset/microphone supported by your chosen version of Linux
-* The ALSA sound system (you probably already have this -
- i.e. the alsa-base and alsa-utils packages on Ubuntu)
+* At this time, the PulseAudio audio system is recommended; this software
+ is already part of most modern (2009+) Linux desktop systems. Alternatively,
+ the ALSA audio system may be used on systems installed from around
+ 2007 onwards (again this is likely already installed on your system).
+
+TESTING YOUR SETTINGS
+-=-=-=-=-=-=-=-=-=-=-
-Success with Linux Voice support has been reported on the following
-systems:
-* Ubuntu 6.06 (Dapper) with Intel ICH5/CMI9761A+ audio chipset
-* Ubuntu 6.06 (Dapper) with SigmaTel STAC2997 audio chipset
-* Ubuntu 6.06 (Dapper) with Creative EMU10K1 audio chipset
-* Ubuntu 7.04 (Feisty) with USB Plantronics headset
-* Ubuntu 7.04 (Feisty) with Intel HDA audio chipset
-* Fedora Core 6 with (unknown) audio chipset
-* Ubuntu 8.04 (Hardy) with (unknown) audio chipset
+* The Second Life region 'Voice Echo Canyon' is a great place for testing
+your hardware settings and quality - it will 'echo' your voice back to you
+when you speak.
KNOWN PROBLEMS
-=-=-=-=-=-=-=
-* The 'Input Level' meter in the Voice Chat Device Settings dialog
- does not respond to audio input.
+* Compatibility with old ALSA-based audio systems (such as Ubuntu Dapper
+ from 2006) is poor.
TROUBLESHOOTING
-=-=-=-=-=-=-=-
@@ -41,12 +36,11 @@ TROUBLESHOOTING
PROBLEM 1: I don't see a white dot over the head of my avatar or other
Voice-using avatars.
SOLUTION:
-a. Ensure that 'Enable voice chat' is enabled in the Voice Chat
- preferences window and that you are in a voice-enabled area (you
- will see a blue headphone icon in the SL menu-bar).
+a. Ensure that 'Enable voice' is enabled in the 'Sound' section of the
+ Preferences window, and that you are in a voice-enabled area.
b. If the above does not help, exit Second Life and ensure that any
remaining 'SLVoice' processes (as reported by 'ps', 'top' or similar)
- are killed.
+ are killed before restarting.
PROBLEM 2: I have a white dot over my head but I never see (or hear!) anyone
except myself listed in the Active Speakers dialog when I'm sure that other
@@ -65,12 +59,13 @@ c. Update to the latest version of ALSA manually. For a guide, see the
PROBLEM 3: I can hear other people, but they cannot hear me.
SOLUTION:
-a. Ensure that you have the 'Talk' button activated while you are trying to
- speak.
+a. Ensure that you have the 'Speak' button (at the bottom of the Second Life
+ window) activated while you are trying to speak.
b. Ensure that your microphone jack is inserted into the correct socket of your
sound card, where appropriate.
-c. Use your system mixer-setting program or the 'alsamixer' program to ensure
- that microphone input is set as the active input source and is not muted.
+c. Use your system mixer-setting program (such as the PulseAudio 'volume
+ control' applet or the ALSA 'alsamixer' program) to ensure that microphone
+ input is set as the active input source and is not muted.
d. Verify that audio input works in other applications, i.e. Audacity
PROBLEM 4: Other people just hear bursts of loud noise when I speak.
diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt
index 07a8f951ee..92d321d8c0 100644
--- a/indra/newview/linux_tools/client-readme.txt
+++ b/indra/newview/linux_tools/client-readme.txt
@@ -55,10 +55,13 @@ Minimum requirements:
is required. If you are running a 64-bit Linux distribution then
you will need its 32-bit compatibility environment installed, but
this configuration is not currently supported.
+ * PulseAudio or ALSA Linux system sound software. A recent PulseAudio
+ is the recommended configuration; see README-linux-voice.txt for more
+ information.
* Video/Graphics Card:
o nVidia GeForce 2, GeForce 4mx, or better (recommend one of the
following: 6700, 6800, 7600, 7800, 7900, 8400, 8500, 8600,
- 8800, Go 7400, Go 7600, Go 7800, Go 7900)
+ 8800, Go 7400, Go 7600, Go 7800, Go 7900, +)
o OR ATI Radeon 8500, 9250, or better
(nVidia cards are recommended for the Linux client)
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 1e2eac39eb..454e547155 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -875,6 +875,9 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
LLUUID agent_id;
gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
+ const BOOL is_first_time_in_viewer2_0 = (gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, FALSE) == LLUUID::null);
+
+
LLVOAvatar* avatar = gAgent.getAvatarObject();
if (avatar && (agent_id == avatar->getID()))
{
@@ -954,7 +957,8 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
gInventory.addObserver(outfit);
}
- gAgentWearables.populateMyOutfitsFolder();
+ if (is_first_time_in_viewer2_0)
+ gAgentWearables.populateMyOutfitsFolder();
}
}
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index c06098689d..43b2f34ecd 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -455,7 +455,10 @@ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit
LLViewerInventoryItem *item = items.get(i);
if (keep_outfit_links && (item->getActualType() == LLAssetType::AT_LINK_FOLDER))
continue;
- gInventory.purgeObject(item->getUUID());
+ if (item->getIsLinkType())
+ {
+ gInventory.purgeObject(item->getUUID());
+ }
}
}
@@ -871,10 +874,48 @@ bool areMatchingWearables(const LLViewerInventoryItem *a, const LLViewerInventor
(a->getWearableType() == b->getWearableType()));
}
+class LLDeferredCOFLinkObserver: public LLInventoryObserver
+{
+public:
+ LLDeferredCOFLinkObserver(const LLUUID& item_id, bool do_update):
+ mItemID(item_id),
+ mDoUpdate(do_update)
+ {
+ }
+
+ ~LLDeferredCOFLinkObserver()
+ {
+ }
+
+ /* virtual */ void changed(U32 mask)
+ {
+ const LLInventoryItem *item = gInventory.getItem(mItemID);
+ if (item)
+ {
+ gInventory.removeObserver(this);
+ LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate);
+ delete this;
+ }
+ }
+
+private:
+ const LLUUID mItemID;
+ bool mDoUpdate;
+};
+
+
void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
{
const LLInventoryItem *item = gInventory.getItem(item_id);
- addCOFItemLink(item, do_update);
+ if (!item)
+ {
+ LLDeferredCOFLinkObserver *observer = new LLDeferredCOFLinkObserver(item_id, do_update);
+ gInventory.addObserver(observer);
+ }
+ else
+ {
+ addCOFItemLink(item, do_update);
+ }
}
void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update )
@@ -909,7 +950,10 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
else if (areMatchingWearables(vitem,inv_item))
{
gAgentWearables.removeWearable(inv_item->getWearableType(),true,0);
- gInventory.purgeObject(inv_item->getUUID());
+ if (inv_item->getIsLinkType())
+ {
+ gInventory.purgeObject(inv_item->getUUID());
+ }
}
}
if (linked_already)
@@ -958,10 +1002,9 @@ void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_upda
for (S32 i=0; i<item_array.count(); i++)
{
const LLInventoryItem* item = item_array.get(i).get();
- if (item->getLinkedUUID() == item_id)
+ if (item->getIsLinkType() && item->getLinkedUUID() == item_id)
{
- const LLUUID& item_id = item_array.get(i)->getUUID();
- gInventory.purgeObject(item_id);
+ gInventory.purgeObject(item->getUUID());
}
}
if (do_update)
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 07b3399637..becc30832d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -333,7 +333,7 @@ LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
void idle_afk_check()
{
// check idle timers
- if (gSavedSettings.getBOOL("AllowIdleAFK") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getF32("AFKTimeout")))
+ if (gSavedSettings.getS32("AFKTimeout") && (gAwayTriggerTimer.getElapsedTimeF32() > gSavedSettings.getS32("AFKTimeout")))
{
gAgent.setAFK();
}
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 33dc7ee2c8..c5a1ffdcb3 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -211,11 +211,9 @@ void LLAvatarActions::startCall(const LLUUID& id)
std::string name;
gCacheName->getFullName(id, name);
- LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
+ LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id, true);
if (session_id != LLUUID::null)
{
- // always open IM window when connecting to voice
- LLIMFloater::show(session_id);
gIMMgr->startCall(session_id);
}
make_ui_sound("UISndStartIM");
@@ -239,15 +237,12 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
// create the new ad hoc voice session
const std::string title = LLTrans::getString("conference-title");
LLUUID session_id = gIMMgr->addSession(title, IM_SESSION_CONFERENCE_START,
- ids[0], id_array);
+ ids[0], id_array, true);
if (session_id == LLUUID::null)
{
return;
}
- // always open IM window when connecting to voice
- LLIMFloater::show(session_id);
-
// start the call once the session has fully initialized
gIMMgr->autoStartCallOnStartup(session_id);
@@ -269,11 +264,8 @@ bool LLAvatarActions::isCalling(const LLUUID &id)
//static
bool LLAvatarActions::canCall(const LLUUID &id)
{
- if(isFriend(id))
- {
- return LLAvatarTracker::instance().isBuddyOnline(id) && LLVoiceClient::voiceEnabled();
- }
- else
+ // For now we do not need to check whether passed UUID is ID of agent's friend.
+ // Use common check of Voice Client state.
{
// don't need to check online/offline status because "usual resident" (resident that is not a friend)
// can be only ONLINE. There is no way to see "usual resident" in OFFLINE status. If we see "usual
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 3bd4f898c8..71b23e1383 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llavatarlist.h"
+#include "llagent.h" // for comparator
// newview
#include "llcallingcard.h" // for LLAvatarTracker
@@ -420,3 +421,17 @@ bool LLAvatarItemNameComparator::doCompare(const LLAvatarListItem* avatar_item1,
return name1 < name2;
}
+bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const
+{
+ //keep agent on top, if first is agent,
+ //then we need to return true to elevate this id, otherwise false.
+ if(avatar_item1->getAvatarId() == gAgent.getID())
+ {
+ return true;
+ }
+ else if (avatar_item2->getAvatarId() == gAgent.getID())
+ {
+ return false;
+ }
+ return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);
+}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 9058fec540..e913be0f62 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -155,4 +155,16 @@ protected:
virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
};
+class LLAvatarItemAgentOnTopComparator : public LLAvatarItemNameComparator
+{
+ LOG_CLASS(LLAvatarItemAgentOnTopComparator);
+
+public:
+ LLAvatarItemAgentOnTopComparator() {};
+ virtual ~LLAvatarItemAgentOnTopComparator() {};
+
+protected:
+ virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
+};
+
#endif // LL_LLAVATARLIST_H
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 8c793873f4..ab657e0e99 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -67,6 +67,10 @@ LLBottomTray::LLBottomTray(const LLSD&)
, mGesturePanel(NULL)
, mCamButton(NULL)
{
+ // Firstly add ourself to IMSession observers, so we catch session events
+ // before chiclets do that.
+ LLIMMgr::getInstance()->addSessionObserver(this);
+
mFactoryMap["chat_bar"] = LLCallbackMap(LLBottomTray::createNearbyChatBar, NULL);
LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml");
@@ -76,7 +80,9 @@ LLBottomTray::LLBottomTray(const LLSD&)
mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1));
LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
- LLIMMgr::getInstance()->addSessionObserver(this);
+
+ //managing chiclets for voice calls
+ LLIMModel::getInstance()->addNewMsgCallback(boost::bind(&LLBottomTray::onNewIM, this, _1));
//this is to fix a crash that occurs because LLBottomTray is a singleton
//and thus is deleted at the end of the viewers lifetime, but to be cleanly
@@ -143,25 +149,22 @@ LLIMChiclet* LLBottomTray::createIMChiclet(const LLUUID& session_id)
//virtual
void LLBottomTray::sessionAdded(const LLUUID& session_id, const std::string& name, const LLUUID& other_participant_id)
{
- if(getChicletPanel())
- {
- if(getChicletPanel()->findChiclet<LLChiclet>(session_id))
- {
+ if (!getChicletPanel()) return;
- }
- else
- {
- LLIMChiclet* chiclet = createIMChiclet(session_id);
- if(chiclet)
- {
- chiclet->setIMSessionName(name);
- chiclet->setOtherParticipantId(other_participant_id);
- }
- else
- {
- llerrs << "Could not create chiclet" << llendl;
- }
- }
+ if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+ // For im sessions started as voice call chiclet gets created on the first incoming message
+ if (gIMMgr->isVoiceCall(session_id)) return;
+
+ LLIMChiclet* chiclet = createIMChiclet(session_id);
+ if(chiclet)
+ {
+ chiclet->setIMSessionName(name);
+ chiclet->setOtherParticipantId(other_participant_id);
+ }
+ else
+ {
+ llerrs << "Could not create chiclet" << llendl;
}
}
@@ -194,6 +197,32 @@ void LLBottomTray::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID&
}
}
+void LLBottomTray::onNewIM(const LLSD& data)
+{
+ LLUUID from_id = data["from_id"];
+ if (from_id.isNull() || gAgentID == from_id) return;
+
+ LLUUID session_id = data["session_id"];
+ if (session_id.isNull()) return;
+
+ if (!gIMMgr->isVoiceCall(session_id)) return;
+
+ if (getChicletPanel()->findChiclet<LLChiclet>(session_id)) return;
+
+ //first real message, time to create chiclet
+ LLIMChiclet* chiclet = createIMChiclet(session_id);
+ if(chiclet)
+ {
+ chiclet->setIMSessionName(LLIMModel::getInstance()->getName(session_id));
+ chiclet->setOtherParticipantId(LLIMModel::getInstance()->getOtherParticipantID(session_id));
+ }
+}
+
+S32 LLBottomTray::getTotalUnreadIMCount()
+{
+ return getChicletPanel()->getTotalUnreadIMCount();
+}
+
// virtual
void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, bool proximal)
{
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index fa204ee9ea..5cd3f15746 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -75,6 +75,10 @@ public:
virtual void sessionRemoved(const LLUUID& session_id);
void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ void onNewIM(const LLSD& data);
+
+ S32 getTotalUnreadIMCount();
+
virtual void reshape(S32 width, S32 height, BOOL called_from_parent);
virtual void onFocusLost();
@@ -90,6 +94,11 @@ public:
void showMoveButton(BOOL visible);
void showCameraButton(BOOL visible);
void showSnapshotButton(BOOL visible);
+
+ /**
+ * Creates IM Chiclet based on session type (IM chat or Group chat)
+ */
+ LLIMChiclet* createIMChiclet(const LLUUID& session_id);
private:
typedef enum e_resize_status_type
@@ -182,11 +191,6 @@ protected:
void onContextMenuItemClicked(const LLSD& userdata);
bool onContextMenuItemEnabled(const LLSD& userdata);
- /**
- * Creates IM Chiclet based on session type (IM chat or Group chat)
- */
- LLIMChiclet* createIMChiclet(const LLUUID& session_id);
-
LLChicletPanel* mChicletPanel;
LLPanel* mSpeakPanel;
LLSpeakButton* mSpeakBtn;
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index 2f5523e04d..20739d2401 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -42,8 +42,11 @@
#include "llagentdata.h" // for gAgentID
#include "llavatarlist.h"
#include "llbottomtray.h"
+#include "llimfloater.h"
+#include "llfloaterreg.h"
#include "llparticipantlist.h"
#include "llspeakers.h"
+#include "lltransientfloatermgr.h"
class LLNonAvatarCaller : public LLAvatarListItem
@@ -77,7 +80,7 @@ static void* create_non_avatar_caller(void*)
}
LLCallFloater::LLCallFloater(const LLSD& key)
-: LLDockableFloater(NULL, key)
+: LLDockableFloater(NULL, false, key)
, mSpeakerManager(NULL)
, mPaticipants(NULL)
, mAvatarList(NULL)
@@ -89,11 +92,11 @@ LLCallFloater::LLCallFloater(const LLSD& key)
{
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
LLVoiceClient::getInstance()->addObserver(this);
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
}
LLCallFloater::~LLCallFloater()
{
- mChannelChangedConnection.disconnect();
delete mPaticipants;
mPaticipants = NULL;
@@ -103,6 +106,7 @@ LLCallFloater::~LLCallFloater()
{
gVoiceClient->removeObserver(this);
}
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
// virtual
@@ -125,8 +129,6 @@ BOOL LLCallFloater::postBuild()
// update list for current session
updateSession();
- // subscribe to to be notified Voice Channel is changed
- mChannelChangedConnection = LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::onCurrentChannelChanged, this, _1));
return TRUE;
}
@@ -238,10 +240,21 @@ void LLCallFloater::updateSession()
//hide "Leave Call" button for nearby chat
bool is_local_chat = mVoiceType == VC_LOCAL_CHAT;
- childSetVisible("leave_btn_panel", !is_local_chat);
+ childSetVisible("leave_call_btn", !is_local_chat);
refreshPartisipantList();
updateModeratorState();
+
+ //show floater for voice calls
+ if (!is_local_chat)
+ {
+ LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ bool show_me = !(im_floater && im_floater->getVisible());
+ if (show_me)
+ {
+ setVisible(true);
+ }
+ }
}
void LLCallFloater::refreshPartisipantList()
@@ -267,10 +280,9 @@ void LLCallFloater::refreshPartisipantList()
if (!non_avatar_caller)
{
- bool do_not_use_context_menu_in_local_chat = LLLocalSpeakerMgr::getInstance() != mSpeakerManager;
- mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList, do_not_use_context_menu_in_local_chat);
+ mPaticipants = new LLParticipantList(mSpeakerManager, mAvatarList);
- if (!do_not_use_context_menu_in_local_chat)
+ if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
{
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
}
@@ -278,7 +290,7 @@ void LLCallFloater::refreshPartisipantList()
}
}
-void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
+void LLCallFloater::sOnCurrentChannelChanged(const LLUUID& /*session_id*/)
{
// Don't update participant list if no channel info is available.
// Fix for ticket EXT-3427
@@ -288,9 +300,11 @@ void LLCallFloater::onCurrentChannelChanged(const LLUUID& /*session_id*/)
{
return;
}
+ LLCallFloater* call_floater = LLFloaterReg::getTypedInstance<LLCallFloater>("voice_controls");
+
// Forget speaker manager from the previous session to avoid using it after session was destroyed.
- mSpeakerManager = NULL;
- updateSession();
+ call_floater->mSpeakerManager = NULL;
+ call_floater->updateSession();
}
void LLCallFloater::updateTitle()
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index b2288a42ff..f9c9149085 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -70,6 +70,8 @@ public:
*/
/*virtual*/ void onChange();
+ static void sOnCurrentChannelChanged(const LLUUID& session_id);
+
private:
typedef enum e_voice_controls_type
{
@@ -93,7 +95,9 @@ private:
* Refreshes participant list according to current Voice Channel
*/
void refreshPartisipantList();
- void onCurrentChannelChanged(const LLUUID& session_id);
+
+
+
void updateTitle();
void initAgentData();
void setModeratorMutedVoice(bool moderator_muted);
@@ -108,8 +112,6 @@ private:
LLPanel* mAgentPanel;
LLOutputMonitorCtrl* mSpeakingIndicator;
bool mIsModeratorMutedVoice;
-
- boost::signals2::connection mChannelChangedConnection;
};
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index ee60df1b4b..7a83299dac 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -202,6 +202,8 @@ public:
userName->setValue(SL);
}
+ mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;
+
setTimeField(chat);
LLAvatarIconCtrl* icon = getChild<LLAvatarIconCtrl>("avatar_icon");
@@ -218,7 +220,37 @@ public:
icon->setValue(LLSD("SL_Logo"));
}
- }
+ }
+
+ /*virtual*/ void draw()
+ {
+ LLTextEditor* user_name = getChild<LLTextEditor>("user_name");
+ LLTextBox* time_box = getChild<LLTextBox>("time_box");
+
+ LLRect user_name_rect = user_name->getRect();
+ S32 user_name_width = user_name_rect.getWidth();
+ S32 time_box_width = time_box->getRect().getWidth();
+
+ if (time_box->getVisible() && user_name_width <= mMinUserNameWidth)
+ {
+ time_box->setVisible(FALSE);
+
+ user_name_rect.mRight += time_box_width;
+ user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight());
+ user_name->setRect(user_name_rect);
+ }
+
+ if (!time_box->getVisible() && user_name_width > mMinUserNameWidth + time_box_width)
+ {
+ user_name_rect.mRight -= time_box_width;
+ user_name->reshape(user_name_rect.getWidth(), user_name_rect.getHeight());
+ user_name->setRect(user_name_rect);
+
+ time_box->setVisible(TRUE);
+ }
+
+ LLPanel::draw();
+ }
void nameUpdatedCallback(const LLUUID& id,const std::string& first,const std::string& last,BOOL is_group)
{
@@ -228,6 +260,8 @@ public:
mLastName = last;
}
protected:
+ static const S32 PADDING = 20;
+
void showContextMenu(S32 x,S32 y)
{
if(mSourceType == CHAT_SOURCE_SYSTEM)
@@ -307,6 +341,7 @@ protected:
std::string mLastName;
std::string mFrom;
+ S32 mMinUserNameWidth;
};
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index c7f77810df..21a0381495 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -66,11 +66,13 @@ static LLDefaultChildRegistry::Register<LLInvOfferChiclet> t7("chiclet_offer");
static const LLRect CHICLET_RECT(0, 25, 25, 0);
static const LLRect CHICLET_ICON_RECT(0, 22, 22, 0);
-static const LLRect VOICE_INDICATOR_RECT(25, 25, 45, 0);
+static const LLRect VOICE_INDICATOR_RECT(50, 25, 70, 0);
+static const LLRect COUNTER_RECT(25, 25, 50, 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;
+const S32 LLChicletNotificationCounterCtrl::MAX_DISPLAYED_COUNT = 99;
boost::signals2::signal<LLChiclet* (const LLUUID&),
@@ -154,6 +156,7 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p)
, mMaxDisplayedCount(p.max_displayed_count)
, mIsNewMessagesState(false)
, mFlashToLitTimer(NULL)
+, mContextMenu(NULL)
{
LLButton::Params button_params = p.button;
mButton = LLUICtrlFactory::create<LLButton>(button_params);
@@ -169,6 +172,7 @@ LLSysWellChiclet::~LLSysWellChiclet()
void LLSysWellChiclet::setCounter(S32 counter)
{
+ // note same code in LLChicletNotificationCounterCtrl::setCounter(S32 counter)
std::string s_count;
if(counter != 0)
{
@@ -229,6 +233,21 @@ void LLSysWellChiclet::setNewMessagesState(bool new_messages)
mIsNewMessagesState = new_messages;
}
+// virtual
+BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if(!mContextMenu)
+ {
+ createMenu();
+ }
+ if (mContextMenu)
+ {
+ mContextMenu->show(x, y);
+ LLMenuGL::showPopup(this, mContextMenu, x, y);
+ }
+ return TRUE;
+}
+
/************************************************************************/
/* LLIMWellChiclet implementation */
/************************************************************************/
@@ -248,10 +267,50 @@ LLIMWellChiclet::~LLIMWellChiclet()
LLIMMgr::getInstance()->removeSessionObserver(this);
}
+void LLIMWellChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string action = user_data.asString();
+ if("close all" == action)
+ {
+ LLIMWellWindow::getInstance()->closeAll();
+ }
+}
+
+bool LLIMWellChiclet::enableMenuItem(const LLSD& user_data)
+{
+ std::string item = user_data.asString();
+ if (item == "can close all")
+ {
+ return !LLIMWellWindow::getInstance()->isWindowEmpty();
+ }
+ return true;
+}
+
+void LLIMWellChiclet::createMenu()
+{
+ if(mContextMenu)
+ {
+ llwarns << "Menu already exists" << llendl;
+ return;
+ }
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("IMWellChicletMenu.Action",
+ boost::bind(&LLIMWellChiclet::onMenuItemClicked, this, _2));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ enable_registrar.add("IMWellChicletMenu.EnableItem",
+ boost::bind(&LLIMWellChiclet::enableMenuItem, this, _2));
+
+ mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
+ ("menu_im_well_button.xml",
+ LLMenuGL::sMenuContainer,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
{
- S32 total_unread = LLIMMgr::instance().getNumberOfUnreadParticipantMessages();
- setCounter(total_unread);
+ setCounter(LLBottomTray::getInstance()->getTotalUnreadIMCount());
}
/************************************************************************/
@@ -282,6 +341,47 @@ void LLNotificationChiclet::connectCounterUpdatersToSignal(const std::string& no
}
}
+void LLNotificationChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string action = user_data.asString();
+ if("close all" == action)
+ {
+ LLNotificationWellWindow::getInstance()->closeAll();
+ }
+}
+
+bool LLNotificationChiclet::enableMenuItem(const LLSD& user_data)
+{
+ std::string item = user_data.asString();
+ if (item == "can close all")
+ {
+ return mUreadSystemNotifications != 0;
+ }
+ return true;
+}
+
+void LLNotificationChiclet::createMenu()
+{
+ if(mContextMenu)
+ {
+ llwarns << "Menu already exists" << llendl;
+ return;
+ }
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("NotificationWellChicletMenu.Action",
+ boost::bind(&LLNotificationChiclet::onMenuItemClicked, this, _2));
+
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ enable_registrar.add("NotificationWellChicletMenu.EnableItem",
+ boost::bind(&LLNotificationChiclet::enableMenuItem, this, _2));
+
+ mContextMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
+ ("menu_notification_well_button.xml",
+ LLMenuGL::sMenuContainer,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -366,7 +466,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
// 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);
+ enableCounterControl(false);
}
void LLIMChiclet::setShowSpeaker(bool show)
@@ -379,30 +479,87 @@ void LLIMChiclet::setShowSpeaker(bool show)
onChicletSizeChanged();
}
}
+
+void LLIMChiclet::enableCounterControl(bool enable)
+{
+ mCounterEnabled = enable;
+ if(!enable)
+ {
+ LLChiclet::setShowCounter(false);
+ }
+}
+
+void LLIMChiclet::setShowCounter(bool show)
+{
+ if(!mCounterEnabled)
+ {
+ return;
+ }
+
+ bool needs_resize = getShowCounter() != show;
+ if(needs_resize)
+ {
+ LLChiclet::setShowCounter(show);
+ toggleCounterControl();
+ onChicletSizeChanged();
+ }
+}
+
void LLIMChiclet::initSpeakerControl()
{
// virtual
}
-void LLIMChiclet::toggleSpeakerControl()
+void LLIMChiclet::setRequiredWidth()
{
- LLRect speaker_rect = mSpeakerCtrl->getRect();
- S32 required_width = getRect().getWidth();
+ bool show_speaker = getShowSpeaker();
+ bool show_counter = getShowCounter();
+ S32 required_width = CHICLET_RECT.getWidth();
- if(getShowSpeaker())
+ if (show_counter)
{
- required_width = required_width + speaker_rect.getWidth();
- initSpeakerControl();
+ required_width += COUNTER_RECT.getWidth();
}
- else
+ if (show_speaker)
{
- required_width = required_width - speaker_rect.getWidth();
- }
-
+ required_width += VOICE_INDICATOR_RECT.getWidth();
+ }
+
reshape(required_width, getRect().getHeight());
+}
+
+void LLIMChiclet::toggleSpeakerControl()
+{
+ if(getShowSpeaker())
+ {
+ if(getShowCounter())
+ {
+ mSpeakerCtrl->setRect(VOICE_INDICATOR_RECT);
+ }
+ else
+ {
+ mSpeakerCtrl->setRect(COUNTER_RECT);
+ }
+ initSpeakerControl();
+ }
+
+ setRequiredWidth();
mSpeakerCtrl->setVisible(getShowSpeaker());
}
+void LLIMChiclet::setCounter(S32 counter)
+{
+ mCounterCtrl->setCounter(counter);
+ setShowCounter(counter);
+ setShowNewMessagesIcon(counter);
+}
+
+void LLIMChiclet::toggleCounterControl()
+{
+ setRequiredWidth();
+ mCounterCtrl->setVisible(getShowCounter());
+}
+
void LLIMChiclet::setShowNewMessagesIcon(bool show)
{
if(mNewMessagesIcon)
@@ -503,6 +660,7 @@ LLIMP2PChiclet::Params::Params()
unread_notifications.v_pad(5);
unread_notifications.text_color(LLColor4::white);
unread_notifications.mouse_opaque(false);
+ unread_notifications.rect(COUNTER_RECT);
unread_notifications.visible(false);
speaker.name("speaker");
@@ -541,12 +699,6 @@ LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
mSpeakerCtrl->setVisible(getShowSpeaker());
}
-void LLIMP2PChiclet::setCounter(S32 counter)
-{
- mCounterCtrl->setCounter(counter);
- setShowNewMessagesIcon(counter);
-}
-
void LLIMP2PChiclet::initSpeakerControl()
{
mSpeakerCtrl->setSpeakerId(getOtherParticipantId());
@@ -659,6 +811,7 @@ LLAdHocChiclet::Params::Params()
unread_notifications.v_pad(5);
unread_notifications.text_color(LLColor4::white);
unread_notifications.mouse_opaque(false);
+ unread_notifications.rect(COUNTER_RECT);
unread_notifications.visible(false);
@@ -733,12 +886,6 @@ void LLAdHocChiclet::switchToCurrentSpeaker()
mSpeakerCtrl->setSpeakerId(speaker_id);
}
-void LLAdHocChiclet::setCounter(S32 counter)
-{
- mCounterCtrl->setCounter(counter);
- setShowNewMessagesIcon(counter);
-}
-
void LLAdHocChiclet::createPopupMenu()
{
if(mPopupMenu)
@@ -810,6 +957,7 @@ LLIMGroupChiclet::Params::Params()
unread_notifications.font_halign(LLFontGL::HCENTER);
unread_notifications.v_pad(5);
unread_notifications.text_color(LLColor4::white);
+ unread_notifications.rect(COUNTER_RECT);
unread_notifications.visible(false);
speaker.name("speaker");
@@ -850,12 +998,6 @@ LLIMGroupChiclet::~LLIMGroupChiclet()
LLGroupMgr::getInstance()->removeObserver(this);
}
-void LLIMGroupChiclet::setCounter(S32 counter)
-{
- mCounterCtrl->setCounter(counter);
- setShowNewMessagesIcon(counter);
-}
-
void LLIMGroupChiclet::draw()
{
switchToCurrentSpeaker();
@@ -1529,14 +1671,34 @@ bool LLChicletPanel::isAnyIMFloaterDoked()
return res;
}
+S32 LLChicletPanel::getTotalUnreadIMCount()
+{
+ S32 count = 0;
+ chiclet_list_t::const_iterator it = mChicletList.begin();
+ for( ; mChicletList.end() != it; ++it)
+ {
+ LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(*it);
+ if(chiclet)
+ {
+ count += chiclet->getCounter();
+ }
+ }
+ return count;
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
+LLChicletNotificationCounterCtrl::Params::Params()
+: max_displayed_count("max_displayed_count", MAX_DISPLAYED_COUNT)
+{
+}
LLChicletNotificationCounterCtrl::LLChicletNotificationCounterCtrl(const Params& p)
: LLTextBox(p)
, mCounter(0)
, mInitialWidth(0)
+ , mMaxDisplayedCount(p.max_displayed_count)
{
mInitialWidth = getRect().getWidth();
}
@@ -1545,11 +1707,21 @@ void LLChicletNotificationCounterCtrl::setCounter(S32 counter)
{
mCounter = counter;
- std::stringstream stream;
- stream << getCounter();
+ // note same code in LLSysWellChiclet::setCounter(S32 counter)
+ std::string s_count;
+ if(counter != 0)
+ {
+ static std::string more_messages_exist("+");
+ std::string more_messages(counter > mMaxDisplayedCount ? more_messages_exist : "");
+ s_count = llformat("%d%s"
+ , llmin(counter, mMaxDisplayedCount)
+ , more_messages.c_str()
+ );
+ }
+
if(mCounter != 0)
{
- setText(stream.str());
+ setText(s_count);
}
else
{
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 353fc01c34..259476c2ad 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -52,10 +52,19 @@ class LLChicletNotificationCounterCtrl : public LLTextBox
{
public:
+ static const S32 MAX_DISPLAYED_COUNT;
+
struct Params : public LLInitParam::Block<Params, LLTextBox::Params>
{
- Params()
- {};
+ /**
+ * Contains maximum displayed count of unread messages. Default value is 9.
+ *
+ * If count is less than "max_unread_count" will be displayed as is.
+ * Otherwise 9+ will be shown (for default value).
+ */
+ Optional<S32> max_displayed_count;
+
+ Params();
};
/**
@@ -93,6 +102,7 @@ private:
S32 mCounter;
S32 mInitialWidth;
+ S32 mMaxDisplayedCount;
};
/**
@@ -359,6 +369,32 @@ public:
virtual void toggleSpeakerControl();
/**
+ * Sets number of unread messages. Will update chiclet's width if number text
+ * exceeds size of counter and notify it's parent about size change.
+ */
+ virtual void setCounter(S32);
+
+ /**
+ * Enables/disables the counter control for a chiclet.
+ */
+ virtual void enableCounterControl(bool enable);
+
+ /**
+ * Sets show counter state.
+ */
+ virtual void setShowCounter(bool show);
+
+ /**
+ * Shows/Hides for counter control for a chiclet.
+ */
+ virtual void toggleCounterControl();
+
+ /**
+ * Sets required width for a chiclet according to visible controls.
+ */
+ virtual void setRequiredWidth();
+
+ /**
* Shows/hides overlay icon concerning new unread messages.
*/
virtual void setShowNewMessagesIcon(bool show);
@@ -400,6 +436,7 @@ protected:
protected:
bool mShowSpeaker;
+ bool mCounterEnabled;
LLIconCtrl* mNewMessagesIcon;
LLChicletNotificationCounterCtrl* mCounterCtrl;
@@ -453,12 +490,6 @@ public:
/* virtual */ void setOtherParticipantId(const LLUUID& other_participant_id);
/**
- * Sets number of unread messages. Will update chiclet's width if number text
- * exceeds size of counter and notify it's parent about size change.
- */
- /*virtual*/ void setCounter(S32);
-
- /**
* Init Speaker Control with speaker's ID
*/
/*virtual*/ void initSpeakerControl();
@@ -527,12 +558,6 @@ public:
/*virtual*/ void setSessionId(const LLUUID& session_id);
/**
- * Sets number of unread messages. Will update chiclet's width if number text
- * exceeds size of counter and notify it's parent about size change.
- */
- /*virtual*/ void setCounter(S32);
-
- /**
* Keep Speaker Control with actual speaker's ID
*/
/*virtual*/ void draw();
@@ -695,12 +720,6 @@ public:
/*virtual*/ void changed(LLGroupChange gc);
/**
- * Sets number of unread messages. Will update chiclet's width if number text
- * exceeds size of counter and notify it's parent about size change.
- */
- /*virtual*/ void setCounter(S32);
-
- /**
* Init Speaker Control with speaker's ID
*/
/*virtual*/ void initSpeakerControl();
@@ -806,6 +825,13 @@ protected:
*/
void changeLitState();
+ /**
+ * Displays menu.
+ */
+ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+ virtual void createMenu() = 0;
+
protected:
class FlashToLitTimer;
LLButton* mButton;
@@ -814,7 +840,7 @@ protected:
bool mIsNewMessagesState;
FlashToLitTimer* mFlashToLitTimer;
-
+ LLContextMenu* mContextMenu;
};
/**
@@ -835,6 +861,21 @@ protected:
LLIMWellChiclet(const Params& p);
/**
+ * Processes clicks on chiclet popup menu.
+ */
+ virtual void onMenuItemClicked(const LLSD& user_data);
+
+ /**
+ * Enables chiclet menu items.
+ */
+ bool enableMenuItem(const LLSD& user_data);
+
+ /**
+ * Creates menu.
+ */
+ /*virtual*/ void createMenu();
+
+ /**
* Handles changes in a session (message was added, messages were read, etc.)
*
* It get total count of unread messages from a LLIMMgr in all opened sessions and display it.
@@ -854,6 +895,21 @@ class LLNotificationChiclet : public LLSysWellChiclet
protected:
LLNotificationChiclet(const Params& p);
+ /**
+ * Processes clicks on chiclet menu.
+ */
+ void onMenuItemClicked(const LLSD& user_data);
+
+ /**
+ * Enables chiclet menu items.
+ */
+ bool enableMenuItem(const LLSD& user_data);
+
+ /**
+ * Creates menu.
+ */
+ /*virtual*/ void createMenu();
+
// connect counter updaters to the corresponding signals
void connectCounterUpdatersToSignal(const std::string& notification_type);
@@ -963,6 +1019,8 @@ public:
S32 getMinWidth() const { return mMinWidth; }
+ S32 getTotalUnreadIMCount();
+
protected:
LLChicletPanel(const Params&p);
friend class LLUICtrlFactory;
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 9c37c953fe..9f6412c0ab 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -322,6 +322,13 @@ void LLExpandableTextBox::expandTextBox()
// hide "more" link, and show full text contents
mTextBox->hideExpandText();
+ // *HACK dz
+ // hideExpandText brakes text styles (replaces hyper-links with plain text), see ticket EXT-3290
+ // Set text again to make text box re-apply styles.
+ // *TODO Find proper solution to fix this issue.
+ // Maybe add removeSegment to LLTextBase
+ mTextBox->setTextBase(mText);
+
S32 text_delta = mTextBox->getVerticalTextDelta();
text_delta += mTextBox->getVPad() * 2;
text_delta += mScroll->getBorderWidth() * 2;
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 7c989cfa50..2b4f9e527c 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -61,6 +61,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, const LLStyle::Params& input_params = LLStyle::Params());
+ void setTextBase(const std::string& text) { LLTextBase::setText(text); }
/**
* Returns difference between text box height and text height.
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 17b0710813..832626e007 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -370,6 +370,7 @@ LLFavoritesBarCtrl::LLFavoritesBarCtrl(const LLFavoritesBarCtrl::Params& p)
mLandingTab(NULL),
mLastTab(NULL),
mTabsHighlightEnabled(TRUE)
+ , mUpdateDropDownItems(true)
{
// Register callback for menus with current registrar (will be parent panel's registrar)
LLUICtrl::CommitCallbackRegistry::currentRegistrar().add("Favorites.DoToSelected",
@@ -589,16 +590,15 @@ void LLFavoritesBarCtrl::changed(U32 mask)
}
else
{
- updateButtons(getRect().getWidth());
+ updateButtons();
}
}
//virtual
void LLFavoritesBarCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- updateButtons(width);
-
LLUICtrl::reshape(width, height, called_from_parent);
+ updateButtons();
}
void LLFavoritesBarCtrl::draw()
@@ -637,7 +637,7 @@ LLXMLNodePtr LLFavoritesBarCtrl::getButtonXMLNode()
return buttonXMLNode;
}
-void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
+void LLFavoritesBarCtrl::updateButtons()
{
mItems.clear();
@@ -652,139 +652,149 @@ void LLFavoritesBarCtrl::updateButtons(U32 bar_width)
return;
}
- S32 buttonWidth = 120; //default value
- buttonXMLNode->getAttributeS32("width", buttonWidth);
- S32 buttonHGap = 2; // default value
- buttonXMLNode->getAttributeS32("left", buttonHGap);
-
- S32 count = mItems.count();
- S32 buttons_space = bar_width - buttonHGap;
-
- S32 first_drop_down_item = count;
-
- // Calculating, how much buttons can fit in the bar
- S32 buttons_width = 0;
- for (S32 i = 0; i < count; ++i)
+ const child_list_t* childs = getChildList();
+ child_list_const_iter_t child_it = childs->begin();
+ int first_changed_item_index = 0;
+ int rightest_point = getRect().mRight - mChevronButton->getRect().getWidth();
+ //lets find first changed button
+ while (child_it != childs->end() && first_changed_item_index < mItems.count())
{
- buttons_width += buttonWidth + buttonHGap;
- if (buttons_width > buttons_space)
+ LLFavoriteLandmarkButton* button = dynamic_cast<LLFavoriteLandmarkButton*> (*child_it);
+ if (button)
{
- // There is no space for all buttons.
- // Calculating the number of buttons, that are fit with chevron button
- buttons_space -= mChevronButton->getRect().getWidth() + buttonHGap;
- while (i >= 0 && buttons_width > buttons_space)
+ const LLViewerInventoryItem *item = mItems[first_changed_item_index].get();
+ if (item)
{
- buttons_width -= buttonWidth + buttonHGap;
- i--;
+ // an child's order and mItems should be same
+ if (button->getLandmarkId() != item->getUUID() // sort order has been changed
+ || button->getLabelSelected() != item->getDisplayName() // favorite's name has been changed
+ || button->getRect().mRight < rightest_point) // favbar's width has been changed
+ {
+ break;
+ }
}
- first_drop_down_item = i + 1; // First item behind visible items
-
- break;
+ first_changed_item_index++;
}
+ child_it++;
}
+ // now first_changed_item_index should contains a number of button that need to change
- bool recreate_buttons = true;
-
- // If inventory items are not changed up to mFirstDropDownItem, no need to recreate them
- if (mFirstDropDownItem == first_drop_down_item && (mItemNamesCache.size() == count || mItemNamesCache.size() == mFirstDropDownItem))
+ if (first_changed_item_index <= mItems.count())
{
- S32 i;
- for (i = 0; i < mFirstDropDownItem; ++i)
+ // Rebuild the buttons only
+ // child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
+
+ while (child_it != childs->end())
{
- if (mItemNamesCache.get(i) != mItems.get(i)->getName())
+ //lets remove other landmarks button and rebuild it
+ child_list_const_iter_t cur_it = child_it++;
+ LLFavoriteLandmarkButton* button =
+ dynamic_cast<LLFavoriteLandmarkButton*> (*cur_it);
+ if (button)
{
- break;
+ removeChild(button);
+ delete button;
}
}
- if (i == mFirstDropDownItem)
+ // we have to remove ChevronButton to make sure that the last item will be LandmarkButton to get the right aligning
+ if (mChevronButton->getParent() == this)
{
- recreate_buttons = false;
+ removeChild(mChevronButton);
}
- }
-
- if (recreate_buttons)
- {
- mFirstDropDownItem = first_drop_down_item;
-
- mItemNamesCache.clear();
- for (S32 i = 0; i < mFirstDropDownItem; i++)
+ int last_right_edge = 0;
+ if (getChildList()->size() > 0)
{
- mItemNamesCache.put(mItems.get(i)->getName());
+ last_right_edge = getChildList()->back()->getRect().mRight;
}
-
- // Rebuild the buttons only
- // child_list_t is a linked list, so safe to erase from the middle if we pre-incrament the iterator
- for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); )
+ //last_right_edge is saving coordinates
+ LLButton* last_new_button = NULL;
+ int j = first_changed_item_index;
+ for (; j < mItems.count(); j++)
{
- child_list_const_iter_t cur_it = child_it++;
- LLView* viewp = *cur_it;
- LLButton* button = dynamic_cast<LLButton*>(viewp);
- if (button && (button != mChevronButton))
+ last_new_button = createButton(mItems[j], buttonXMLNode, last_right_edge);
+ if (!last_new_button)
{
- removeChild(button);
- delete button;
+ break;
}
- }
+ sendChildToBack(last_new_button);
+ last_right_edge = last_new_button->getRect().mRight;
- createButtons(mItems, buttonXMLNode, buttonWidth, buttonHGap);
- }
-
- // Chevron button
- if (mFirstDropDownItem != count)
- {
- // Chevron button should stay right aligned
- LLRect rect;
- rect.setOriginAndSize(bar_width - mChevronButton->getRect().getWidth() - buttonHGap, 0, mChevronButton->getRect().getWidth(), mChevronButton->getRect().getHeight());
- mChevronButton->setRect(rect);
- mChevronButton->setVisible(TRUE);
+ mLastTab = last_new_button;
+ }
+ mFirstDropDownItem = j;
+ // Chevron button
+ if (mFirstDropDownItem < mItems.count())
+ {
+ // if updateButton had been called it means:
+ //or there are some new favorites, or width had been changed
+ // so if we need to display chevron button, we must update dropdown items too.
+ mUpdateDropDownItems = true;
+ S32 buttonHGap = 2; // default value
+ buttonXMLNode->getAttributeS32("left", buttonHGap);
+ LLRect rect;
+ // Chevron button should stay right aligned
+ rect.setOriginAndSize(getRect().mRight - mChevronButton->getRect().getWidth() - buttonHGap, 0,
+ mChevronButton->getRect().getWidth(),
+ mChevronButton->getRect().getHeight());
+
+ addChild(mChevronButton);
+ mChevronButton->setRect(rect);
+ mChevronButton->setVisible(TRUE);
+ }
}
else
{
- // Hide chevron button if all items are visible on bar
- mChevronButton->setVisible(FALSE);
+ mUpdateDropDownItems = false;
}
}
-
-void LLFavoritesBarCtrl::createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &buttonXMLNode, S32 buttonWidth, S32 buttonHGap)
+LLButton* LLFavoritesBarCtrl::createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &buttonXMLNode, S32 x_offset)
{
- S32 curr_x = buttonHGap;
- // Adding buttons
+ S32 def_button_width = 120;
+ buttonXMLNode->getAttributeS32("width", def_button_width);
+ S32 button_x_delta = 2; // default value
+ buttonXMLNode->getAttributeS32("left", button_x_delta);
+ S32 curr_x = x_offset;
+ /**
+ * WORKAROUND:
+ * there are some problem with displaying of fonts in buttons.
+ * Empty space (or ...) is displaying instead of last symbols, even though the width of the button is enough.
+ * Problem will gone, if we stretch out the button. For that reason I have to put additional 10 pixels.
+ */
+ int requred_width = mFont->getWidth(item->getDisplayName()) + 10;
+ int width = requred_width > def_button_width? def_button_width : requred_width;
LLFavoriteLandmarkButton* fav_btn = NULL;
- mLandingTab = mLastTab = NULL;
- for(S32 i = mFirstDropDownItem -1, j = 0; i >= 0; i--)
+ // do we have a place for next button + double buttonHGap + mChevronButton ?
+ if(curr_x + width + 2*button_x_delta + mChevronButton->getRect().getWidth() > getRect().mRight )
{
- LLViewerInventoryItem* item = items.get(j++);
-
- fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
- if (NULL == fav_btn)
- {
- llwarns << "Unable to create button for landmark: " << item->getName() << llendl;
- continue;
- }
-
- fav_btn->setLandmarkID(item->getUUID());
-
- // change only left and save bottom
- fav_btn->setOrigin(curr_x, fav_btn->getRect().mBottom);
- fav_btn->setFont(mFont);
- fav_btn->setName(item->getName());
- fav_btn->setLabel(item->getName());
- fav_btn->setToolTip(item->getName());
- fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
- fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 ));
-
- fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
- fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
-
- sendChildToBack(fav_btn);
-
- curr_x += buttonWidth + buttonHGap;
+ return NULL;
}
-
- mLastTab = fav_btn;
+ fav_btn = LLUICtrlFactory::defaultBuilder<LLFavoriteLandmarkButton>(buttonXMLNode, this, NULL);
+ if (NULL == fav_btn)
+ {
+ llwarns << "Unable to create LLFavoriteLandmarkButton widget: " << item->getName() << llendl;
+ return NULL;
+ }
+
+ LLRect butt_rect (fav_btn->getRect());
+ fav_btn->setLandmarkID(item->getUUID());
+ butt_rect.setOriginAndSize(curr_x + button_x_delta, fav_btn->getRect().mBottom, width, fav_btn->getRect().getHeight());
+
+ fav_btn->setRect(butt_rect);
+ // change only left and save bottom
+ fav_btn->setFont(mFont);
+ fav_btn->setName(item->getName());
+ fav_btn->setLabel(item->getName());
+ fav_btn->setToolTip(item->getName());
+ fav_btn->setCommitCallback(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
+ fav_btn->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3,_4 ));
+
+ fav_btn->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+ fav_btn->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+
+ return fav_btn;
}
@@ -844,99 +854,61 @@ void LLFavoritesBarCtrl::showDropDownMenu()
LLToggleableMenu* menu = (LLToggleableMenu*)mPopupMenuHandle.get();
- if(menu)
+ if (menu)
{
if (!menu->toggleVisibility())
return;
- mItems.clear();
-
- if (!collectFavoriteItems(mItems))
- {
- return;
- }
-
- S32 count = mItems.count();
-
- // Check it there are changed items, since last call
- if (mItemNamesCache.size() == count)
- {
- S32 i;
- for (i = mFirstDropDownItem; i < count; i++)
- {
- if (mItemNamesCache.get(i) != mItems.get(i)->getName())
- {
- break;
- }
- }
-
- // Check passed, just show the menu
- if (i == count)
- {
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
-
- if (menu->getButtonRect().isEmpty())
- {
- menu->setButtonRect(mChevronButton->getRect(), this);
- }
-
- LLMenuGL::showPopup(this, menu, getRect().getWidth() - menu->getRect().getWidth(), 0);
- return;
- }
- }
-
- // Add menu items to cache, if there is only names of buttons
- if (mItemNamesCache.size() == mFirstDropDownItem)
+ U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
+ if (mUpdateDropDownItems)
{
- for (S32 i = mFirstDropDownItem; i < count; i++)
- {
- mItemNamesCache.put(mItems.get(i)->getName());
- }
- }
-
- menu->empty();
+ menu->empty();
- U32 max_width = llmin(DROP_DOWN_MENU_WIDTH, getRect().getWidth());
- U32 widest_item = 0;
+ U32 widest_item = 0;
- for(S32 i = mFirstDropDownItem; i < count; i++)
- {
- LLViewerInventoryItem* item = mItems.get(i);
- const std::string& item_name = item->getName();
-
- LLFavoriteLandmarkMenuItem::Params item_params;
- item_params.name(item_name);
- item_params.label(item_name);
-
- item_params.on_click.function(boost::bind(&LLFavoritesBarCtrl::onButtonClick, this, item->getUUID()));
- LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
- menu_item->initFavoritesBarPointer(this);
- menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this,item->getUUID(),_1,_2,_3,_4));
- menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
- menu_item->setLandmarkID(item->getUUID());
-
- // Check whether item name wider than menu
- if (menu_item->getNominalWidth() > max_width)
+ for (S32 i = mFirstDropDownItem; i < mItems.count(); i++)
{
- S32 chars_total = item_name.length();
- S32 chars_fitted = 1;
- menu_item->setLabel(LLStringExplicit(""));
- S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
- menu_item->getNominalWidth(); // This returns width of menu item with empty label (pad pixels)
-
- while (chars_fitted < chars_total && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
+ LLViewerInventoryItem* item = mItems.get(i);
+ const std::string& item_name = item->getName();
+
+ LLFavoriteLandmarkMenuItem::Params item_params;
+ item_params.name(item_name);
+ item_params.label(item_name);
+
+ item_params.on_click.function(boost::bind(
+ &LLFavoritesBarCtrl::onButtonClick, this,
+ item->getUUID()));
+ LLFavoriteLandmarkMenuItem *menu_item = LLUICtrlFactory::create<LLFavoriteLandmarkMenuItem>(item_params);
+ menu_item->initFavoritesBarPointer(this);
+ menu_item->setRightMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonRightClick, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseDownCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseDown, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->LLUICtrl::setMouseUpCallback(boost::bind(&LLFavoritesBarCtrl::onButtonMouseUp, this, item->getUUID(), _1, _2, _3, _4));
+ menu_item->setLandmarkID(item->getUUID());
+
+ // Check whether item name wider than menu
+ if (menu_item->getNominalWidth() > max_width)
{
- chars_fitted++;
+ S32 chars_total = item_name.length();
+ S32 chars_fitted = 1;
+ menu_item->setLabel(LLStringExplicit(""));
+ S32 label_space = max_width - menu_item->getFont()->getWidth("...") -
+ menu_item->getNominalWidth();// This returns width of menu item with empty label (pad pixels)
+
+ while (chars_fitted < chars_total
+ && menu_item->getFont()->getWidth(item_name, 0, chars_fitted) < label_space)
+ {
+ chars_fitted++;
+ }
+ chars_fitted--; // Rolling back one char, that doesn't fit
+
+ menu_item->setLabel(item_name.substr(0, chars_fitted)
+ + "...");
}
- chars_fitted--; // Rolling back one char, that doesn't fit
+ widest_item = llmax(widest_item, menu_item->getNominalWidth());
- menu_item->setLabel(item_name.substr(0, chars_fitted) + "...");
+ menu->addChild(menu_item);
}
- widest_item = llmax(widest_item, menu_item->getNominalWidth());
-
- menu->addChild(menu_item);
+ mUpdateDropDownItems = false;
}
menu->buildDrawLabels();
@@ -945,7 +917,6 @@ void LLFavoritesBarCtrl::showDropDownMenu()
menu->setButtonRect(mChevronButton->getRect(), this);
LLMenuGL::showPopup(this, menu, getRect().getWidth() - max_width, 0);
-
}
}
diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h
index b2fe3cc651..9ac734baff 100644
--- a/indra/newview/llfavoritesbar.h
+++ b/indra/newview/llfavoritesbar.h
@@ -74,8 +74,8 @@ public:
void setLandingTab(LLUICtrl* tab) { mLandingTab = tab; }
protected:
- void updateButtons(U32 bar_width);
- void createButtons(const LLInventoryModel::item_array_t &items, const LLXMLNodePtr &root, S32 buttonWidth, S32 buttonHGap);
+ void updateButtons();
+ LLButton* createButton(const LLPointer<LLViewerInventoryItem> item, LLXMLNodePtr &root, S32 x_offset );
LLXMLNodePtr getButtonXMLNode();
BOOL collectFavoriteItems(LLInventoryModel::item_array_t &items);
@@ -101,9 +101,7 @@ protected:
LLUUID mFavoriteFolderId;
const LLFontGL *mFont;
S32 mFirstDropDownItem;
-
- typedef LLDynamicArray<std::string> item_names_array_t;
- item_names_array_t mItemNamesCache;
+ bool mUpdateDropDownItems;
LLUUID mSelectedItemID;
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 9e6ef2fc4d..60f150bd96 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -570,25 +570,12 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data)
{
previewp->resetMotion();
previewp->mPauseRequest = NULL;
- previewp->mPauseButton->setVisible(TRUE);
- previewp->mPauseButton->setEnabled(TRUE);
- previewp->mPlayButton->setVisible(FALSE);
- previewp->mPlayButton->setEnabled(FALSE);
}
else if (avatarp->areAnimationsPaused())
- {
-
+ {
previewp->mPauseRequest = NULL;
- previewp->mPauseButton->setVisible(TRUE);
- previewp->mPauseButton->setEnabled(TRUE);
- previewp->mPlayButton->setVisible(FALSE);
- previewp->mPlayButton->setEnabled(FALSE);
}
-
}
-
-
-
}
//-----------------------------------------------------------------------------
@@ -609,16 +596,9 @@ void LLFloaterAnimPreview::onBtnPause(void* user_data)
if (!avatarp->areAnimationsPaused())
{
previewp->mPauseRequest = avatarp->requestPause();
-
- previewp->mPlayButton->setVisible(TRUE);
- previewp->mPlayButton->setEnabled(TRUE);
- previewp->mPauseButton->setVisible(FALSE);
- previewp->mPauseButton->setEnabled(FALSE);
}
}
}
-
-
}
//-----------------------------------------------------------------------------
@@ -636,10 +616,6 @@ void LLFloaterAnimPreview::onBtnStop(void* user_data)
previewp->resetMotion();
previewp->mPauseRequest = avatarp->requestPause();
}
- previewp->mPlayButton->setVisible(TRUE);
- previewp->mPlayButton->setEnabled(TRUE);
- previewp->mPauseButton->setVisible(FALSE);
- previewp->mPauseButton->setEnabled(FALSE);
}
//-----------------------------------------------------------------------------
@@ -953,18 +929,22 @@ bool LLFloaterAnimPreview::validateLoopOut(const LLSD& data)
//-----------------------------------------------------------------------------
void LLFloaterAnimPreview::refresh()
{
+ // Are we showing the play button (default) or the pause button?
+ bool show_play = true;
if (!mAnimPreview)
{
childShow("bad_animation_text");
+ // play button visible but disabled
mPlayButton->setEnabled(FALSE);
- mPlayButton->setVisible(TRUE);
- mPauseButton->setVisible(FALSE);
mStopButton->setEnabled(FALSE);
childDisable("ok_btn");
}
else
{
childHide("bad_animation_text");
+ // re-enabled in case previous animation was bad
+ mPlayButton->setEnabled(TRUE);
+ mStopButton->setEnabled(TRUE);
LLVOAvatar* avatarp = mAnimPreview->getDummyAvatar();
if (avatarp->isMotionActive(mMotionID))
{
@@ -972,28 +952,25 @@ void LLFloaterAnimPreview::refresh()
LLKeyframeMotion* motionp = (LLKeyframeMotion*)avatarp->findMotion(mMotionID);
if (!avatarp->areAnimationsPaused())
{
+ // animation is playing
if (motionp)
{
F32 fraction_complete = motionp->getLastUpdateTime() / motionp->getDuration();
childSetValue("playback_slider", fraction_complete);
}
-
- mPlayButton->setVisible(FALSE);
- mPauseButton->setVisible(TRUE);
-
+ show_play = false;
}
-
}
else
{
+ // Motion just finished playing
mPauseRequest = avatarp->requestPause();
- //mPlayButton->setVisible(TRUE);
- //mPlayButton->setEnabled(TRUE);
- mStopButton->setEnabled(TRUE); // stop also resets, leave enabled.
}
childEnable("ok_btn");
mAnimPreview->requestUpdate();
}
+ mPlayButton->setVisible(show_play);
+ mPauseButton->setVisible(!show_play);
}
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 66bf5246b0..81322abbf7 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -1526,7 +1526,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
object_count_str = llformat("%d", object_count);
item_params.columns.add().value(object_count_str).font(FONT).column("count");
- item_params.columns.add().value(formatted_time((time_t)most_recent_time)).font(FONT).column("mostrecent");
+ item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
self->mOwnerList->addRow(item_params);
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 16a76723eb..5cfd56193e 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -145,18 +145,21 @@ LLFloaterMediaSettings* LLFloaterMediaSettings::getInstance()
//static
void LLFloaterMediaSettings::apply()
{
- LLSD settings;
- sInstance->mPanelMediaSettingsGeneral->preApply();
- sInstance->mPanelMediaSettingsGeneral->getValues( settings );
- sInstance->mPanelMediaSettingsSecurity->preApply();
- sInstance->mPanelMediaSettingsSecurity->getValues( settings );
- sInstance->mPanelMediaSettingsPermissions->preApply();
- sInstance->mPanelMediaSettingsPermissions->getValues( settings );
- LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
- LLSelectMgr::getInstance()->selectionSetMediaData(settings);
- sInstance->mPanelMediaSettingsGeneral->postApply();
- sInstance->mPanelMediaSettingsSecurity->postApply();
- sInstance->mPanelMediaSettingsPermissions->postApply();
+ if (sInstance->haveValuesChanged())
+ {
+ LLSD settings;
+ sInstance->mPanelMediaSettingsGeneral->preApply();
+ sInstance->mPanelMediaSettingsGeneral->getValues( settings );
+ sInstance->mPanelMediaSettingsSecurity->preApply();
+ sInstance->mPanelMediaSettingsSecurity->getValues( settings );
+ sInstance->mPanelMediaSettingsPermissions->preApply();
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
+ LLSelectMgr::getInstance()->selectionSetMedia( LLTextureEntry::MF_HAS_MEDIA );
+ LLSelectMgr::getInstance()->selectionSetMediaData(settings);
+ sInstance->mPanelMediaSettingsGeneral->postApply();
+ sInstance->mPanelMediaSettingsSecurity->postApply();
+ sInstance->mPanelMediaSettingsPermissions->postApply();
+ }
}
////////////////////////////////////////////////////////////////////////////////
@@ -249,15 +252,6 @@ void LLFloaterMediaSettings::onTabChanged(void* user_data, bool from_click)
LLTabContainer* self = (LLTabContainer*)user_data;
gSavedSettings.setS32("LastMediaSettingsTab", self->getCurrentPanelIndex());
}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLFloaterMediaSettings::enableOkApplyBtns( bool enable )
-{
- childSetEnabled( "OK", enable );
- childSetEnabled( "Apply", enable );
-}
-
////////////////////////////////////////////////////////////////////////////////
//
const std::string LLFloaterMediaSettings::getHomeUrl()
@@ -272,17 +266,25 @@ const std::string LLFloaterMediaSettings::getHomeUrl()
// virtual
void LLFloaterMediaSettings::draw()
{
+ // Set the enabled state of the "Apply" button if values changed
+ childSetEnabled( "Apply", haveValuesChanged() );
+
+ LLFloater::draw();
+}
+
+
+//private
+bool LLFloaterMediaSettings::haveValuesChanged() const
+{
+ bool values_changed = false;
// *NOTE: The code below is very inefficient. Better to do this
// only when data change.
// Every frame, check to see what the values are. If they are not
- // the same as the default media data, enable the OK/Apply buttons
+ // the same as the initial media data, enable the OK/Apply buttons
LLSD settings;
sInstance->mPanelMediaSettingsGeneral->getValues( settings );
sInstance->mPanelMediaSettingsSecurity->getValues( settings );
- sInstance->mPanelMediaSettingsPermissions->getValues( settings );
-
- bool values_changed = false;
-
+ sInstance->mPanelMediaSettingsPermissions->getValues( settings );
LLSD::map_const_iterator iter = settings.beginMap();
LLSD::map_const_iterator end = settings.endMap();
for ( ; iter != end; ++iter )
@@ -295,9 +297,6 @@ void LLFloaterMediaSettings::draw()
break;
}
}
-
- enableOkApplyBtns(values_changed);
-
- LLFloater::draw();
+ return values_changed;
}
diff --git a/indra/newview/llfloatermediasettings.h b/indra/newview/llfloatermediasettings.h
index b72e3d855d..cdfd5aa8ae 100644
--- a/indra/newview/llfloatermediasettings.h
+++ b/indra/newview/llfloatermediasettings.h
@@ -85,7 +85,7 @@ protected:
private:
- void enableOkApplyBtns( bool enable );
+ bool haveValuesChanged() const;
LLSD mInitialValues;
bool mWaitingToClose;
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index bc89f93763..ec50ed596c 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -224,7 +224,6 @@ void LLFloaterOpenObject::callbackMoveInventory(S32 result, void* data)
if (result == 0)
{
- LLFloaterInventory::showAgentInventory();
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
if (active_panel)
{
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index a333868b8c..ff568a11a9 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -313,8 +313,7 @@ F32 LLFloaterPreference::sAspectRatio = 0.0;
LLFloaterPreference::LLFloaterPreference(const LLSD& key)
: LLFloater(key),
mGotPersonalInfo(false),
- mOriginalIMViaEmail(false),
- mCancelOnClose(true)
+ mOriginalIMViaEmail(false)
{
//Build Floater is now Called from LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPreference>);
@@ -588,9 +587,6 @@ void LLFloaterPreference::onOpen(const LLSD& key)
// when the floater is opened. That will make cancel do its
// job
saveSettings();
-
- // This is a "fresh" floater, closing floater shoud cancel any changes
- mCancelOnClose = true;
}
void LLFloaterPreference::onVertexShaderEnable()
@@ -609,7 +605,7 @@ void LLFloaterPreference::onClose(bool app_quitting)
{
gSavedSettings.setS32("LastPrefTab", getChild<LLTabContainer>("pref core")->getCurrentPanelIndex());
LLPanelLogin::setAlwaysRefresh(false);
- if (mCancelOnClose) cancel();
+ cancel();
}
void LLFloaterPreference::onOpenHardwareSettings()
@@ -631,16 +627,10 @@ void LLFloaterPreference::onBtnOK()
if (canClose())
{
+ saveSettings();
apply();
- // Here we do not want to cancel on close, so we do this funny thing
- // that prevents cancel from undoing our changes when we hit OK
- mCancelOnClose = false;
closeFloater(false);
- // closeFloater() will be called when viewer is quitting, leaving mCancelOnClose = true;
- // will cancel all changes we saved here, don't let this happen.
- // Fix for EXT-3465
-
gSavedSettings.saveToFile( gSavedSettings.getString("ClientSettingsFile"), TRUE );
LLUIColorTable::instance().saveUserSettings();
std::string crash_settings_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, CRASH_SETTINGS_FILE);
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index d292f3bb7b..94108cb79a 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -148,7 +148,6 @@ private:
static std::string sSkin;
bool mGotPersonalInfo;
bool mOriginalIMViaEmail;
- bool mCancelOnClose;
bool mOriginalHideOnlineStatus;
std::string mDirectoryVisibility;
diff --git a/indra/newview/llfloatertelehub.cpp b/indra/newview/llfloatertelehub.cpp
index 9841cd2796..816181643f 100644
--- a/indra/newview/llfloatertelehub.cpp
+++ b/indra/newview/llfloatertelehub.cpp
@@ -84,17 +84,6 @@ void LLFloaterTelehub::onOpen(const LLSD& key)
LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
LLToolMgr::getInstance()->getCurrentToolset()->selectTool( LLToolCompTranslate::getInstance() );
- // Find tools floater, glue to bottom
- if (gFloaterTools)
- {
- LLRect tools_rect = gFloaterTools->getRect();
- S32 our_width = getRect().getWidth();
- S32 our_height = getRect().getHeight();
- LLRect our_rect;
- our_rect.setLeftTopAndSize(tools_rect.mLeft, tools_rect.mBottom, our_width, our_height);
- setRect(our_rect);
- }
-
sendTelehubInfoRequest();
mObjectSelection = LLSelectMgr::getInstance()->getEditSelection();
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 7fb71d4d4f..babef5b63d 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -93,7 +93,7 @@
// Globals
LLFloaterTools *gFloaterTools = NULL;
-
+bool LLFloaterTools::sShowObjectCost = true;
const std::string PANEL_NAMES[LLFloaterTools::PANEL_COUNT] =
{
@@ -286,6 +286,8 @@ BOOL LLFloaterTools::postBuild()
mStatusText["grab"] = getString("status_grab");
mStatusText["place"] = getString("status_place");
mStatusText["selectland"] = getString("status_selectland");
+
+ sShowObjectCost = gSavedSettings.getBOOL("ShowObjectRenderingCost");
return TRUE;
}
@@ -425,16 +427,19 @@ void LLFloaterTools::refresh()
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);
+ if (sShowObjectCost)
+ {
+ 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);
+ childSetEnabled("RenderingCost", have_selection && sShowObjectCost);
// Refresh child tabs
mPanelPermissions->refresh();
@@ -566,7 +571,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
mBtnEdit ->setToggleState( edit_visible );
mRadioGroupEdit->setVisible( edit_visible );
bool linked_parts = gSavedSettings.getBOOL("EditLinkedParts");
- childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible));
+ childSetVisible("RenderingCost", !linked_parts && (edit_visible || focus_visible || move_visible) && sShowObjectCost);
if (mCheckSelectIndividual)
{
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index 05a88a31d3..e1f3c9b78c 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -46,7 +46,6 @@ class LLPanelVolume;
class LLPanelContents;
class LLPanelFace;
class LLPanelLandInfo;
-class LLRadioCtrl;
class LLRadioGroup;
class LLSlider;
class LLTabContainer;
@@ -196,6 +195,9 @@ private:
protected:
LLSD mMediaSettings;
+
+public:
+ static bool sShowObjectCost;
};
diff --git a/indra/newview/llfloaterwhitelistentry.cpp b/indra/newview/llfloaterwhitelistentry.cpp
index 04dbd38153..705c8afd00 100644
--- a/indra/newview/llfloaterwhitelistentry.cpp
+++ b/indra/newview/llfloaterwhitelistentry.cpp
@@ -82,6 +82,7 @@ void LLFloaterWhiteListEntry::onBtnOK( void* userdata )
std::string white_list_item = self->mWhiteListEdit->getText();
panel->addWhiteListEntry( white_list_item );
+ panel->updateWhitelistEnableStatus();
};
self->closeFloater();
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 321982ceb6..8b05f8614d 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -331,6 +331,7 @@ BOOL LLFolderView::addFolder( LLFolderViewFolder* folder)
{
mFolders.insert(mFolders.begin(), folder);
}
+ folder->setShowLoadStatus(true);
folder->setOrigin(0, 0);
folder->reshape(getRect().getWidth(), 0);
folder->setVisible(FALSE);
@@ -748,6 +749,12 @@ void LLFolderView::sanitizeSelection()
}
}
}
+
+ // Don't allow invisible items (such as root folders) to be selected.
+ if (item->getDontShowInHierarchy())
+ {
+ items_to_remove.push_back(item);
+ }
}
std::vector<LLFolderViewItem*>::iterator item_it;
@@ -767,7 +774,7 @@ void LLFolderView::sanitizeSelection()
parent_folder;
parent_folder = parent_folder->getParentFolder())
{
- if (parent_folder->potentiallyVisible())
+ if (parent_folder->potentiallyVisible() && !parent_folder->getDontShowInHierarchy())
{
// give initial selection to first ancestor folder that potentially passes the filter
if (!new_selection)
@@ -788,6 +795,11 @@ void LLFolderView::sanitizeSelection()
{
// nothing selected to start with, so pick "My Inventory" as best guess
new_selection = getItemByID(gInventory.getRootFolderID());
+ // ... except if it's hidden from the UI.
+ if (new_selection && new_selection->getDontShowInHierarchy())
+ {
+ new_selection = NULL;
+ }
}
if (new_selection)
@@ -1939,6 +1951,26 @@ LLFolderViewItem* LLFolderView::getItemByID(const LLUUID& id)
return NULL;
}
+LLFolderViewFolder* LLFolderView::getFolderByID(const LLUUID& id)
+{
+ if (id.isNull())
+ {
+ return this;
+ }
+
+ for (folders_t::iterator iter = mFolders.begin();
+ iter != mFolders.end();
+ ++iter)
+ {
+ LLFolderViewFolder *folder = (*iter);
+ if (folder->getListener()->getUUID() == id)
+ {
+ return folder;
+ }
+ }
+ return NULL;
+}
+
bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
{
std::string action = userdata.asString();
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index d18ba385d8..2598af4df4 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -248,6 +248,7 @@ public:
void addItemID(const LLUUID& id, LLFolderViewItem* itemp);
void removeItemID(const LLUUID& id);
LLFolderViewItem* getItemByID(const LLUUID& id);
+ LLFolderViewFolder* getFolderByID(const LLUUID& id);
bool doToSelected(LLInventoryModel* model, const LLSD& userdata);
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index 135821f662..bfd9d6dca7 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -136,7 +136,8 @@ LLFolderViewItem::LLFolderViewItem(LLFolderViewItem::Params p)
mListener(p.listener),
mArrowImage(p.folder_arrow_image),
mBoxImage(p.selection_image),
- mDontShowInHierarchy(false)
+ mDontShowInHierarchy(false),
+ mShowLoadStatus(false)
{
refresh();
}
@@ -198,7 +199,9 @@ LLFolderViewItem* LLFolderViewItem::getPreviousOpenNode(BOOL include_children)
}
LLFolderViewItem* itemp = mParentFolder->getPreviousFromChild( this, include_children );
- while(itemp && !itemp->getVisible())
+
+ // Skip over items that are invisible or are hidden from the UI.
+ while(itemp && (!itemp->getVisible() || itemp->getDontShowInHierarchy()))
{
LLFolderViewItem* next_itemp = itemp->mParentFolder->getPreviousFromChild( itemp, include_children );
if (itemp == next_itemp)
@@ -966,18 +969,18 @@ void LLFolderViewItem::draw()
}
- if ( mIsLoading
- && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime") )
- {
- font->renderUTF8(LLTrans::getString("LoadingData"), 0, text_left, y, sSearchStatusColor,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &right_x, FALSE);
- text_left = right_x;
- }
-
font->renderUTF8( mLabel, 0, text_left, y, color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
S32_MAX, getRect().getWidth() - (S32) text_left, &right_x, TRUE);
+ if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
+ || (LLInventoryModel::backgroundFetchActive() && mShowLoadStatus) )
+ {
+ std::string load_string = " ( " + LLTrans::getString("LoadingData") + " ) ";
+ font->renderUTF8(load_string, 0, right_x, y, sSearchStatusColor,
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, &right_x, FALSE);
+ }
+
if (!mLabelSuffix.empty())
{
font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index 620aa070b9..a43096dcb2 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -163,6 +163,7 @@ protected:
BOOL mIsLoading;
LLTimer mTimeSinceRequestStart;
bool mDontShowInHierarchy;
+ bool mShowLoadStatus;
// helper function to change the selection from the root.
void changeSelectionFromRoot(LLFolderViewItem* selection, BOOL selected);
@@ -254,6 +255,8 @@ public:
BOOL getIsCurSelection() { return mIsCurSelection; }
BOOL hasVisibleChildren() { return mHasVisibleChildren; }
+
+ void setShowLoadStatus(bool status) { mShowLoadStatus = status; }
// Call through to the viewed object and return true if it can be
// removed. Returns true if it's removed.
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 7dc21e6e23..acaa6076f8 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -49,6 +49,7 @@
#include "lllogchat.h"
#include "llpanelimcontrolpanel.h"
#include "llscreenchannel.h"
+#include "llsyswellwindow.h"
#include "lltrans.h"
#include "llchathistory.h"
#include "llviewerwindow.h"
@@ -122,9 +123,13 @@ void LLIMFloater::onFocusReceived()
void LLIMFloater::onClose(bool app_quitting)
{
setTyping(false);
- // SJB: We want the close button to hide the session window, not end it
- // *NOTE: Yhis is functional, but not ideal - it's still closing the floater; we really want to change the behavior of the X button instead.
- //gIMMgr->leaveSession(mSessionID);
+
+ // The source of much argument and design thrashing
+ // Should the window hide or the session close when the X is clicked?
+ //
+ // Last change:
+ // EXT-3516 X Button should end IM session, _ button should hide
+ gIMMgr->leaveSession(mSessionID);
}
/* static */
@@ -339,6 +344,29 @@ void LLIMFloater::onSlide()
//static
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
+ if (!gIMMgr->hasSession(session_id)) return NULL;
+
+ // we should make sure all related chiclets are in place when the session is a voice call
+ // chiclets come firts, then comes IM window
+ if (gIMMgr->isVoiceCall(session_id))
+ {
+ LLIMModel* im_model = LLIMModel::getInstance();
+ LLBottomTray* b_tray = LLBottomTray::getInstance();
+
+ //*TODO hide that into Bottom tray
+ if (!b_tray->getChicletPanel()->findChiclet<LLChiclet>(session_id))
+ {
+ LLIMChiclet* chiclet = b_tray->createIMChiclet(session_id);
+ if(chiclet)
+ {
+ chiclet->setIMSessionName(im_model->getName(session_id));
+ chiclet->setOtherParticipantId(im_model->getOtherParticipantID(session_id));
+ }
+ }
+
+ LLIMWellWindow::getInstance()->addIMRow(session_id);
+ }
+
bool not_existed = true;
if(isChatMultiTab())
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index b50d4674f7..f5362acbfe 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -93,7 +93,8 @@ const static std::string ADHOC_NAME_SUFFIX(" Conference");
std::string LLCallDialogManager::sPreviousSessionlName = "";
std::string LLCallDialogManager::sCurrentSessionlName = "";
LLIMModel::LLIMSession* LLCallDialogManager::sSession = NULL;
-
+LLVoiceChannel::EState LLCallDialogManager::sOldState = LLVoiceChannel::STATE_READY;
+const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-1417BF03DDB4");
//
// Globals
//
@@ -153,7 +154,7 @@ LLIMModel::LLIMModel()
addNewMsgCallback(toast_callback);
}
-LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
: mSessionID(session_id),
mName(name),
mType(type),
@@ -167,7 +168,8 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
mCallBackEnabled(true),
mTextIMPossible(true),
mOtherParticipantIsAvatar(true),
- mStartCallOnInitialize(false)
+ mStartCallOnInitialize(false),
+ mStartedAsIMCall(voice)
{
// set P2P type by default
mSessionType = P2P_SESSION;
@@ -236,13 +238,16 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
{
- // *TODO: remove hardcoded string!!!!!!!!!!!
-
- bool is_p2p_session = dynamic_cast<LLVoiceChannelP2P*>(mVoiceChannel);
- std::string other_avatar_name;
+ std::string you = LLTrans::getString("You");
+ std::string started_call = LLTrans::getString("started_call");
+ std::string joined_call = LLTrans::getString("joined_call");
+ std::string other_avatar_name = "";
- if(is_p2p_session)
+ switch(mSessionType)
{
+ case AVALINE_SESSION:
+ // *TODO: test avaline calls (EXT-2211)
+ case P2P_SESSION:
gCacheName->getFullName(mOtherParticipantID, other_avatar_name);
if(direction == LLVoiceChannel::INCOMING_CALL)
@@ -250,10 +255,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Started a voice call");
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, started_call);
break;
case LLVoiceChannel::STATE_CONNECTED :
- LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Joined the voice call");
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), joined_call);
default:
break;
}
@@ -263,10 +268,10 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- LLIMModel::getInstance()->addMessage(mSessionID, "You", gAgent.getID(), "Started a voice call");
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), started_call);
break;
case LLVoiceChannel::STATE_CONNECTED :
- LLIMModel::getInstance()->addMessage(mSessionID, other_avatar_name, mOtherParticipantID, "Joined the voice call");
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, joined_call);
default:
break;
}
@@ -277,10 +282,45 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
{
mSpeakers->update(true);
}
- }
- else // group || ad-hoc calls
- {
+ break;
+
+ case GROUP_SESSION:
+ case ADHOC_SESSION:
+ // *TODO: determine call starter's name "other_avatar_name" (EXT-2211)
+ // decide how to show notifications for a group/adhoc chat already opened
+ // for now there is no notification from voice channel for this case
+ if(direction == LLVoiceChannel::INCOMING_CALL)
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, other_avatar_name, mOtherParticipantID, started_call);
+ break;
+ case LLVoiceChannel::STATE_CONNECTED :
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), joined_call);
+ default:
+ break;
+ }
+ }
+ else // outgoing call
+ {
+ switch(new_state)
+ {
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ LLIMModel::getInstance()->addMessageSilently(mSessionID, you, gAgent.getID(), started_call);
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Update speakers list when connected
+ if (LLVoiceChannel::STATE_CONNECTED == new_state)
+ {
+ mSpeakers->update(true);
+ }
+ break;
}
}
@@ -452,7 +492,7 @@ void LLIMModel::testMessages()
//session name should not be empty
bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
- const LLUUID& other_participant_id, const std::vector<LLUUID>& ids)
+ const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice)
{
if (name.empty())
{
@@ -466,7 +506,7 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
return false;
}
- LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids);
+ LLIMSession* session = new LLIMSession(session_id, name, type, other_participant_id, ids, voice);
mId2SessionMap[session_id] = session;
LLIMMgr::getInstance()->notifyObserverSessionAdded(session_id, name, other_participant_id);
@@ -475,6 +515,12 @@ bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, co
}
+bool LLIMModel::newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, bool voice)
+{
+ std::vector<LLUUID> no_ids;
+ return newSession(session_id, name, type, other_participant_id, no_ids, voice);
+}
+
bool LLIMModel::clearSession(const LLUUID& session_id)
{
if (mId2SessionMap.find(session_id) == mId2SessionMap.end()) return false;
@@ -574,12 +620,33 @@ bool LLIMModel::proccessOnlineOfflineNotification(
bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
const std::string& utf8_text, bool log2file /* = true */) {
+
+ LLIMSession* session = addMessageSilently(session_id, from, from_id, utf8_text, log2file);
+ if (!session) return false;
+
+ // notify listeners
+ LLSD arg;
+ arg["session_id"] = session_id;
+ arg["num_unread"] = session->mNumUnread;
+ arg["participant_unread"] = session->mParticipantUnreadMessageCount;
+ arg["message"] = utf8_text;
+ arg["from"] = from;
+ arg["from_id"] = from_id;
+ arg["time"] = LLLogChat::timestamp(false);
+ mNewMsgSignal(arg);
+
+ return true;
+}
+
+LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
+ const std::string& utf8_text, bool log2file /* = true */)
+{
LLIMSession* session = findIMSession(session_id);
if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
- return false;
+ return NULL;
}
addToHistory(session_id, from, from_id, utf8_text);
@@ -593,19 +660,7 @@ bool LLIMModel::addMessage(const LLUUID& session_id, const std::string& from, co
++(session->mParticipantUnreadMessageCount);
}
-
- // notify listeners
- LLSD arg;
- arg["session_id"] = session_id;
- arg["num_unread"] = session->mNumUnread;
- arg["participant_unread"] = session->mParticipantUnreadMessageCount;
- arg["message"] = utf8_text;
- arg["from"] = from;
- arg["from_id"] = from_id;
- arg["time"] = LLLogChat::timestamp(false);
- mNewMsgSignal(arg);
-
- return true;
+ return session;
}
@@ -1056,8 +1111,8 @@ public:
|| mInvitiationType == LLIMMgr::INVITATION_TYPE_IMMEDIATE)
&& LLIMModel::getInstance()->findIMSession(mSessionID))
{
- // always open IM window when connecting to voice
- LLIMFloater::show(mSessionID);
+ // TODO remove in 2010, for voice calls we do not open an IM window
+ //LLIMFloater::show(mSessionID);
}
gIMMgr->clearPendingAgentListUpdates(mSessionID);
@@ -1256,19 +1311,54 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
sSession = session;
sSession->mVoiceChannel->setStateChangedCallback(LLCallDialogManager::onVoiceChannelStateChanged);
- sPreviousSessionlName = sCurrentSessionlName;
- sCurrentSessionlName = session->mName;
+ if(sCurrentSessionlName != session->mName)
+ {
+ sPreviousSessionlName = sCurrentSessionlName;
+ sCurrentSessionlName = session->mName;
+ }
+
+ if (LLVoiceChannel::getCurrentVoiceChannel()->getState() == LLVoiceChannel::STATE_CALL_STARTED &&
+ LLVoiceChannel::getCurrentVoiceChannel()->getCallDirection() == LLVoiceChannel::OUTGOING_CALL)
+ {
+
+ //*TODO get rid of duplicated code
+ LLSD mCallDialogPayload;
+ mCallDialogPayload["session_id"] = sSession->mSessionID;
+ mCallDialogPayload["session_name"] = sSession->mName;
+ mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
+ mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+ mCallDialogPayload["state"] = LLVoiceChannel::STATE_CALL_STARTED;
+ mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
+ mCallDialogPayload["session_type"] = sSession->mSessionType;
+
+ LLOutgoingCallDialog* ocd = LLFloaterReg::getTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if(ocd)
+ {
+ ocd->show(mCallDialogPayload);
+ }
+ }
+
}
void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
{
LLSD mCallDialogPayload;
- LLOutgoingCallDialog* ocd;
+ LLOutgoingCallDialog* ocd = NULL;
+
+ if(sOldState == new_state)
+ {
+ return;
+ }
+
+ sOldState = new_state;
mCallDialogPayload["session_id"] = sSession->mSessionID;
mCallDialogPayload["session_name"] = sSession->mName;
mCallDialogPayload["other_user_id"] = sSession->mOtherParticipantID;
mCallDialogPayload["old_channel_name"] = sPreviousSessionlName;
+ mCallDialogPayload["state"] = new_state;
+ mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
+ mCallDialogPayload["session_type"] = sSession->mSessionType;
switch(new_state)
{
@@ -1278,46 +1368,10 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
{
return;
}
-
- 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);
- ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
- ocd->getChild<LLButton>("Cancel")->setVisible(true);
- }
- return;
-
- case LLVoiceChannel::STATE_RINGING :
- ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
- if (ocd)
- {
- ocd->getChild<LLTextBox>("calling")->setVisible(false);
- ocd->getChild<LLTextBox>("leaving")->setVisible(true);
- ocd->getChild<LLTextBox>("connecting")->setVisible(true);
- ocd->getChild<LLTextBox>("noanswer")->setVisible(false);
- ocd->getChild<LLButton>("Cancel")->setVisible(true);
- }
- return;
-
- case LLVoiceChannel::STATE_ERROR :
- mCallDialogPayload["start_timer"] = true;
- 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(false);
- ocd->getChild<LLTextBox>("noanswer")->setVisible(true);
- ocd->getChild<LLButton>("Cancel")->setVisible(false);
- }
- return;
+ break;
case LLVoiceChannel::STATE_CONNECTED :
- case LLVoiceChannel::STATE_HUNG_UP :
- ocd = dynamic_cast<LLOutgoingCallDialog*>(LLFloaterReg::showInstance("outgoing_call", mCallDialogPayload, TRUE));
+ ocd = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
if (ocd)
{
ocd->closeFloater();
@@ -1328,6 +1382,11 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
break;
}
+ ocd = LLFloaterReg::getTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
+ if(ocd)
+ {
+ ocd->show(mCallDialogPayload);
+ }
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1357,12 +1416,13 @@ void LLCallDialog::onOpen(const LLSD& key)
LLOutgoingCallDialog::LLOutgoingCallDialog(const LLSD& payload) :
LLCallDialog(payload)
{
- LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", payload);
+ LLOutgoingCallDialog* instance = LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
if(instance && instance->getVisible())
{
instance->onCancel(instance);
}
}
+
void LLOutgoingCallDialog::draw()
{
if (lifetimeHasExpired())
@@ -1391,10 +1451,14 @@ void LLOutgoingCallDialog::onLifetimeExpired()
closeFloater();
}
-void LLOutgoingCallDialog::onOpen(const LLSD& key)
+void LLOutgoingCallDialog::show(const LLSD& key)
{
- LLCallDialog::onOpen(key);
+ mPayload = key;
+ // hide all text at first
+ hideAllText();
+
+ // customize text strings
// tell the user which voice channel they are leaving
if (!mPayload["old_channel_name"].asString().empty())
{
@@ -1405,6 +1469,12 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
childSetTextArg("leaving", "[CURRENT_CHAT]", getString("localchat"));
}
+ if (!mPayload["disconnected_channel_name"].asString().empty())
+ {
+ childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+ childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+ }
+
std::string callee_name = mPayload["session_name"].asString();
if (callee_name == "anonymous")
{
@@ -1421,12 +1491,48 @@ void LLOutgoingCallDialog::onOpen(const LLSD& key)
// stop timer by default
mLifetimeTimer.stop();
- if(mPayload.has("start_timer"))
+
+ // show only necessary strings and controls
+ switch(mPayload["state"].asInteger())
{
- mLifetimeTimer.reset();
+ case LLVoiceChannel::STATE_CALL_STARTED :
+ getChild<LLTextBox>("calling")->setVisible(true);
+ getChild<LLTextBox>("leaving")->setVisible(true);
+ break;
+ case LLVoiceChannel::STATE_RINGING :
+ getChild<LLTextBox>("leaving")->setVisible(true);
+ getChild<LLTextBox>("connecting")->setVisible(true);
+ break;
+ case LLVoiceChannel::STATE_ERROR :
+ getChild<LLTextBox>("noanswer")->setVisible(true);
+ getChild<LLButton>("Cancel")->setVisible(false);
+ mLifetimeTimer.start();
+ break;
+ case LLVoiceChannel::STATE_HUNG_UP :
+ if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
+ {
+ getChild<LLTextBox>("nearby_P2P")->setVisible(true);
+ }
+ else
+ {
+ getChild<LLTextBox>("nearby")->setVisible(true);
+ }
+ getChild<LLButton>("Cancel")->setVisible(false);
+ mLifetimeTimer.start();
}
+
+ openFloater(LLOutgoingCallDialog::OCD_KEY);
}
+void LLOutgoingCallDialog::hideAllText()
+{
+ getChild<LLTextBox>("calling")->setVisible(false);
+ getChild<LLTextBox>("leaving")->setVisible(false);
+ getChild<LLTextBox>("connecting")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P")->setVisible(false);
+ getChild<LLTextBox>("nearby")->setVisible(false);
+ getChild<LLTextBox>("noanswer")->setVisible(false);
+}
//static
void LLOutgoingCallDialog::onCancel(void* user_data)
@@ -1582,11 +1688,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
if (voice)
{
- if (gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL))
- {
- // always open IM window when connecting to voice
- LLIMFloater::show(session_id);
- }
+ gIMMgr->startCall(session_id, LLVoiceChannel::INCOMING_CALL);
}
gIMMgr->clearPendingAgentListUpdates(session_id);
@@ -1625,11 +1727,7 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
}
}
- LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id);
- if (new_session_id != LLUUID::null)
- {
- LLIMFloater::show(new_session_id);
- }
+ LLUUID new_session_id = gIMMgr->addSession(correct_session_name, type, session_id, true);
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
@@ -1705,11 +1803,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
payload["session_handle"].asString(),
payload["session_uri"].asString());
- if (gIMMgr->startCall(session_id))
- {
- // always open IM window when connecting to voice
- LLIMFloater::show(session_id);
- }
+ gIMMgr->startCall(session_id);
gIMMgr->clearPendingAgentListUpdates(session_id);
gIMMgr->clearPendingInvitation(session_id);
@@ -1719,11 +1813,7 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
LLUUID new_session_id = gIMMgr->addSession(
payload["session_name"].asString(),
type,
- session_id);
- if (new_session_id != LLUUID::null)
- {
- LLIMFloater::show(new_session_id);
- }
+ session_id, true);
std::string url = gAgent.getRegion()->getCapability(
"ChatSessionRequest");
@@ -2018,11 +2108,7 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
const std::string& voice_session_handle,
const std::string& caller_uri)
{
- LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id);
- if (session_id != LLUUID::null)
- {
- LLIMFloater::show(session_id);
- }
+ LLUUID session_id = addSession(name, IM_NOTHING_SPECIAL, other_participant_id, true);
LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
if (speaker_mgr)
@@ -2043,11 +2129,11 @@ LLUUID LLIMMgr::addP2PSession(const std::string& name,
LLUUID LLIMMgr::addSession(
const std::string& name,
EInstantMessage dialog,
- const LLUUID& other_participant_id)
+ const LLUUID& other_participant_id, bool voice)
{
LLDynamicArray<LLUUID> ids;
ids.put(other_participant_id);
- return addSession(name, dialog, other_participant_id, ids);
+ return addSession(name, dialog, other_participant_id, ids, voice);
}
// Adds a session using the given session_id. If the session already exists
@@ -2056,7 +2142,7 @@ LLUUID LLIMMgr::addSession(
const std::string& name,
EInstantMessage dialog,
const LLUUID& other_participant_id,
- const LLDynamicArray<LLUUID>& ids)
+ const LLDynamicArray<LLUUID>& ids, bool voice)
{
if (0 == ids.getLength())
{
@@ -2075,7 +2161,7 @@ LLUUID LLIMMgr::addSession(
if (new_session)
{
- LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids);
+ LLIMModel::getInstance()->newSession(session_id, name, dialog, other_participant_id, ids, voice);
}
@@ -2454,6 +2540,14 @@ bool LLIMMgr::endCall(const LLUUID& session_id)
return true;
}
+bool LLIMMgr::isVoiceCall(const LLUUID& session_id)
+{
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (!im_session) return false;
+
+ return im_session->mStartedAsIMCall;
+}
+
// create a floater and update internal representation for
// consistency. Returns the pointer, caller (the class instance since
// it is a private method) is not responsible for deleting the
@@ -2728,6 +2822,11 @@ public:
{
im_floater->processSessionUpdate(input["body"]["info"]);
}
+ LLIMSpeakerMgr* im_mgr = LLIMModel::getInstance()->getSpeakerManager(session_id);
+ if (im_mgr)
+ {
+ im_mgr->processSessionUpdate(input["body"]["info"]);
+ }
}
};
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index e2fcd63e28..09f0c9df71 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -65,7 +65,7 @@ public:
} SType;
LLIMSession(const LLUUID& session_id, const std::string& name,
- const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids);
+ const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);
virtual ~LLIMSession();
void sessionInitReplyReceived(const LLUUID& new_session_id);
@@ -104,6 +104,9 @@ public:
bool mTextIMPossible;
bool mOtherParticipantIsAvatar;
bool mStartCallOnInitialize;
+
+ //if IM session is created for a voice call
+ bool mStartedAsIMCall;
};
@@ -143,7 +146,10 @@ public:
* @param name session name should not be empty, will return false if empty
*/
bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id,
- const std::vector<LLUUID>& ids = std::vector<LLUUID>());
+ const std::vector<LLUUID>& ids, bool voice = false);
+
+ bool newSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type,
+ const LLUUID& other_participant_id, bool voice = false);
/**
* Remove all session data associated with a session specified by session_id
@@ -163,6 +169,12 @@ public:
bool addMessage(const LLUUID& session_id, const std::string& from, const LLUUID& other_participant_id, const std::string& utf8_text, bool log2file = true);
/**
+ * Similar to addMessage(...) above but won't send a signal about a new message added
+ */
+ LLIMModel::LLIMSession* addMessageSilently(const LLUUID& session_id, const std::string& from, const LLUUID& from_id,
+ const std::string& utf8_text, bool log2file = true);
+
+ /**
* Add a system message to an IM Model
*/
bool proccessOnlineOfflineNotification(const LLUUID& session_id, const std::string& utf8_text);
@@ -284,14 +296,14 @@ public:
// session.
LLUUID addSession(const std::string& name,
EInstantMessage dialog,
- const LLUUID& other_participant_id);
+ const LLUUID& other_participant_id, bool voice = false);
// Adds a session using a specific group of starting agents
// the dialog type is assumed correct. Returns the uuid of the session.
LLUUID addSession(const std::string& name,
EInstantMessage dialog,
const LLUUID& other_participant_id,
- const LLDynamicArray<LLUUID>& ids);
+ const LLDynamicArray<LLUUID>& ids, bool voice = false);
/**
* Creates a P2P session with the requisite handle for responding to voice calls.
@@ -391,6 +403,8 @@ public:
**/
bool endCall(const LLUUID& session_id);
+ bool isVoiceCall(const LLUUID& session_id);
+
private:
/**
@@ -453,6 +467,7 @@ protected:
static std::string sPreviousSessionlName;
static std::string sCurrentSessionlName;
static LLIMModel::LLIMSession* sSession;
+ static LLVoiceChannel::EState sOldState;
};
class LLCallDialog : public LLDockableFloater
@@ -490,14 +505,18 @@ public:
LLOutgoingCallDialog(const LLSD& payload);
/*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& key);
+ void show(const LLSD& key);
static void onCancel(void* user_data);
+ static const LLUUID OCD_KEY;
// check timer state
/*virtual*/ void draw();
private:
+
+ // hide all text boxes
+ void hideAllText();
// lifetime timer for NO_ANSWER notification
LLTimer mLifetimeTimer;
// lifetime duration for NO_ANSWER notification
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index 39114d64b4..dae980feb1 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -115,7 +115,7 @@ private:
void onClickTeleport();
void onClickInviteToGroup();
void onClickPay();
- void onClickBlock();
+ void onToggleMute();
void onClickReport();
void onClickFreeze();
void onClickEject();
@@ -126,6 +126,8 @@ private:
bool onVisibleZoomIn();
void onClickMuteVolume();
void onVolumeChange(const LLSD& data);
+ bool enableMute();
+ bool enableUnmute();
// Is used to determine if "Add friend" option should be enabled in gear menu
bool isNotFriend();
@@ -205,7 +207,7 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
mCommitCallbackRegistrar.add("InspectAvatar.Teleport", boost::bind(&LLInspectAvatar::onClickTeleport, this));
mCommitCallbackRegistrar.add("InspectAvatar.InviteToGroup", boost::bind(&LLInspectAvatar::onClickInviteToGroup, this));
mCommitCallbackRegistrar.add("InspectAvatar.Pay", boost::bind(&LLInspectAvatar::onClickPay, this));
- mCommitCallbackRegistrar.add("InspectAvatar.Block", boost::bind(&LLInspectAvatar::onClickBlock, this));
+ mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
boost::bind(&LLInspectAvatar::onClickFreeze, this));
mCommitCallbackRegistrar.add("InspectAvatar.Eject",
@@ -221,6 +223,8 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
mEnableCallbackRegistrar.add("InspectAvatar.VisibleZoomIn",
boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.EnableMute", boost::bind(&LLInspectAvatar::enableMute, this));
+ mEnableCallbackRegistrar.add("InspectAvatar.EnableUnmute", boost::bind(&LLInspectAvatar::enableUnmute, this));
// can't make the properties request until the widgets are constructed
// as it might return immediately, so do it in postBuild.
@@ -625,10 +629,19 @@ void LLInspectAvatar::onClickPay()
closeFloater();
}
-void LLInspectAvatar::onClickBlock()
+void LLInspectAvatar::onToggleMute()
{
LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);
- LLMuteList::getInstance()->add(mute);
+
+ if (LLMuteList::getInstance()->isMuted(mute.mID, mute.mName))
+ {
+ LLMuteList::getInstance()->remove(mute);
+ }
+ else
+ {
+ LLMuteList::getInstance()->add(mute);
+ }
+
LLPanelBlockedList::showPanelAndSelect(mute.mID);
closeFloater();
}
@@ -663,6 +676,37 @@ void LLInspectAvatar::onClickFindOnMap()
LLFloaterReg::showInstance("world_map");
}
+
+bool LLInspectAvatar::enableMute()
+{
+ bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
+ bool is_self = mAvatarID == gAgent.getID();
+
+ if (!is_linden && !is_self && !LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool LLInspectAvatar::enableUnmute()
+{
+ bool is_linden = LLStringUtil::endsWith(mAvatarName, " Linden");
+ bool is_self = mAvatarID == gAgent.getID();
+
+ if (!is_linden && !is_self && LLMuteList::getInstance()->isMuted(mAvatarID, mAvatarName))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
//////////////////////////////////////////////////////////////////////////////
// LLInspectAvatarUtil
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index e2f9663000..3fc2cbecbe 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -190,12 +190,7 @@ BOOL LLInvFVBridge::isItemRemovable()
{
return TRUE;
}
- if (gAgentWearables.isWearingItem(mUUID))
- {
- return FALSE;
- }
- const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if (avatar && avatar->isWearingAttachment(mUUID))
+ if (get_is_item_worn(mUUID))
{
return FALSE;
}
@@ -506,41 +501,6 @@ void hide_context_entries(LLMenuGL& menu,
}
}
-bool isWornLink(LLUUID link_id)
-{
- LLViewerInventoryItem *link = gInventory.getItem(link_id);
- if (!link)
- return false;
- LLViewerInventoryItem *item = link->getLinkedItem();
- if (!item)
- return false;
-
- switch(item->getType())
- {
- case LLAssetType::AT_OBJECT:
- {
- LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
- if(my_avatar && my_avatar->isWearingAttachment(item->getUUID()))
- return true;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(gAgentWearables.isWearingItem(item->getUUID()))
- return true;
- break;
-
- case LLAssetType::AT_GESTURE:
- if (LLGestureManager::instance().isGestureActive(item->getUUID()))
- return true;
- break;
- default:
- break;
- }
- return false;
-}
-
// Helper for commonly-used entries
void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
std::vector<std::string> &items,
@@ -552,7 +512,7 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (is_sidepanel)
{
// Sidepanel includes restricted menu.
- if (obj && obj->getIsLinkType() && !isWornLink(mUUID))
+ if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
{
items.push_back(std::string("Remove Link"));
}
@@ -606,15 +566,18 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
disabled_items.push_back(std::string("Paste"));
}
- items.push_back(std::string("Paste As Link"));
- if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+ if (gAgent.isGodlike())
{
- disabled_items.push_back(std::string("Paste As Link"));
+ items.push_back(std::string("Paste As Link"));
+ if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ disabled_items.push_back(std::string("Paste As Link"));
+ }
}
items.push_back(std::string("Paste Separator"));
- if (obj && obj->getIsLinkType() && !isWornLink(mUUID))
+ if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
{
items.push_back(std::string("Remove Link"));
}
@@ -973,7 +936,7 @@ bool LLInvFVBridge::isInOutfitsSidePanel() const
dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
if (!outfit_panel)
return false;
- return outfit_panel->isAccordionPanel(my_panel);
+ return outfit_panel->isTabPanel(my_panel);
}
// +=================================================+
@@ -1196,7 +1159,7 @@ LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
// llinfos << "BOLD" << llendl;
font |= LLFontGL::BOLD;
@@ -1339,29 +1302,33 @@ BOOL LLItemBridge::isItemCopyable() const
LLViewerInventoryItem* item = getItem();
if (item)
{
- // can't copy worn objects. DEV-15183
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if( !avatarp )
+ // Can't copy worn objects. DEV-15183
+ if(get_is_item_worn(mUUID))
{
return FALSE;
}
- if(avatarp->isWearingAttachment(mUUID))
+ // You can never copy a link.
+ if (item->getIsLinkType())
{
return FALSE;
}
- // All items can be copied, not all can be pasted.
- // The only time an item can't be copied is if it's a link
- // return (item->getPermissions().allowCopyBy(gAgent.getID()));
- if (item->getIsLinkType())
+ if (gAgent.isGodlike())
{
- return FALSE;
+ // All items can be copied in god mode since you can
+ // at least paste-as-link the item, though you
+ // still may not be able paste the item.
+ return TRUE;
+ }
+ else
+ {
+ return (item->getPermissions().allowCopyBy(gAgent.getID()));
}
- return TRUE;
}
return FALSE;
}
+
BOOL LLItemBridge::copyToClipboard() const
{
if(isItemCopyable())
@@ -1472,10 +1439,7 @@ BOOL LLFolderBridge::isItemRemovable()
return FALSE;
}
- // Allow protected types to be removed, but issue a warning.
- // Restrict to god mode so users don't inadvertently mess up their inventory.
- if(LLFolderType::lookupIsProtectedType(category->getPreferredType()) &&
- !gAgent.isGodlike())
+ if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
{
return FALSE;
}
@@ -1681,23 +1645,10 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
for( i = 0; i < descendent_items.count(); i++ )
{
LLInventoryItem* item = descendent_items[i];
- if( (item->getType() == LLAssetType::AT_CLOTHING) ||
- (item->getType() == LLAssetType::AT_BODYPART) )
+ if (get_is_item_worn(item->getUUID()))
{
- if( gAgentWearables.isWearingItem( item->getUUID() ) )
- {
- is_movable = FALSE; // It's generally movable, but not into the trash!
- break;
- }
- }
- else
- if( item->getType() == LLAssetType::AT_OBJECT )
- {
- if( avatar->isWearingAttachment( item->getUUID() ) )
- {
- is_movable = FALSE; // It's generally movable, but not into the trash!
- break;
- }
+ is_movable = FALSE;
+ break; // It's generally movable, but not into the trash!
}
}
}
@@ -2187,6 +2138,12 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
restoreItem();
return;
}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ else if ("delete_system_folder" == action)
+ {
+ removeSystemFolder();
+ }
+#endif
}
void LLFolderBridge::openItem()
@@ -2310,13 +2267,27 @@ BOOL LLFolderBridge::removeItem()
LLNotification::Params params("ConfirmDeleteProtectedCategory");
params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
- if (LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+ LLNotifications::instance().forceResponse(params, 0);
+ return TRUE;
+}
+
+
+BOOL LLFolderBridge::removeSystemFolder()
+{
+ const LLViewerInventoryCategory *cat = getCategory();
+ if (!LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
- LLNotifications::instance().add(params);
+ return FALSE;
}
- else
+
+ LLSD payload;
+ LLSD args;
+ args["FOLDERNAME"] = cat->getName();
+
+ LLNotification::Params params("ConfirmDeleteProtectedCategory");
+ params.payload(payload).substitutions(args).functor.function(boost::bind(&LLFolderBridge::removeItemResponse, this, _1, _2));
{
- LLNotifications::instance().forceResponse(params, 0);
+ LLNotifications::instance().add(params);
}
return TRUE;
}
@@ -2485,6 +2456,13 @@ void LLFolderBridge::folderOptionsMenu()
}
}
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (LLFolderType::lookupIsProtectedType(type))
+ {
+ mItems.push_back(std::string("Delete System Folder"));
+ }
+#endif
+
// wearables related functionality for folders.
//is_wearable
LLFindWearables is_wearable;
@@ -2496,7 +2474,10 @@ void LLFolderBridge::folderOptionsMenu()
checkFolderForContentsOfType(model, is_object) ||
checkFolderForContentsOfType(model, is_gesture) )
{
- mItems.push_back(std::string("Folder Wearables Separator"));
+ if (!is_sidepanel)
+ {
+ mItems.push_back(std::string("Folder Wearables Separator"));
+ }
// Only enable add/replace outfit for non-default folders.
if (!is_default_folder)
@@ -2509,7 +2490,10 @@ void LLFolderBridge::folderOptionsMenu()
mItems.push_back(std::string("Wear As Ensemble"));
}
mItems.push_back(std::string("Remove From Outfit"));
-
+ if (!areAnyContentsWorn(model))
+ {
+ disabled_items.push_back(std::string("Remove From Outfit"));
+ }
mItems.push_back(std::string("Outfit Separator"));
}
hide_context_entries(*mMenu, mItems, disabled_items);
@@ -2531,6 +2515,35 @@ BOOL LLFolderBridge::checkFolderForContentsOfType(LLInventoryModel* model, LLInv
return ((item_array.count() > 0) ? TRUE : FALSE );
}
+class LLFindWorn : public LLInventoryCollectFunctor
+{
+public:
+ LLFindWorn() {}
+ virtual ~LLFindWorn() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+ {
+ if (item && get_is_item_worn(item->getUUID()))
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+};
+
+BOOL LLFolderBridge::areAnyContentsWorn(LLInventoryModel* model) const
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLFindWorn is_worn;
+ model->collectDescendentsIf(mUUID,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return (item_array.size() > 0);
+}
+
// Flags unused
void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
@@ -2653,6 +2666,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.push_back(std::string("--no options--"));
mDisabledItems.push_back(std::string("--no options--"));
}
+
+ // Preemptively disable system folder removal if more than one item selected.
+ if ((flags & FIRST_SELECTED_ITEM) == 0)
+ {
+ mDisabledItems.push_back(std::string("Delete System Folder"));
+ }
+
hide_context_entries(menu, mItems, mDisabledItems);
}
@@ -2902,6 +2922,9 @@ void saveItemsOrder(LLInventoryModel::item_array_t& items)
item->updateServer(FALSE);
gInventory.updateItem(item);
+
+ // Tell the parent folder to refresh its sort order.
+ gInventory.addChangedMask(LLInventoryObserver::SORT, item->getParentUUID());
}
gInventory.notifyObservers();
@@ -2923,6 +2946,27 @@ LLInventoryModel::item_array_t::iterator findItemByUUID(LLInventoryModel::item_a
return result;
}
+// See also LLInventorySort where landmarks in the Favorites folder are sorted.
+class LLViewerInventoryItemSort
+{
+public:
+ bool operator()(const LLPointer<LLViewerInventoryItem>& a, const LLPointer<LLViewerInventoryItem>& b)
+ {
+ return a->getSortField() < b->getSortField();
+ }
+};
+
+/**
+ * Sorts passed items by LLViewerInventoryItem sort field.
+ *
+ * @param[in, out] items - array of items, not sorted.
+ */
+void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& items)
+{
+ static LLViewerInventoryItemSort sort_functor;
+ std::sort(items.begin(), items.end(), sort_functor);
+}
+
void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& srcItemId, const LLUUID& destItemId)
{
LLViewerInventoryItem* srcItem = gInventory.getItem(srcItemId);
@@ -2971,19 +3015,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if(is_movable && move_is_into_trash)
{
- switch(inv_item->getType())
- {
- case LLAssetType::AT_CLOTHING:
- case LLAssetType::AT_BODYPART:
- is_movable = !gAgentWearables.isWearingItem(inv_item->getUUID());
- break;
-
- case LLAssetType::AT_OBJECT:
- is_movable = !avatar->isWearingAttachment(inv_item->getUUID());
- break;
- default:
- break;
- }
+ is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
}
if ( is_movable )
@@ -2998,8 +3030,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
const LLUUID& favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
- const LLUUID& landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
- const BOOL folder_allows_reorder = ((mUUID == landmarks_id) || (mUUID == favorites_id));
+ const BOOL folder_allows_reorder = (mUUID == favorites_id);
// we can move item inside a folder only if this folder is Favorites. See EXT-719
accept = is_movable && ((mUUID != inv_item->getParentUUID()) || folder_allows_reorder);
@@ -3039,6 +3070,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
LLUUID srcItemId = inv_item->getUUID();
LLUUID destItemId = itemp->getListener()->getUUID();
+ // ensure items are sorted properly before changing order. EXT-3498
+ rearrange_item_order_by_sort_field(items);
+
// update order
updateItemsOrder(items, srcItemId, destItemId);
@@ -4051,8 +4085,7 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar && avatar->isWearingAttachment( mUUID ) )
+ if(get_is_item_worn( mUUID ) )
{
font |= LLFontGL::BOLD;
}
@@ -4068,9 +4101,9 @@ LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
std::string LLObjectBridge::getLabelSuffix() const
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar && avatar->isWearingAttachment( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
+ LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
// e.g. "(worn on ...)" / "(attached to ...)"
@@ -4195,12 +4228,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
return;
}
- if( avatarp->isWearingAttachment( mUUID ) )
+ if( get_is_item_worn( mUUID ) )
{
items.push_back(std::string("Detach From Yourself"));
}
- else
- if( !isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
+ else if (!isInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
{
items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Object Wear"));
@@ -4426,7 +4458,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
if (gAgent.isTeen() && item->isWearableType() &&
(item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))
continue;
- if( gAgentWearables.isWearingItem (item->getLinkedUUID()) )
+ if (get_is_item_worn(item->getUUID()))
{
LLWearableList::instance().getAsset(item->getAssetUUID(),
item->getName(),
@@ -4442,18 +4474,21 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
for(i = 0; i < obj_count; ++i)
{
LLViewerInventoryItem *obj_item = obj_item_array.get(i);
- gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
- gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
- gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
- gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
-
- 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( obj_item->getLinkedUUID());
- if (found_obj)
+ if (get_is_item_worn(obj_item->getUUID()))
{
- LLSelectMgr::getInstance()->remove(found_obj);
+ gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData );
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ gMessageSystem->addUUIDFast(_PREHASH_ItemID, obj_item->getLinkedUUID() );
+
+ 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( obj_item->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ }
}
}
}
@@ -4463,7 +4498,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
for(i = 0; i < gest_count; ++i)
{
LLViewerInventoryItem *gest_item = gest_item_array.get(i);
- if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) )
+ if (get_is_item_worn(gest_item->getUUID()))
{
LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
gInventory.updateItem( gest_item );
@@ -4477,7 +4512,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
BOOL LLWearableBridge::renameItem(const std::string& new_name)
{
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
gAgentWearables.setWearableName( mUUID, new_name );
}
@@ -4486,7 +4521,7 @@ BOOL LLWearableBridge::renameItem(const std::string& new_name)
std::string LLWearableBridge::getLabelSuffix() const
{
- if( gAgentWearables.isWearingItem( mUUID ) )
+ if (get_is_item_worn(mUUID))
{
// e.g. "(worn)"
return LLItemBridge::getLabelSuffix() + LLTrans::getString("worn");
@@ -4520,7 +4555,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
}
else if (isRemoveAction(action))
{
- if(gAgentWearables.isWearingItem(mUUID))
+ if (get_is_item_worn(mUUID))
{
LLViewerInventoryItem* item = getItem();
if (item)
@@ -4551,7 +4586,7 @@ void LLWearableBridge::openItem()
}
else if(isAgentInventory())
{
- if( !gAgentWearables.isWearingItem( mUUID ) )
+ if( !get_is_item_worn( mUUID ) )
{
wearOnAvatar();
}
@@ -4651,7 +4686,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
case LLAssetType::AT_CLOTHING:
items.push_back(std::string("Take Off"));
case LLAssetType::AT_BODYPART:
- if (gAgentWearables.isWearingItem(item->getUUID()))
+ if (get_is_item_worn(item->getUUID()))
{
disabled_items.push_back(std::string("Wearable Wear"));
disabled_items.push_back(std::string("Wearable Add"));
@@ -4682,7 +4717,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
if(!item || !item->isComplete()) return FALSE;
}
- return (!gAgentWearables.isWearingItem(self->mUUID));
+ return (!get_is_item_worn(self->mUUID));
}
// Called from menus
@@ -4814,7 +4849,7 @@ BOOL LLWearableBridge::canEditOnAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return FALSE;
- return (gAgentWearables.isWearingItem(self->mUUID));
+ return (get_is_item_worn(self->mUUID));
}
// static
@@ -4851,7 +4886,7 @@ BOOL LLWearableBridge::canRemoveFromAvatar(void* user_data)
LLWearableBridge* self = (LLWearableBridge*)user_data;
if( self && (LLAssetType::AT_BODYPART != self->mAssetType) )
{
- return gAgentWearables.isWearingItem( self->mUUID );
+ return get_is_item_worn( self->mUUID );
}
return FALSE;
}
@@ -4861,7 +4896,7 @@ void LLWearableBridge::onRemoveFromAvatar(void* user_data)
{
LLWearableBridge* self = (LLWearableBridge*)user_data;
if(!self) return;
- if(gAgentWearables.isWearingItem(self->mUUID))
+ if(get_is_item_worn(self->mUUID))
{
LLViewerInventoryItem* item = self->getItem();
if (item)
@@ -4884,7 +4919,7 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
const LLUUID &item_id = gInventory.getLinkedItemID(on_remove_struct->mUUID);
if(wearable)
{
- if( gAgentWearables.isWearingItem( item_id ) )
+ if( get_is_item_worn( item_id ) )
{
EWearableType type = wearable->getType();
@@ -5094,8 +5129,9 @@ void LLAnimationBridgeAction::doIt()
//virtual
void LLObjectBridgeAction::doIt()
{
+ /*
LLFloaterReg::showInstance("properties", mUUID);
-
+ */
LLInvFVBridgeAction::doIt();
}
@@ -5167,7 +5203,7 @@ void LLWearableBridgeAction::doIt()
}
else if(isAgentInventory())
{
- if(!gAgentWearables.isWearingItem(mUUID))
+ if(!get_is_item_worn(mUUID))
{
wearOnAvatar();
}
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 117e32c6be..4d83e9b684 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -292,7 +292,9 @@ public:
static LLUIImagePtr getIcon(LLFolderType::EType preferred_type);
virtual BOOL renameItem(const std::string& new_name);
+
virtual BOOL removeItem();
+ BOOL removeSystemFolder();
bool removeItemResponse(const LLSD& notification, const LLSD& response);
virtual void pasteFromClipboard();
@@ -339,6 +341,7 @@ protected:
static void createNewEyes(void* user_data);
BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
+ BOOL areAnyContentsWorn(LLInventoryModel* model) const;
void modifyOutfit(BOOL append);
void determineFolderType();
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 522edd0cb5..b4dcb566e4 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -218,6 +218,7 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const
BOOL LLInventoryFilter::isNotDefault() const
{
return mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes
+ || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
|| mFilterSubString.size()
|| mFilterOps.mPermissions != mDefaultFilterOps.mPermissions
|| mFilterOps.mMinDate != mDefaultFilterOps.mMinDate
@@ -227,7 +228,8 @@ BOOL LLInventoryFilter::isNotDefault() const
BOOL LLInventoryFilter::isActive() const
{
- return mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL
+ return mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL
+ || mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
|| mFilterSubString.size()
|| mFilterOps.mPermissions != PERM_NONE
|| mFilterOps.mMinDate != time_min()
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index 5ca77cb26a..b01554edc8 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -162,8 +162,8 @@ private:
FilterOps();
U32 mFilterTypes;
- U64 mFilterObjectTypes; // For _ITEM
- U64 mFilterCategoryTypes; // For _ITEM
+ U64 mFilterObjectTypes; // For _OBJECT
+ U64 mFilterCategoryTypes; // For _CATEGORY
LLUUID mFilterUUID; // for UUID
time_t mMinDate;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 75218e98e0..8f4136c01f 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -338,3 +338,33 @@ LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
const std::string& icon_name = get_item_icon_name(asset_type, inventory_type, attachment_point, item_is_multi );
return LLUI::getUIImage(icon_name);
}
+
+BOOL get_is_item_worn(const LLUUID& id)
+{
+ const LLViewerInventoryItem* item = gInventory.getItem(id);
+ if (!item)
+ return FALSE;
+
+ switch(item->getType())
+ {
+ case LLAssetType::AT_OBJECT:
+ {
+ const LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
+ if(my_avatar && my_avatar->isWearingAttachment(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ }
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_CLOTHING:
+ if(gAgentWearables.isWearingItem(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ case LLAssetType::AT_GESTURE:
+ if (LLGestureManager::instance().isGestureActive(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 9916a2351c..968db84819 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -41,7 +41,9 @@
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// This is a collection of miscellaneous functions and classes
-// that don't fit cleanly into any other class header.
+// that don't fit cleanly into any other class header. Eventually,
+// we should figure out where to put these functions so that we can
+// get rid of this generic file.
//
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -98,14 +100,17 @@ public:
};
const std::string& get_item_icon_name(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi );
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi );
LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi );
+ LLInventoryType::EType inventory_type,
+ U32 attachment_point,
+ BOOL item_is_multi );
+
+// Is this item or its baseitem is worn, attached, etc...
+BOOL get_is_item_worn(const LLUUID& id);
#endif // LL_LLINVENTORYFUNCTIONS_H
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 99e6dbe3c8..c1f192e2bf 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -62,6 +62,7 @@ public:
STRUCTURE = 16, // structural change (eg item or folder moved)
CALLING_CARD = 32, // (eg online, grant status, cancel)
REBUILD = 64, // item UI changed (eg item type different)
+ SORT = 128, // folder needs to be resorted.
ALL = 0xffffffff
};
LLInventoryObserver();
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 92b9dc427f..3c34ba32e2 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -278,6 +278,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
const LLUUID& item_id = (*items_iter);
const LLInventoryObject* model_item = model->getObject(item_id);
LLFolderViewItem* view_item = mFolders->getItemByID(item_id);
+ LLFolderViewFolder* view_folder = mFolders->getFolderByID(item_id);
//////////////////////////////
// LABEL Operation
@@ -320,7 +321,18 @@ void LLInventoryPanel::modelChanged(U32 mask)
view_item->refresh();
}
}
-
+
+ //////////////////////////////
+ // SORT Operation
+ // Sort the folder.
+ if (mask & LLInventoryObserver::SORT)
+ {
+ if (view_folder)
+ {
+ view_folder->requestSort();
+ }
+ }
+
// We don't typically 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
@@ -385,16 +397,6 @@ void LLInventoryPanel::modelChanged(U32 mask)
}
}
}
-
- /* I don't think we need this code, but not positive -- Seraph
- if (!handled)
- {
- // It's a small change that only requires a refresh.
- // *TODO: figure out a more efficient way to do the refresh
- // since it is expensive on large inventories
- mFolders->refresh();
- }
- */
}
// static
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 7d3da152c1..2dc9f255d7 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -189,7 +189,7 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
bool LLLoginInstance::handleLoginEvent(const LLSD& event)
{
- LL_DEBUGS("Login") << "LoginListener called!: \n" << event << LL_ENDL;
+ LL_DEBUGS("LLLogin") << "LoginListener called!: \n" << event << LL_ENDL;
if(!(event.has("state") && event.has("change") && event.has("progress")))
{
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index f32866b1fe..199bd966ef 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -95,7 +95,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mHidingInitialLoad (false),
mDecoupleTextureSize ( false ),
mTextureWidth ( 1024 ),
- mTextureHeight ( 1024 )
+ mTextureHeight ( 1024 ),
+ mClearCache(false)
{
{
LLColor4 color = p.caret_color().get();
@@ -491,6 +492,21 @@ void LLMediaCtrl::clr404RedirectUrl()
////////////////////////////////////////////////////////////////////////////////
//
+void LLMediaCtrl::clearCache()
+{
+ if(mMediaSource)
+ {
+ mMediaSource->clearCache();
+ }
+ else
+ {
+ mClearCache = true;
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
void LLMediaCtrl::navigateTo( std::string url_in, std::string mime_type)
{
// don't browse to anything that starts with secondlife:// or sl://
@@ -617,7 +633,12 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->setHomeURL(mHomePageUrl);
mMediaSource->setVisible( getVisible() );
mMediaSource->addObserver( this );
-
+ if(mClearCache)
+ {
+ mMediaSource->clearCache();
+ mClearCache = false;
+ }
+
if(mHideLoading)
{
mHidingInitialLoad = true;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index f07513a3fd..8f9e6e7179 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -117,6 +117,9 @@ public:
// set/clear URL to visit when a 404 page is reached
void set404RedirectUrl( std::string redirect_url );
void clr404RedirectUrl();
+
+ // Clear the browser cache when the instance gets loaded
+ void clearCache();
// accessor/mutator for flag that indicates if frequent updates to texture happen
bool getFrequentUpdates() { return mFrequentUpdates; };
@@ -192,6 +195,7 @@ public:
bool mDecoupleTextureSize;
S32 mTextureWidth;
S32 mTextureHeight;
+ bool mClearCache;
};
#endif // LL_LLMediaCtrl_H
diff --git a/indra/newview/llmediadataclient.cpp b/indra/newview/llmediadataclient.cpp
index 91064eea6b..2bb2a3da6f 100755
--- a/indra/newview/llmediadataclient.cpp
+++ b/indra/newview/llmediadataclient.cpp
@@ -224,7 +224,7 @@ bool LLMediaDataClient::processQueueTimer()
if(!isEmpty())
{
- LL_INFOS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is: " << mSortedQueue.size()
+ LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue size is: " << mSortedQueue.size()
<< ", RR queue size is: " << mRoundRobinQueue.size() << LL_ENDL;
LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, SORTED queue is: " << mSortedQueue << LL_ENDL;
LL_DEBUGS("LLMediaDataClient") << "QueueTimer::tick() started, RR queue is: " << mRoundRobinQueue << LL_ENDL;
@@ -262,7 +262,7 @@ void LLMediaDataClient::sortQueue()
if (size > mMaxSortedQueueSize)
{
U32 num_to_cull = (size - mMaxSortedQueueSize);
- LL_INFOS("LLMediaDataClient") << "sorted queue MAXED OUT! Culling "
+ LL_INFOS_ONCE("LLMediaDataClient") << "sorted queue MAXED OUT! Culling "
<< num_to_cull << " items" << LL_ENDL;
while (num_to_cull-- > 0)
{
@@ -309,7 +309,7 @@ void LLMediaDataClient::serviceQueue()
{
if (request.isNull())
{
- LL_INFOS("LLMediaDataClient") << "Skipping NULL request" << LL_ENDL;
+ LL_WARNS("LLMediaDataClient") << "Skipping NULL request" << LL_ENDL;
}
else {
LL_INFOS("LLMediaDataClient") << "Skipping : " << *request << " "
@@ -636,8 +636,8 @@ void LLMediaDataClient::Responder::error(U32 status, const std::string& reason)
new RetryTimer(F32(retry_timeout/*secs*/), this);
}
else {
- LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retry count " <<
- mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL;
+ LL_INFOS("LLMediaDataClient") << *mRequest << " got SERVICE_UNAVAILABLE...retry count "
+ << mRequest->getRetryCount() << " exceeds " << mRequest->getMaxNumRetries() << ", not retrying" << LL_ENDL;
}
}
else {
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index cdab3b2310..6210151d1b 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -261,9 +261,14 @@ BOOL LLNavigationBar::postBuild()
void LLNavigationBar::setVisible(BOOL visible)
{
// change visibility of grandparent layout_panel to animate in and out
- if (getParent() && getParent()->getParent())
+ if (getParent())
{
- getParent()->getParent()->setVisible(visible);
+ //to avoid some mysterious bugs like EXT-3352, at least try to log an incorrect parent to ping about a problem.
+ if(getParent()->getName() != "nav_bar_container")
+ {
+ LL_WARNS("LLNavigationBar")<<"NavigationBar has an unknown name of the parent: "<<getParent()->getName()<< LL_ENDL;
+ }
+ getParent()->setVisible(visible);
}
}
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 39381e3faa..fa16cb6473 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -243,7 +243,8 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
}
else
{
- setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId));
+ // check only blocking on voice. EXT-3542
+ setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
LLMuteList::getInstance()->addObserver(this);
}
}
@@ -251,5 +252,6 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
void LLOutputMonitorCtrl::onChange()
{
- setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId));
+ // check only blocking on voice. EXT-3542
+ setIsMuted(LLMuteList::getInstance()->isMuted(mSpeakerId, LLMute::flagVoiceChat));
}
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index 4f76d32ad5..70e4798079 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -194,6 +194,7 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
childSetEnabled("pay_btn", FALSE);
getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
+ getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName);
}
else
{
@@ -217,6 +218,7 @@ void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::str
avatar_name.append(" ");
avatar_name.append(last);
getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
+ getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
}
}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 35cd3edc81..e16bac2098 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -233,11 +233,6 @@ void LLLandmarksPanel::onSelectionChange(LLInventorySubTreePanel* inventory_list
deselectOtherThan(inventory_list);
mCurrentSelectedList = inventory_list;
}
-
- LLFolderViewItem* current_item = inventory_list->getRootFolder()->getCurSelectedItem();
- if (!current_item)
- return;
-
updateVerbs();
}
@@ -246,6 +241,7 @@ void LLLandmarksPanel::onSelectorButtonClicked()
// TODO: mantipov: update getting of selected item
// TODO: bind to "i" button
LLFolderViewItem* cur_item = mFavoritesInventoryPanel->getRootFolder()->getCurSelectedItem();
+ if (!cur_item) return;
LLFolderViewEventListener* listenerp = cur_item->getListener();
if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
@@ -334,6 +330,7 @@ void LLLandmarksPanel::processParcelInfo(const LLParcelData& parcel_data)
if(isLandmarkSelected())
{
LLFolderViewItem* cur_item = getCurSelectedItem();
+ if (!cur_item) return;
LLUUID id = cur_item->getListener()->getUUID();
LLInventoryItem* inv_item = mCurrentSelectedList->getModel()->getItem(id);
doActionOnCurSelectedLandmark(boost::bind(
@@ -761,7 +758,7 @@ void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
{
LLFolderViewItem* cur_item = getCurSelectedItem();
if(!cur_item)
- return ;
+ return;
std::string command_name = userdata.asString();
if("more_info" == command_name)
{
@@ -865,18 +862,18 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
// then ask LLFolderView permissions
if (can_be_modified)
{
- LLFolderViewItem* selected = getCurSelectedItem();
+ LLFolderViewItem* selected = getCurSelectedItem();
if ("cut" == command_name)
{
can_be_modified = mCurrentSelectedList->getRootFolder()->canCut();
}
else if ("rename" == command_name)
{
- can_be_modified = selected? selected->getListener()->isItemRenameable() : false;
+ can_be_modified = selected ? selected->getListener()->isItemRenameable() : false;
}
else if ("delete" == command_name)
{
- can_be_modified = selected? selected->getListener()->isItemRemovable(): false;
+ can_be_modified = selected ? selected->getListener()->isItemRemovable(): false;
}
else if("paste" == command_name)
{
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index 771e34e6cc..cdfa64ba57 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -248,7 +248,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
childSetAction("connect_btn", onClickConnect, this);
- getChild<LLPanel>("login_widgets")->setDefaultBtn("connect_btn");
+ getChild<LLPanel>("login")->setDefaultBtn("connect_btn");
std::string channel = gSavedSettings.getString("VersionChannelName");
std::string version = llformat("%s (%d)",
@@ -272,6 +272,9 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
// get the web browser control
LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("login_html");
web_browser->addObserver(this);
+
+ // Clear the browser's cache to avoid any potential for the cache messing up the login screen.
+ web_browser->clearCache();
// Need to handle login secondlife:///app/ URLs
web_browser->setTrusted( true );
@@ -676,12 +679,8 @@ void LLPanelLogin::refreshLocation( bool force_visible )
sInstance->childSetVisible("start_location_combo", show_start);
sInstance->childSetVisible("start_location_text", show_start);
-#if LL_RELEASE_FOR_DOWNLOAD
BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
sInstance->childSetVisible("server_combo", show_server);
-#else
- sInstance->childSetVisible("server_combo", TRUE);
-#endif
#endif
}
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index c0da8f3daa..961d3dec8b 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -400,6 +400,7 @@ void LLPanelMainInventory::onClearSearch()
mActivePanel->getRootFolder()->applyFunctorRecursively(opener);
mActivePanel->getRootFolder()->scrollToShowSelection();
}
+ mFilterSubString = "";
}
void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
@@ -417,6 +418,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
std::string uppercase_search_string = search_string;
LLStringUtil::toUpper(uppercase_search_string);
+ mFilterSubString = uppercase_search_string;
if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
{
// current filter and new filter empty, do nothing
@@ -431,7 +433,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
}
// set new filter string
- mActivePanel->setFilterSubString(uppercase_search_string);
+ mActivePanel->setFilterSubString(mFilterSubString);
}
@@ -484,6 +486,7 @@ void LLPanelMainInventory::onFilterSelected()
{
return;
}
+ setFilterSubString(mFilterSubString);
LLInventoryFilter* filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
if (finder)
@@ -542,7 +545,7 @@ void LLPanelMainInventory::draw()
{
if (mActivePanel && mFilterEditor)
{
- mFilterEditor->setText(mActivePanel->getFilterSubString());
+ mFilterEditor->setText(mFilterSubString);
}
LLPanel::draw();
}
@@ -1016,9 +1019,11 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
const LLUUID& item_id = current_item->getListener()->getUUID();
const std::string &item_name = current_item->getListener()->getName();
+ mFilterSubString = item_name;
LLInventoryFilter *filter = mActivePanel->getFilter();
filter->setFilterSubString(item_name);
mFilterEditor->setText(item_name);
+
mFilterEditor->setFocus(TRUE);
filter->setFilterUUID(item_id);
filter->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index 920de2665c..69f8a14583 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -123,6 +123,7 @@ private:
LLInventoryPanel* mActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;
+ std::string mFilterSubString;
//////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingssecurity.cpp b/indra/newview/llpanelmediasettingssecurity.cpp
index aea6b0aa3b..81842e3851 100644
--- a/indra/newview/llpanelmediasettingssecurity.cpp
+++ b/indra/newview/llpanelmediasettingssecurity.cpp
@@ -323,7 +323,7 @@ void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
else
{
row[ "columns" ][ ICON_COLUMN ][ "type" ] = "icon";
- row[ "columns" ][ ICON_COLUMN ][ "value" ] = "parcel_color_EXP";
+ row[ "columns" ][ ICON_COLUMN ][ "value" ] = "Parcel_Exp_Color";
row[ "columns" ][ ICON_COLUMN ][ "width" ] = 20;
};
@@ -333,9 +333,6 @@ void LLPanelMediaSettingsSecurity::addWhiteListEntry( const std::string& entry )
// add to the white list scroll box
mWhiteListList->addElement( row );
-
- // update whitelist enable checkbox based on whether the home url passes the whitelist
- updateWhitelistEnableStatus();
};
///////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelmediasettingssecurity.h b/indra/newview/llpanelmediasettingssecurity.h
index 937bfb1bf9..66ccb23f46 100644
--- a/indra/newview/llpanelmediasettingssecurity.h
+++ b/indra/newview/llpanelmediasettingssecurity.h
@@ -63,7 +63,9 @@ public:
void setParent( LLFloaterMediaSettings* parent );
bool urlPassesWhiteList( const std::string& test_url );
const std::string makeValidUrl( const std::string& src_url );
-
+
+ void updateWhitelistEnableStatus();
+
protected:
LLFloaterMediaSettings* mParent;
@@ -78,8 +80,6 @@ private:
LLScrollListCtrl* mWhiteListList;
LLTextBox* mHomeUrlFailsWhiteListText;
- void updateWhitelistEnableStatus();
-
static void onBtnAdd(void*);
static void onBtnDel(void*);
};
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index 4511bca23a..8e14074de1 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -56,7 +56,10 @@
#include "llmenugl.h"
#include "llviewermenu.h"
+#include "llviewercontrol.h"
+
static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
+bool LLPanelOutfitsInventory::sShowDebugEditor = false;
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
mActivePanel(NULL),
@@ -74,18 +77,24 @@ LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
// virtual
BOOL LLPanelOutfitsInventory::postBuild()
{
-
- initAccordionPanels();
+ sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor");
+ initTabPanels();
initListCommandsHandlers();
+
return TRUE;
}
-void LLPanelOutfitsInventory::updateParent()
+void LLPanelOutfitsInventory::updateVerbs()
{
if (mParent)
{
mParent->updateVerbs();
}
+
+ if (mListCommands)
+ {
+ mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
+ }
}
void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
@@ -96,6 +105,7 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
// virtual
void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
{
+ mFilterSubString = string;
if (string == "")
{
mActivePanel->setFilterSubString(LLStringUtil::null);
@@ -127,7 +137,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
mActivePanel->setFilterSubString(string);
}
-void LLPanelOutfitsInventory::onWear()
+void LLPanelOutfitsInventory::onWearButtonClick()
{
LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
if (listenerp)
@@ -167,7 +177,7 @@ void LLPanelOutfitsInventory::onNew()
void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
updateListCommands();
- updateParent();
+ updateVerbs();
if (getRootFolder()->needsAutoRename() && items.size())
{
getRootFolder()->startRenamingSelectedItem();
@@ -177,7 +187,6 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewIte
void LLPanelOutfitsInventory::onSelectorButtonClicked()
{
- /*
LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();
LLFolderViewEventListener* listenerp = cur_item->getListener();
@@ -189,7 +198,6 @@ void LLPanelOutfitsInventory::onSelectorButtonClicked()
LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
}
- */
}
LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
@@ -233,14 +241,17 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
- mListCommands->childSetAction("add_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+ mListCommands->childSetAction("make_outfit_btn", boost::bind(&LLPanelOutfitsInventory::onAddButtonClick, this));
+ mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
+
+ mListCommands->childSetAction("look_edit_btn", boost::bind(&LLPanelOutfitsInventory::onSelectorButtonClicked, this));
LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
trash_btn->setDragAndDropHandler(boost::bind(&LLPanelOutfitsInventory::handleDragAndDropToTrash, this
- , _4 // BOOL drop
- , _5 // EDragAndDropType cargo_type
- , _7 // EAcceptance* accept
- ));
+ , _4 // BOOL drop
+ , _5 // EDragAndDropType cargo_type
+ , _7 // EAcceptance* accept
+ ));
mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action",
boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2));
@@ -252,8 +263,10 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
void LLPanelOutfitsInventory::updateListCommands()
{
bool trash_enabled = isActionEnabled("delete");
+ bool wear_enabled = isActionEnabled("wear");
mListCommands->childSetEnabled("trash_btn", trash_enabled);
+ mListCommands->childSetEnabled("wear_btn", wear_enabled);
}
void LLPanelOutfitsInventory::onGearButtonClick()
@@ -308,7 +321,7 @@ void LLPanelOutfitsInventory::onCustomAction(const LLSD& userdata)
}
if (command_name == "wear")
{
- onWear();
+ onWearButtonClick();
}
if (command_name == "add")
{
@@ -407,41 +420,45 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
-// Accordion //
+// Tab panels //
-void LLPanelOutfitsInventory::initAccordionPanels()
+void LLPanelOutfitsInventory::initTabPanels()
{
- mAccordionPanels.resize(2);
+ mTabPanels.resize(2);
LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>("outfitslist_accordionpanel");
myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mAccordionPanels[0] = myoutfits_panel;
+ mTabPanels[0] = myoutfits_panel;
mActivePanel = myoutfits_panel;
+
LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>("cof_accordionpanel");
cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mAccordionPanels[1] = cof_panel;
+ mTabPanels[1] = cof_panel;
- for (accordionpanels_vec_t::iterator iter = mAccordionPanels.begin();
- iter != mAccordionPanels.end();
+ for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
+ iter != mTabPanels.end();
++iter)
{
LLInventoryPanel *panel = (*iter);
- panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onAccordionSelectionChange, this, panel, _1, _2));
+ panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));
}
+
+ mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
+ mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
}
-void LLPanelOutfitsInventory::onAccordionSelectionChange(LLInventoryPanel* accordion_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
if (user_action && items.size() > 0)
{
- for (accordionpanels_vec_t::iterator iter = mAccordionPanels.begin();
- iter != mAccordionPanels.end();
+ for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
+ iter != mTabPanels.end();
++iter)
{
LLInventoryPanel *panel = (*iter);
- if (panel == accordion_panel)
+ if (panel == tab_panel)
{
mActivePanel = panel;
}
@@ -454,15 +471,28 @@ void LLPanelOutfitsInventory::onAccordionSelectionChange(LLInventoryPanel* accor
onSelectionChange(items, user_action);
}
+void LLPanelOutfitsInventory::onTabChange()
+{
+ mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs");
+ if (!mActivePanel)
+ {
+ return;
+ }
+ mActivePanel->setFilterSubString(mFilterSubString);
+
+ bool is_my_outfits = (mActivePanel->getName() == "outfitslist_accordionpanel");
+ mListCommands->childSetEnabled("make_outfit_btn", is_my_outfits);
+}
+
LLInventoryPanel* LLPanelOutfitsInventory::getActivePanel()
{
return mActivePanel;
}
-bool LLPanelOutfitsInventory::isAccordionPanel(LLInventoryPanel *panel)
+bool LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel)
{
- for(accordionpanels_vec_t::iterator it = mAccordionPanels.begin();
- it != mAccordionPanels.end();
+ for(tabpanels_vec_t::iterator it = mTabPanels.begin();
+ it != mTabPanels.end();
++it)
{
if (*it == panel)
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index afeaef485d..1e084750a0 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -44,6 +44,7 @@ class LLSaveFolderState;
class LLButton;
class LLMenuGL;
class LLSidepanelAppearance;
+class LLTabContainer;
class LLPanelOutfitsInventory : public LLPanel
{
@@ -54,7 +55,6 @@ public:
/*virtual*/ BOOL postBuild();
void onSearchEdit(const std::string& string);
- void onWear();
void onAdd();
void onRemove();
void onEdit();
@@ -71,29 +71,32 @@ public:
LLFolderView* getRootFolder();
protected:
- void updateParent();
+ void updateVerbs();
bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
private:
LLSidepanelAppearance* mParent;
LLSaveFolderState* mSavedFolderState;
+ LLTabContainer* mAppearanceTabs;
+ std::string mFilterSubString;
public:
//////////////////////////////////////////////////////////////////////////////////
- // Accordion //
+ // tab panels
LLInventoryPanel* getActivePanel();
- bool isAccordionPanel(LLInventoryPanel *panel);
+ bool isTabPanel(LLInventoryPanel *panel);
protected:
- void initAccordionPanels();
- void onAccordionSelectionChange(LLInventoryPanel* accordion_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void initTabPanels();
+ void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onTabChange();
private:
LLInventoryPanel* mActivePanel;
- typedef std::vector<LLInventoryPanel *> accordionpanels_vec_t;
- accordionpanels_vec_t mAccordionPanels;
+ typedef std::vector<LLInventoryPanel *> tabpanels_vec_t;
+ tabpanels_vec_t mTabPanels;
- // Accordion //
+ // tab panels //
////////////////////////////////////////////////////////////////////////////////
@@ -103,6 +106,7 @@ protected:
void initListCommandsHandlers();
void updateListCommands();
void onGearButtonClick();
+ void onWearButtonClick();
void onAddButtonClick();
void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
void onTrashButtonClick();
@@ -116,6 +120,9 @@ private:
LLMenuGL* mMenuAdd;
// List Commands //
////////////////////////////////////////////////////////////////////////////////
+ ///
+public:
+ static bool sShowDebugEditor;
};
#endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 498782fb44..4d22d96072 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -45,6 +45,7 @@
#include "llnotificationsutil.h"
#include "lltexturectrl.h"
#include "lltoggleablemenu.h"
+#include "lltrans.h"
#include "llviewergenericmessage.h" // send_generic_message
#include "llmenugl.h"
#include "llviewermenu.h"
@@ -57,7 +58,6 @@
#include "llpanelprofile.h"
#include "llpanelpick.h"
#include "llpanelclassified.h"
-#include "llpanelprofileview.h"
#include "llsidetray.h"
static const std::string XML_BTN_NEW = "new_btn";
@@ -88,6 +88,14 @@ public:
bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
+ // handle app/classified/create urls first
+ if (params.size() == 1 && params[0].asString() == "create")
+ {
+ createClassified();
+ return true;
+ }
+
+ // then handle the general app/classified/{UUID}/{CMD} urls
if (params.size() < 2)
{
return false;
@@ -114,6 +122,31 @@ public:
return false;
}
+ void createClassified()
+ {
+ // open the new classified panel on the Me > Picks sidetray
+ LLSD params;
+ params["id"] = gAgent.getID();
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "create_classified";
+ LLSideTray::getInstance()->showPanel("panel_me", params);
+ }
+
+ void openClassified(LLAvatarClassifiedInfo* c_info)
+ {
+ // open the classified info panel on the Me > Picks sidetray
+ LLSD params;
+ params["id"] = c_info->creator_id;
+ params["open_tab_name"] = "panel_picks";
+ params["show_tab_panel"] = "classified_details";
+ params["classified_id"] = c_info->classified_id;
+ params["classified_avatar_id"] = c_info->creator_id;
+ params["classified_snapshot_id"] = c_info->snapshot_id;
+ params["classified_name"] = c_info->name;
+ params["classified_desc"] = c_info->description;
+ LLSideTray::getInstance()->showPanel("panel_profile_view", params);
+ }
+
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type)
{
if (APT_CLASSIFIED_INFO != type)
@@ -128,22 +161,8 @@ public:
return;
}
- // open the people profile page for the classified's owner
- LLSD params;
- params["id"] = c_info->creator_id;
- params["classified"] = c_info->classified_id;
- params["open_tab_name"] = "panel_profile";
- LLPanelProfileView *profile = dynamic_cast<LLPanelProfileView*>(LLSideTray::getInstance()->showPanel("panel_profile_view", params));
-
- // then open the classified panel on this user's profile panel
- if (profile)
- {
- LLPanelPicks* panel_picks = profile->getChild<LLPanelPicks>("panel_picks");
- if (panel_picks)
- {
- panel_picks->openClassifiedInfo(c_info);
- }
- }
+ // open the detail side tray for this classified
+ openClassified(c_info);
// remove our observer now that we're done
mClassifiedIds.erase(c_info->classified_id);
@@ -198,7 +217,9 @@ LLPanelPicks::LLPanelPicks()
mClassifiedsAccTab(NULL),
mPanelClassifiedInfo(NULL),
mPanelClassifiedEdit(NULL),
- mClickThroughDisp(NULL)
+ mClickThroughDisp(NULL),
+ mNoClassifieds(false),
+ mNoPicks(false)
{
mClickThroughDisp = new LLClassifiedClickThrough();
gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp);
@@ -224,6 +245,11 @@ void LLPanelPicks::updateData()
// Send Picks request only when we need to, not on every onOpen(during tab switch).
if(isDirty())
{
+ mNoPicks = false;
+ mNoClassifieds = false;
+
+ childSetValue("picks_panel_text", LLTrans::getString("PicksClassifiedsLoadingText"));
+
mPicksList->clear();
LLAvatarPropertiesProcessor::getInstance()->sendAvatarPicksRequest(getAvatarId());
@@ -284,6 +310,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
resetDirty();
updateButtons();
}
+
+ mNoPicks = !mPicksList->size();
}
else if(APT_CLASSIFIEDS == type)
{
@@ -317,9 +345,14 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
resetDirty();
updateButtons();
}
+
+ mNoClassifieds = !mClassifiedsList->size();
+ }
+
+ if (mNoPicks && mNoClassifieds)
+ {
+ childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText"));
}
- if(!mPicksList->size() && !mClassifiedsList->size())
- childSetVisible("empty_picks_panel_text", true);
}
LLPickItem* LLPanelPicks::getSelectedPickItem()
@@ -693,33 +726,24 @@ void LLPanelPicks::openClassifiedInfo()
LLClassifiedItem* c_item = getSelectedClassifiedItem();
- createClassifiedInfoPanel();
-
- LLSD params;
- params["classified_id"] = c_item->getClassifiedId();
- params["avatar_id"] = c_item->getAvatarId();
- params["snapshot_id"] = c_item->getSnapshotId();
- params["name"] = c_item->getClassifiedName();
- params["desc"] = c_item->getDescription();
-
- getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
+ openClassifiedInfo(c_item->getClassifiedId(), c_item->getAvatarId(),
+ c_item->getSnapshotId(), c_item->getClassifiedName(),
+ c_item->getDescription());
}
-void LLPanelPicks::openClassifiedInfo(LLAvatarClassifiedInfo *c_info)
+void LLPanelPicks::openClassifiedInfo(const LLUUID &classified_id,
+ const LLUUID &avatar_id,
+ const LLUUID &snapshot_id,
+ const std::string &name, const std::string &desc)
{
- if (! c_info)
- {
- return;
- }
-
createClassifiedInfoPanel();
LLSD params;
- params["classified_id"] = c_info->classified_id;
- params["avatar_id"] = c_info->creator_id;
- params["snapshot_id"] = c_info->snapshot_id;
- params["name"] = c_info->name;
- params["desc"] = c_info->description;
+ params["classified_id"] = classified_id;
+ params["avatar_id"] = avatar_id;
+ params["snapshot_id"] = snapshot_id;
+ params["name"] = name;
+ params["desc"] = desc;
getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
}
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 893a0c53a3..fd8a9e6938 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -86,9 +86,6 @@ public:
// parent panels failed to work (picks related code was in my profile panel)
void setProfilePanel(LLPanelProfile* profile_panel);
- // display the info panel for the given classified
- void openClassifiedInfo(LLAvatarClassifiedInfo *c_info);
-
protected:
/*virtual*/void updateButtons();
@@ -120,6 +117,10 @@ private:
void openPickInfo();
void openClassifiedInfo();
+ void openClassifiedInfo(const LLUUID &classified_id, const LLUUID &avatar_id,
+ const LLUUID &snapshot_id, const std::string &name,
+ const std::string &desc);
+ friend class LLPanelProfile;
void showAccordion(const std::string& name, bool show);
@@ -156,6 +157,11 @@ private:
LLAccordionCtrlTab* mClassifiedsAccTab;
LLClassifiedClickThrough* mClickThroughDisp;
+
+ //true if picks list is empty after processing picks
+ bool mNoPicks;
+ //true if classifieds list is empty after processing classifieds
+ bool mNoClassifieds;
};
class LLPickItem : public LLPanel, public LLAvatarPropertiesObserver
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 7b2ac38568..5cc9c1951b 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -96,7 +96,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mTargetObjectNormal(LLVector3::zero),
mZoomObjectID(LLUUID::null),
mZoomObjectFace(0),
- mVolumeSliderVisible(false)
+ mVolumeSliderVisible(0)
{
mCommitCallbackRegistrar.add("MediaCtrl.Close", boost::bind(&LLPanelPrimMediaControls::onClickClose, this));
mCommitCallbackRegistrar.add("MediaCtrl.Back", boost::bind(&LLPanelPrimMediaControls::onClickBack, this));
@@ -116,6 +116,7 @@ LLPanelPrimMediaControls::LLPanelPrimMediaControls() :
mCommitCallbackRegistrar.add("MediaCtrl.Volume", boost::bind(&LLPanelPrimMediaControls::onCommitVolumeSlider, this));
mCommitCallbackRegistrar.add("MediaCtrl.ToggleMute", boost::bind(&LLPanelPrimMediaControls::onToggleMute, this));
mCommitCallbackRegistrar.add("MediaCtrl.ShowVolumeSlider", boost::bind(&LLPanelPrimMediaControls::showVolumeSlider, this));
+ mCommitCallbackRegistrar.add("MediaCtrl.HideVolumeSlider", boost::bind(&LLPanelPrimMediaControls::hideVolumeSlider, this));
mCommitCallbackRegistrar.add("MediaCtrl.SkipBack", boost::bind(&LLPanelPrimMediaControls::onClickSkipBack, this));
mCommitCallbackRegistrar.add("MediaCtrl.SkipForward", boost::bind(&LLPanelPrimMediaControls::onClickSkipForward, this));
@@ -372,8 +373,8 @@ void LLPanelPrimMediaControls::updateShape()
mVolumeUpCtrl->setVisible(has_focus);
mVolumeDownCtrl->setVisible(has_focus);
mVolumeCtrl->setEnabled(has_focus);
- mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible);
- mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible);
+ mVolumeSliderCtrl->setEnabled(has_focus && mVolumeSliderVisible > 0);
+ mVolumeSliderCtrl->setVisible(has_focus && mVolumeSliderVisible > 0);
mWhitelistIcon->setVisible(false);
mSecureLockIcon->setVisible(false);
@@ -714,7 +715,7 @@ void LLPanelPrimMediaControls::draw()
setVisible(FALSE);
mClearFaceOnFade = false;
- mVolumeSliderVisible = false;
+ mVolumeSliderVisible = 0;
mTargetImplID = LLUUID::null;
mTargetObjectID = LLUUID::null;
mTargetObjectFace = 0;
@@ -1267,5 +1268,11 @@ void LLPanelPrimMediaControls::onToggleMute()
void LLPanelPrimMediaControls::showVolumeSlider()
{
- mVolumeSliderVisible = true;
+ mVolumeSliderVisible++;
+}
+
+
+void LLPanelPrimMediaControls::hideVolumeSlider()
+{
+ mVolumeSliderVisible--;
}
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 17e65b8b0c..d899ee4473 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -110,6 +110,7 @@ private:
void onCommitVolumeSlider();
void onToggleMute();
void showVolumeSlider();
+ void hideVolumeSlider();
static void onScrollUp(void* user_data);
static void onScrollUpHeld(void* user_data);
@@ -204,7 +205,7 @@ private:
LLUUID mZoomObjectID;
S32 mZoomObjectFace;
- bool mVolumeSliderVisible;
+ S32 mVolumeSliderVisible;
};
#endif // LL_PANELPRIMMEDIACONTROLS_H
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index 3274820174..c73ade53c8 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -144,6 +144,7 @@ BOOL LLPanelProfile::postBuild()
void LLPanelProfile::onOpen(const LLSD& key)
{
+ // open the desired panel
if (key.has("open_tab_name"))
{
getTabContainer()[PANEL_PICKS]->onClosePanel();
@@ -155,6 +156,33 @@ void LLPanelProfile::onOpen(const LLSD& key)
{
getTabCtrl()->getCurrentPanel()->onOpen(getAvatarId());
}
+
+ // support commands to open further pieces of UI
+ if (key.has("show_tab_panel"))
+ {
+ std::string panel = key["show_tab_panel"].asString();
+ if (panel == "create_classified")
+ {
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ picks->createNewClassified();
+ }
+ }
+ else if (panel == "classified_details")
+ {
+ LLUUID classified_id = key["classified_id"].asUUID();
+ LLUUID avatar_id = key["classified_avatar_id"].asUUID();
+ LLUUID snapshot_id = key["classified_snapshot_id"].asUUID();
+ std::string name = key["classified_name"].asString();
+ std::string desc = key["classified_desc"].asString();
+ LLPanelPicks* picks = dynamic_cast<LLPanelPicks *>(getTabContainer()[PANEL_PICKS]);
+ if (picks)
+ {
+ picks->openClassifiedInfo(classified_id, avatar_id, snapshot_id, name, desc);
+ }
+ }
+ }
}
//*TODO redo panel toggling
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 2c5f1b094e..afb9892d12 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -49,48 +49,14 @@
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
#endif
-class ModerationResponder : public LLHTTPClient::Responder
-{
-public:
- ModerationResponder(const LLUUID& session_id)
- {
- mSessionID = session_id;
- }
-
- virtual void error(U32 status, const std::string& reason)
- {
- llwarns << status << ": " << reason << llendl;
-
- if ( gIMMgr )
- {
- //403 == you're not a mod
- //should be disabled if you're not a moderator
- if ( 403 == status )
- {
- gIMMgr->showSessionEventError(
- "mute",
- "not_a_mod_error",
- mSessionID);
- }
- else
- {
- gIMMgr->showSessionEventError(
- "mute",
- "generic_request_error",
- mSessionID);
- }
- }
- }
-
-private:
- LLUUID mSessionID;
-};
+static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;
LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/):
mSpeakerMgr(data_source),
mAvatarList(avatar_list),
mSortOrder(E_SORT_BY_NAME)
, mParticipantListMenu(NULL)
+, mExcludeAgent(true)
{
mSpeakerAddListener = new SpeakerAddListener(*this);
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
@@ -134,6 +100,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
mModeratorList.insert(speakerp->mID);
}
}
+ // we need to exclude agent id for non group chat
+ mExcludeAgent = !gAgent.isInGroup(mSpeakerMgr->getSessionID());
mAvatarList->setDirty(true);
sort();
}
@@ -147,13 +115,16 @@ LLParticipantList::~LLParticipantList()
// It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged()
// See ticket EXT-3427
// hide menu before deleting it to stop enable and check handlers from triggering.
- if(mParticipantListMenu)
+ if(mParticipantListMenu && !LLApp::isExiting())
{
mParticipantListMenu->hide();
}
- delete mParticipantListMenu;
- mParticipantListMenu = NULL;
+ if (mParticipantListMenu)
+ {
+ delete mParticipantListMenu;
+ mParticipantListMenu = NULL;
+ }
}
void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
@@ -344,7 +315,16 @@ void LLParticipantList::sort()
// TODO: Implement more sorting orders after specs updating (EM)
switch ( mSortOrder ) {
case E_SORT_BY_NAME :
- mAvatarList->sortByName();
+ // if mExcludeAgent == true , then no need to keep agent on top of the list
+ if(mExcludeAgent)
+ {
+ mAvatarList->sortByName();
+ }
+ else
+ {
+ mAvatarList->setComparator(&AGENT_ON_TOP_NAME_COMPARATOR);
+ mAvatarList->sort();
+ }
break;
default :
llwarns << "Unrecognized sort order for " << mAvatarList->getName() << llendl;
@@ -354,7 +334,7 @@ void LLParticipantList::sort()
void LLParticipantList::addAvatarIDExceptAgent(std::vector<LLUUID>& existing_list, const LLUUID& avatar_id)
{
- if (gAgent.getID() == avatar_id) return;
+ if (mExcludeAgent && gAgent.getID() == avatar_id) return;
existing_list.push_back(avatar_id);
adjustParticipant(avatar_id);
@@ -471,22 +451,13 @@ void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const
void LLParticipantList::LLParticipantListMenu::toggleAllowTextChat(const LLSD& userdata)
{
- const LLUUID speaker_id = mUUIDs.front();
- std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
- LLSD data;
- data["method"] = "mute update";
- data["session-id"] = mParent.mSpeakerMgr->getSessionID();
- data["params"] = LLSD::emptyMap();
- data["params"]["agent_id"] = speaker_id;
- data["params"]["mute_info"] = LLSD::emptyMap();
- //current value represents ability to type, so invert
- data["params"]["mute_info"]["text"] = !mParent.mSpeakerMgr->findSpeaker(speaker_id)->mModeratorMutedText;
-
- LLHTTPClient::post(
- url,
- data,
- new ModerationResponder(mParent.mSpeakerMgr->getSessionID()));
+ LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+ if (mgr)
+ {
+ const LLUUID speaker_id = mUUIDs.front();
+ mgr->toggleAllowTextChat(speaker_id);
+ }
}
void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata, U32 flags)
@@ -565,47 +536,19 @@ void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdat
void LLParticipantList::LLParticipantListMenu::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
{
- if (gAgentID == avatar_id) return; // do not process myself
-
- LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(avatar_id);
- if (!speakerp) return;
-
- // *NOTE: mantipov: probably this condition will be incorrect when avatar will be blocked for
- // text chat via moderation (LLSpeaker::mModeratorMutedText == TRUE)
- bool is_in_voice = speakerp->mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || speakerp->mStatus == LLSpeaker::STATUS_MUTED;
-
- // do not send voice moderation changes for avatars not in voice channel
- if (!is_in_voice) return;
-
- std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
- LLSD data;
- data["method"] = "mute update";
- data["session-id"] = mParent.mSpeakerMgr->getSessionID();
- data["params"] = LLSD::emptyMap();
- data["params"]["agent_id"] = avatar_id;
- data["params"]["mute_info"] = LLSD::emptyMap();
- data["params"]["mute_info"]["voice"] = !unmute;
-
- LLHTTPClient::post(
- url,
- data,
- new ModerationResponder(mParent.mSpeakerMgr->getSessionID()));
+ LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+ if (mgr)
+ {
+ mgr->moderateVoiceParticipant(avatar_id, unmute);
+ }
}
void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute)
{
- LLSpeakerMgr::speaker_list_t speakers;
- mParent.mSpeakerMgr->getSpeakerList(&speakers, FALSE);
-
- for (LLSpeakerMgr::speaker_list_t::iterator iter = speakers.begin();
- iter != speakers.end(); ++iter)
+ LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
+ if (mgr)
{
- LLSpeaker* speakerp = (*iter).get();
- LLUUID speaker_id = speakerp->mID;
-
- if (excluded_avatar_id == speaker_id) continue;
-
- moderateVoiceParticipant(speaker_id, unmute);
+ mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute);
}
}
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index bc6c6c2b50..72c413d188 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -229,6 +229,12 @@ class LLParticipantList
LLParticipantListMenu* mParticipantListMenu;
EParticipantSortOrder mSortOrder;
+ /*
+ * This field manages an adding a new avatar_id in the mAvatarList
+ * If true, then agent_id wont be added into mAvatarList
+ * Also by default this field is controlling a sort procedure, @c sort()
+ */
+ bool mExcludeAgent;
// boost::connections
boost::signals2::connection mAvatarListDoubleClickConnection;
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index c95882931b..0b0c03e9e9 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -150,6 +150,13 @@ void LLPreview::onCommit()
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setDescription(childGetText("desc"));
+
+ std::string new_name = childGetText("name");
+ if ( (new_item->getName() != new_name) && !new_name.empty())
+ {
+ new_item->rename(childGetText("name"));
+ }
+
if(mObjectUUID.notNull())
{
// must be in an object
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index f1891aa421..2a40cbaba0 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -494,6 +494,10 @@ BOOL LLPreviewGesture::postBuild()
childSetCommitCallback("desc", LLPreview::onText, this);
childSetText("desc", item->getDescription());
childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+
+ childSetCommitCallback("name", LLPreview::onText, this);
+ childSetText("name", item->getName());
+ childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
}
return LLPreview::postBuild();
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 6e99d5a5f0..60a095506b 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -2277,6 +2277,26 @@ BOOL LLSelectMgr::selectGetAllValid()
return TRUE;
}
+//-----------------------------------------------------------------------------
+// selectGetAllValidAndObjectsFound() - return TRUE if selections are
+// valid and objects are found.
+//
+// For EXT-3114 - same as selectGetModify() without the modify check.
+//-----------------------------------------------------------------------------
+BOOL LLSelectMgr::selectGetAllValidAndObjectsFound()
+{
+ for (LLObjectSelection::iterator iter = getSelection()->begin();
+ iter != getSelection()->end(); iter++ )
+ {
+ LLSelectNode* node = *iter;
+ LLViewerObject* object = node->getObject();
+ if( !object || !node->mValid )
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
//-----------------------------------------------------------------------------
// selectGetModify() - return TRUE if current agent can modify all
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 6641be335a..f8ecfd0674 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -535,6 +535,7 @@ public:
// Returns TRUE if the viewer has information on all selected objects
BOOL selectGetAllRootsValid();
BOOL selectGetAllValid();
+ BOOL selectGetAllValidAndObjectsFound();
// returns TRUE if you can modify all selected objects.
BOOL selectGetRootsModify();
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index eb3695a371..30b0075c4b 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -113,9 +113,6 @@ BOOL LLSidepanelAppearance::postBuild()
mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
- mWearBtn = getChild<LLButton>("wear_btn");
- mWearBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onWearButtonClicked, this));
-
mEditBtn = getChild<LLButton>("edit_btn");
mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
@@ -199,14 +196,6 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
}
}
-void LLSidepanelAppearance::onWearButtonClicked()
-{
- if (!mLookInfo->getVisible())
- {
- mPanelOutfitsInventory->onWear();
- }
-}
-
void LLSidepanelAppearance::onOpenOutfitButtonClicked()
{
const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getCurrentOutfitLink();
@@ -284,7 +273,6 @@ void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
mLookInfo->setVisible(visible);
mPanelOutfitsInventory->setVisible(!visible);
mFilterEditor->setVisible(!visible);
- mWearBtn->setVisible(!visible);
mEditBtn->setVisible(!visible);
mNewOutfitBtn->setVisible(!visible);
mCurrOutfitPanel->setVisible(!visible);
@@ -314,12 +302,10 @@ void LLSidepanelAppearance::updateVerbs()
{
const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
mEditBtn->setEnabled(is_correct_type);
- mWearBtn->setEnabled(is_correct_type);
}
else
{
mEditBtn->setEnabled(FALSE);
- mWearBtn->setEnabled(FALSE);
}
}
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index 9c870f631a..8ef2088eda 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -67,7 +67,6 @@ private:
void onOpenOutfitButtonClicked();
void onEditAppearanceButtonClicked();
- void onWearButtonClicked();
void onEditButtonClicked();
void onNewOutfitButtonClicked();
void onBackButtonClicked();
@@ -82,7 +81,6 @@ private:
LLButton* mOpenOutfitBtn;
LLButton* mEditAppearanceBtn;
- LLButton* mWearBtn;
LLButton* mEditBtn;
LLButton* mNewOutfitBtn;
LLPanel* mCurrOutfitPanel;
diff --git a/indra/newview/llsidepanelinventorysubpanel.cpp b/indra/newview/llsidepanelinventorysubpanel.cpp
index 793904faa8..56e342c3ce 100644
--- a/indra/newview/llsidepanelinventorysubpanel.cpp
+++ b/indra/newview/llsidepanelinventorysubpanel.cpp
@@ -95,7 +95,9 @@ void LLSidepanelInventorySubpanel::setIsEditing(BOOL edit)
BOOL LLSidepanelInventorySubpanel::getIsEditing() const
{
- return mIsEditing;
+
+ return TRUE; // Default everything to edit mode since we're not using an edit button anymore.
+ // return mIsEditing;
}
void LLSidepanelInventorySubpanel::reset()
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 25518d87d6..1965e634b6 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -172,7 +172,7 @@ void LLSidepanelItemInfo::refresh()
}
}
- if (!getIsEditing())
+ if (!getIsEditing() || !item)
{
const std::string no_item_names[]={
"LabelItemName",
@@ -261,18 +261,6 @@ void LLSidepanelItemInfo::refreshFromItem(LLInventoryItem* item)
GP_OBJECT_MANIPULATE)
&& is_obj_modify && is_complete;
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- bool item_in_trash = item->getUUID() == trash_id || gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
-
- if (is_modifiable && !item_in_trash)
- {
- setIsEditing(TRUE);
- }
- else
- {
- setIsEditing(FALSE);
- }
-
childSetEnabled("LabelItemNameTitle",TRUE);
childSetEnabled("LabelItemName",is_modifiable && !is_calling_card); // for now, don't allow rename of calling cards
childSetText("LabelItemName",item->getName());
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 2c40e948de..50cec3184d 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -101,13 +101,25 @@ BOOL LLSidepanelTaskInfo::postBuild()
mBuyBtn = getChild<LLButton>("buy_btn");
mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this));
- childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
- childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
-
mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
- childSetCommitCallback("checkbox for sale",onClickForSale,this);
-
+ childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this);
+ childSetPrevalidate("Object Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetCommitCallback("Object Description", LLSidepanelTaskInfo::onCommitDesc,this);
+ childSetPrevalidate("Object Description", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLSidepanelTaskInfo::onClickGroup,this));
+ childSetCommitCallback("checkbox share with group", &LLSidepanelTaskInfo::onCommitGroupShare,this);
+ childSetAction("button deed", &LLSidepanelTaskInfo::onClickDeedToGroup,this);
+ childSetCommitCallback("checkbox allow everyone move", &LLSidepanelTaskInfo::onCommitEveryoneMove,this);
+ childSetCommitCallback("checkbox allow everyone copy", &LLSidepanelTaskInfo::onCommitEveryoneCopy,this);
+ childSetCommitCallback("checkbox for sale", &LLSidepanelTaskInfo::onCommitSaleInfo,this);
+ childSetCommitCallback("sale type", &LLSidepanelTaskInfo::onCommitSaleType,this);
+ childSetCommitCallback("Edit Cost", &LLSidepanelTaskInfo::onCommitSaleInfo, this);
+ childSetCommitCallback("checkbox next owner can modify", &LLSidepanelTaskInfo::onCommitNextOwnerModify,this);
+ childSetCommitCallback("checkbox next owner can copy", &LLSidepanelTaskInfo::onCommitNextOwnerCopy,this);
+ childSetCommitCallback("checkbox next owner can transfer", &LLSidepanelTaskInfo::onCommitNextOwnerTransfer,this);
+ childSetCommitCallback("clickaction", &LLSidepanelTaskInfo::onCommitClickAction,this);
+ childSetCommitCallback("search_check", &LLSidepanelTaskInfo::onCommitIncludeInSearch,this);
return TRUE;
}
@@ -860,7 +872,7 @@ static bool callback_deed_to_group(const LLSD& notification, const LLSD& respons
return FALSE;
}
-void LLSidepanelTaskInfo::onClickDeedToGroup()
+void LLSidepanelTaskInfo::onClickDeedToGroup(void *data)
{
LLNotificationsUtil::add("DeedObjectToGroup", LLSD(), LLSD(), callback_deed_to_group);
}
@@ -869,121 +881,149 @@ void LLSidepanelTaskInfo::onClickDeedToGroup()
/// Permissions checkboxes
///----------------------------------------------------------------------------
-void LLSidepanelTaskInfo::onCommitPerm(LLCheckBoxCtrl *ctrl, U8 field, U32 perm)
+// static
+void LLSidepanelTaskInfo::onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm)
{
- const LLViewerObject* object = mObjectSelection->getFirstRootObject();
- if (!object) return;
+ LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getFirstRootObject();
+ if(!object) return;
- BOOL new_state = ctrl->get();
+ // Checkbox will have toggled itself
+ // LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
+ BOOL new_state = check->get();
+
LLSelectMgr::getInstance()->selectionSetObjectPermissions(field, new_state, perm);
}
-void LLSidepanelTaskInfo::onCommitGroupShare()
+// static
+void LLSidepanelTaskInfo::onCommitGroupShare(LLUICtrl *ctrl, void *data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox share with group");
- onCommitPerm(ctrl, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY);
+ onCommitPerm(ctrl, data, PERM_GROUP, PERM_MODIFY | PERM_MOVE | PERM_COPY);
}
-void LLSidepanelTaskInfo::onCommitEveryoneMove()
+// static
+void LLSidepanelTaskInfo::onCommitEveryoneMove(LLUICtrl *ctrl, void *data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox allow everyone move");
- onCommitPerm(ctrl, PERM_EVERYONE, PERM_MOVE);
+ onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_MOVE);
}
-void LLSidepanelTaskInfo::onCommitEveryoneCopy()
+// static
+void LLSidepanelTaskInfo::onCommitEveryoneCopy(LLUICtrl *ctrl, void *data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox allow everyone copy");
- onCommitPerm(ctrl, PERM_EVERYONE, PERM_COPY);
+ onCommitPerm(ctrl, data, PERM_EVERYONE, PERM_COPY);
}
-void LLSidepanelTaskInfo::onCommitNextOwnerModify()
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerModify(LLUICtrl* ctrl, void* data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can modify");
- onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_MODIFY);
+ //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerModify" << llendl;
+ onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_MODIFY);
}
-void LLSidepanelTaskInfo::onCommitNextOwnerCopy()
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can copy");
- onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_COPY);
+ //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerCopy" << llendl;
+ onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_COPY);
}
-void LLSidepanelTaskInfo::onCommitNextOwnerTransfer()
+// static
+void LLSidepanelTaskInfo::onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("checkbox next owner can transfer");
- onCommitPerm(ctrl, PERM_NEXT_OWNER, PERM_TRANSFER);
+ //llinfos << "LLSidepanelTaskInfo::onCommitNextOwnerTransfer" << llendl;
+ onCommitPerm(ctrl, data, PERM_NEXT_OWNER, PERM_TRANSFER);
}
-void LLSidepanelTaskInfo::onCommitName()
+// static
+void LLSidepanelTaskInfo::onCommitName(LLUICtrl*, void* data)
{
- LLLineEditor* tb = getChild<LLLineEditor>("Object Name");
- LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
+ //llinfos << "LLSidepanelTaskInfo::onCommitName()" << llendl;
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ LLLineEditor* tb = self->getChild<LLLineEditor>("Object Name");
+ if(tb)
+ {
+ LLSelectMgr::getInstance()->selectionSetObjectName(tb->getText());
+// LLSelectMgr::getInstance()->selectionSetObjectName(self->mLabelObjectName->getText());
+ }
}
-void LLSidepanelTaskInfo::onCommitDesc()
+
+// static
+void LLSidepanelTaskInfo::onCommitDesc(LLUICtrl*, void* data)
{
- LLLineEditor* le = getChild<LLLineEditor>("Object Description");
- LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+ //llinfos << "LLSidepanelTaskInfo::onCommitDesc()" << llendl;
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ LLLineEditor* le = self->getChild<LLLineEditor>("Object Description");
+ if(le)
+ {
+ LLSelectMgr::getInstance()->selectionSetObjectDescription(le->getText());
+ }
}
-void LLSidepanelTaskInfo::onCommitSaleInfo()
+// static
+void LLSidepanelTaskInfo::onCommitSaleInfo(LLUICtrl*, void* data)
{
- setAllSaleInfo();
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ self->setAllSaleInfo();
}
-void LLSidepanelTaskInfo::onCommitSaleType()
+// static
+void LLSidepanelTaskInfo::onCommitSaleType(LLUICtrl*, void* data)
{
- setAllSaleInfo();
+ LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
+ self->setAllSaleInfo();
}
+
void LLSidepanelTaskInfo::setAllSaleInfo()
{
- llinfos << "LLSidepanelTaskInfo::setAllSaleInfo()" << llendl;
-
LLSaleInfo::EForSale sale_type = LLSaleInfo::FS_NOT;
+
LLCheckBoxCtrl *checkPurchase = getChild<LLCheckBoxCtrl>("checkbox for sale");
+
// Set the sale type if the object(s) are for sale.
- if (checkPurchase && checkPurchase->get())
+ if(checkPurchase && checkPurchase->get())
{
sale_type = static_cast<LLSaleInfo::EForSale>(getChild<LLComboBox>("sale type")->getValue().asInteger());
}
S32 price = -1;
- const LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
+
+ LLSpinCtrl *edit_price = getChild<LLSpinCtrl>("Edit Cost");
price = (edit_price->getTentative()) ? DEFAULT_PRICE : edit_price->getValue().asInteger();
+
// If somehow an invalid price, turn the sale off.
if (price < 0)
sale_type = LLSaleInfo::FS_NOT;
- LLSaleInfo sale_info(sale_type, price);
- LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(sale_info);
- // If turned off for-sale, make sure click-action buy is turned
- // off as well
- if (sale_type == LLSaleInfo::FS_NOT)
- {
- U8 click_action = 0;
- LLSelectMgr::getInstance()->selectionGetClickAction(&click_action);
- if (click_action == CLICK_ACTION_BUY)
- {
- LLSelectMgr::getInstance()->selectionSetClickAction(CLICK_ACTION_TOUCH);
- }
- }
-}
+ LLSaleInfo old_sale_info;
+ LLSelectMgr::getInstance()->selectGetSaleInfo(old_sale_info);
-// static
-void LLSidepanelTaskInfo::onClickForSale(LLUICtrl* ctrl, void* data)
-{
- LLSidepanelTaskInfo* self = (LLSidepanelTaskInfo*)data;
- self->updateUIFromSaleInfo();
-}
+ LLSaleInfo new_sale_info(sale_type, price);
+ LLSelectMgr::getInstance()->selectionSetObjectSaleInfo(new_sale_info);
+
+ U8 old_click_action = 0;
+ LLSelectMgr::getInstance()->selectionGetClickAction(&old_click_action);
-void LLSidepanelTaskInfo::updateUIFromSaleInfo()
-{
- /*
- TODO: Update sale button enable/disable state and default
- sale button settings when this sale button is enabled/disabled.
- */
+ if (old_sale_info.isForSale()
+ && !new_sale_info.isForSale()
+ && old_click_action == CLICK_ACTION_BUY)
+ {
+ // If turned off for-sale, make sure click-action buy is turned
+ // off as well
+ LLSelectMgr::getInstance()->
+ selectionSetClickAction(CLICK_ACTION_TOUCH);
+ }
+ else if (new_sale_info.isForSale()
+ && !old_sale_info.isForSale()
+ && old_click_action == CLICK_ACTION_TOUCH)
+ {
+ // If just turning on for-sale, preemptively turn on one-click buy
+ // unless user have a different click action set
+ LLSelectMgr::getInstance()->
+ selectionSetClickAction(CLICK_ACTION_BUY);
+ }
}
struct LLSelectionPayable : public LLSelectedObjectFunctor
@@ -997,8 +1037,35 @@ struct LLSelectionPayable : public LLSelectedObjectFunctor
}
};
+static U8 string_value_to_click_action(std::string p_value)
+{
+ if (p_value == "Touch")
+ return CLICK_ACTION_TOUCH;
+ if (p_value == "Sit")
+ return CLICK_ACTION_SIT;
+ if (p_value == "Buy")
+ return CLICK_ACTION_BUY;
+ if (p_value == "Pay")
+ return CLICK_ACTION_PAY;
+ if (p_value == "Open")
+ return CLICK_ACTION_OPEN;
+ if (p_value == "Zoom")
+ return CLICK_ACTION_ZOOM;
+ return CLICK_ACTION_TOUCH;
+}
+
+// static
+void LLSidepanelTaskInfo::onCommitClickAction(LLUICtrl* ctrl, void*)
+{
+ LLComboBox* box = (LLComboBox*)ctrl;
+ if (!box) return;
+ std::string value = box->getValue().asString();
+ U8 click_action = string_value_to_click_action(value);
+ doClickAction(click_action);
+}
+
// static
-void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
+void LLSidepanelTaskInfo::doClickAction(U8 click_action)
{
if (click_action == CLICK_ACTION_BUY)
{
@@ -1020,7 +1087,7 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
{
// Verify object has script with money() handler
LLSelectionPayable payable;
- const BOOL can_pay = mObjectSelection->applyToObjects(&payable);
+ bool can_pay = LLSelectMgr::getInstance()->getSelection()->applyToObjects(&payable);
if (!can_pay)
{
// Warn, but do it anyway.
@@ -1031,10 +1098,11 @@ void LLSidepanelTaskInfo::onCommitClickAction(U8 click_action)
}
// static
-void LLSidepanelTaskInfo::onCommitIncludeInSearch()
+void LLSidepanelTaskInfo::onCommitIncludeInSearch(LLUICtrl* ctrl, void* data)
{
- LLCheckBoxCtrl *ctrl = getChild<LLCheckBoxCtrl>("search_check");
- LLSelectMgr::getInstance()->selectionSetIncludeInSearch(ctrl->get());
+ LLCheckBoxCtrl* box = (LLCheckBoxCtrl*)ctrl;
+ llassert(box);
+ LLSelectMgr::getInstance()->selectionSetIncludeInSearch(box->get());
}
// virtual
@@ -1042,13 +1110,15 @@ void LLSidepanelTaskInfo::updateVerbs()
{
LLSidepanelInventorySubpanel::updateVerbs();
+ /*
mOpenBtn->setVisible(!getIsEditing());
mPayBtn->setVisible(!getIsEditing());
mBuyBtn->setVisible(!getIsEditing());
-
- mOpenBtn->setEnabled(enable_object_open());
//const LLViewerObject *obj = getFirstSelectedObject();
//mEditBtn->setEnabled(obj && obj->permModify());
+ */
+
+ mOpenBtn->setEnabled(enable_object_open());
}
void LLSidepanelTaskInfo::onOpenButtonClicked()
@@ -1061,28 +1131,28 @@ void LLSidepanelTaskInfo::onOpenButtonClicked()
void LLSidepanelTaskInfo::onPayButtonClicked()
{
- onCommitClickAction(CLICK_ACTION_PAY);
+ doClickAction(CLICK_ACTION_PAY);
}
void LLSidepanelTaskInfo::onBuyButtonClicked()
{
- onCommitClickAction(CLICK_ACTION_BUY);
+ doClickAction(CLICK_ACTION_BUY);
}
// virtual
void LLSidepanelTaskInfo::save()
{
- onCommitGroupShare();
- onCommitEveryoneMove();
- onCommitEveryoneCopy();
- onCommitNextOwnerModify();
- onCommitNextOwnerCopy();
- onCommitNextOwnerTransfer();
- onCommitName();
- onCommitDesc();
- onCommitSaleInfo();
- onCommitSaleType();
- onCommitIncludeInSearch();
+ onCommitGroupShare(getChild<LLCheckBoxCtrl>("checkbox share with group"), this);
+ onCommitEveryoneMove(getChild<LLCheckBoxCtrl>("checkbox allow everyone move"), this);
+ onCommitEveryoneCopy(getChild<LLCheckBoxCtrl>("checkbox allow everyone copy"), this);
+ onCommitNextOwnerModify(getChild<LLCheckBoxCtrl>("checkbox next owner can modify"), this);
+ onCommitNextOwnerCopy(getChild<LLCheckBoxCtrl>("checkbox next owner can copy"), this);
+ onCommitNextOwnerTransfer(getChild<LLCheckBoxCtrl>("checkbox next owner can transfer"), this);
+ onCommitName(getChild<LLLineEditor>("Object Name"), this);
+ onCommitDesc(getChild<LLLineEditor>("Object Description"), this);
+ onCommitSaleInfo(NULL, this);
+ onCommitSaleType(NULL, this);
+ onCommitIncludeInSearch(getChild<LLCheckBoxCtrl>("search_check"), this);
}
void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection)
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index 7c6d9983ae..cf36c20767 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -72,28 +72,30 @@ protected:
static void onClickRelease(void*);
void onClickGroup();
void cbGroupID(LLUUID group_id);
+ static void onClickDeedToGroup(void*);
- void onClickDeedToGroup();
- void onCommitPerm(LLCheckBoxCtrl* ctrl, U8 field, U32 perm);
- void onCommitGroupShare();
- void onCommitEveryoneMove();
- void onCommitEveryoneCopy();
- void onCommitNextOwnerModify();
- void onCommitNextOwnerCopy();
- void onCommitNextOwnerTransfer();
- void onCommitName();
- void onCommitDesc();
- void onCommitSaleInfo();
- void onCommitSaleType();
-
- void onCommitClickAction(U8 click_action);
- void onCommitIncludeInSearch();
+ static void onCommitPerm(LLUICtrl *ctrl, void *data, U8 field, U32 perm);
+ static void onCommitGroupShare(LLUICtrl *ctrl, void *data);
+
+ static void onCommitEveryoneMove(LLUICtrl *ctrl, void *data);
+ static void onCommitEveryoneCopy(LLUICtrl *ctrl, void *data);
+
+ static void onCommitNextOwnerModify(LLUICtrl* ctrl, void* data);
+ static void onCommitNextOwnerCopy(LLUICtrl* ctrl, void* data);
+ static void onCommitNextOwnerTransfer(LLUICtrl* ctrl, void* data);
+
+ static void onCommitName(LLUICtrl* ctrl, void* data);
+ static void onCommitDesc(LLUICtrl* ctrl, void* data);
+
+ static void onCommitSaleInfo(LLUICtrl* ctrl, void* data);
+ static void onCommitSaleType(LLUICtrl* ctrl, void* data);
void setAllSaleInfo();
- static void onClickForSale(LLUICtrl* ctrl, void *data);
- void updateUIFromSaleInfo();
+ static void onCommitClickAction(LLUICtrl* ctrl, void* data);
+ static void onCommitIncludeInSearch(LLUICtrl* ctrl, void*);
+ static void doClickAction(U8 click_action);
void disableAll();
private:
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 5edc4804ca..fd39bde118 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -119,6 +119,9 @@ LLSpeakButton::LLSpeakButton(const Params& p)
// never show "muted" because you can't mute yourself
mOutputMonitor->setIsMuted(false);
mOutputMonitor->setIsAgentControl(true);
+
+ //*TODO find a better place to do that
+ LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1));
}
LLSpeakButton::~LLSpeakButton()
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 261bdbcfc0..3861a96355 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llappviewer.h"
+#include "llimview.h"
#include "llmutelist.h"
#include "llsdutil.h"
#include "lluicolortable.h"
@@ -575,6 +576,143 @@ void LLIMSpeakerMgr::updateSpeakers(const LLSD& update)
}
}
+class ModerationResponder : public LLHTTPClient::Responder
+{
+public:
+ ModerationResponder(const LLUUID& session_id)
+ {
+ mSessionID = session_id;
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ llwarns << status << ": " << reason << llendl;
+
+ if ( gIMMgr )
+ {
+ //403 == you're not a mod
+ //should be disabled if you're not a moderator
+ if ( 403 == status )
+ {
+ gIMMgr->showSessionEventError(
+ "mute",
+ "not_a_mod_error",
+ mSessionID);
+ }
+ else
+ {
+ gIMMgr->showSessionEventError(
+ "mute",
+ "generic_request_error",
+ mSessionID);
+ }
+ }
+ }
+
+private:
+ LLUUID mSessionID;
+};
+
+void LLIMSpeakerMgr::toggleAllowTextChat(const LLUUID& speaker_id)
+{
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "mute update";
+ data["session-id"] = getSessionID();
+ data["params"] = LLSD::emptyMap();
+ data["params"]["agent_id"] = speaker_id;
+ data["params"]["mute_info"] = LLSD::emptyMap();
+ //current value represents ability to type, so invert
+ data["params"]["mute_info"]["text"] = !findSpeaker(speaker_id)->mModeratorMutedText;
+
+ LLHTTPClient::post(url, data, new ModerationResponder(getSessionID()));
+}
+
+void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute)
+{
+ if (gAgentID == avatar_id) return; // do not process myself
+
+ LLPointer<LLSpeaker> speakerp = findSpeaker(avatar_id);
+ if (!speakerp) return;
+
+ // *NOTE: mantipov: probably this condition will be incorrect when avatar will be blocked for
+ // text chat via moderation (LLSpeaker::mModeratorMutedText == TRUE)
+ bool is_in_voice = speakerp->mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || speakerp->mStatus == LLSpeaker::STATUS_MUTED;
+
+ // do not send voice moderation changes for avatars not in voice channel
+ if (!is_in_voice) return;
+
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "mute update";
+ data["session-id"] = getSessionID();
+ data["params"] = LLSD::emptyMap();
+ data["params"]["agent_id"] = avatar_id;
+ data["params"]["mute_info"] = LLSD::emptyMap();
+ data["params"]["mute_info"]["voice"] = !unmute;
+
+ LLHTTPClient::post(
+ url,
+ data,
+ new ModerationResponder(getSessionID()));
+}
+
+void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else)
+{
+ // *TODO: mantipov: add more intellectual processing of several following requests if it is needed.
+ /*
+ Such situation should be tested:
+ "Moderator sends the same second request before first response is come"
+ Moderator sends "mute everyone else" for A and then for B
+ two requests to disallow voice chat are sent
+ UUID of B is stored.
+ Then first response (to disallow voice chat) is come
+ request to allow voice for stored avatar (B)
+ Then second response (to disallow voice chat) is come
+ have nothing to do, the latest selected speaker is already enabled
+
+ What can happen?
+ If request to allow voice for stored avatar (B) is processed on server BEFORE
+ second request to disallow voice chat all speakers will be disabled on voice.
+ But I'm not sure such situation is possible.
+ See EXT-3431.
+ */
+
+ mReverseVoiceModeratedAvatarID = excluded_avatar_id;
+ moderateVoiceSession(getSessionID(), !unmute_everyone_else);
+}
+
+void LLIMSpeakerMgr::processSessionUpdate(const LLSD& session_update)
+{
+ if (mReverseVoiceModeratedAvatarID.isNull()) return;
+
+ if (session_update.has("moderated_mode") &&
+ session_update["moderated_mode"].has("voice"))
+ {
+ BOOL voice_moderated = session_update["moderated_mode"]["voice"];
+
+ moderateVoiceParticipant(mReverseVoiceModeratedAvatarID, voice_moderated);
+
+ mReverseVoiceModeratedAvatarID = LLUUID::null;
+ }
+}
+
+void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallow_voice)
+{
+ std::string url = gAgent.getRegion()->getCapability("ChatSessionRequest");
+ LLSD data;
+ data["method"] = "session update";
+ data["session-id"] = session_id;
+ data["params"] = LLSD::emptyMap();
+
+ data["params"]["update_info"] = LLSD::emptyMap();
+
+ data["params"]["update_info"]["moderated_mode"] = LLSD::emptyMap();
+ data["params"]["update_info"]["moderated_mode"]["voice"] = disallow_voice;
+
+ LLHTTPClient::post(url, data, new ModerationResponder(session_id));
+}
+
//
// LLActiveSpeakerMgr
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index 04046a8587..1a8c23f56a 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -158,8 +158,43 @@ public:
void updateSpeakers(const LLSD& update);
void setSpeakers(const LLSD& speakers);
+
+ void toggleAllowTextChat(const LLUUID& speaker_id);
+
+ /**
+ * Mutes/Unmutes avatar for current group voice chat.
+ *
+ * It only marks avatar as muted for session and does not use local Agent's Block list.
+ * It does not mute Agent itself.
+ *
+ * @param[in] avatar_id UUID of avatar to be processed
+ * @param[in] unmute if false - specified avatar will be muted, otherwise - unmuted.
+ *
+ * @see moderateVoiceOtherParticipants()
+ */
+ void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
+
+ /**
+ * Mutes/Unmutes all avatars except specified for current group voice chat.
+ *
+ * It only marks avatars as muted for session and does not use local Agent's Block list.
+ * It based call moderateVoiceParticipant() for each avatar should be muted/unmuted.
+ *
+ * @param[in] excluded_avatar_id UUID of avatar NOT to be processed
+ * @param[in] unmute_everyone_else if false - avatars will be muted, otherwise - unmuted.
+ *
+ * @see moderateVoiceParticipant()
+ */
+ void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else);
+
+ void processSessionUpdate(const LLSD& session_update);
+
protected:
virtual void updateSpeakerList();
+
+ void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
+
+ LLUUID mReverseVoiceModeratedAvatarID;
};
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 539673ab9e..73e7d99815 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -1634,11 +1634,15 @@ bool idle_startup()
gSavedSettings.setString("TutorialURL", tutorial_url.asString());
}
- LLSD use_tutorial = (*it)["use_tutorial"];
- if(use_tutorial.asString() == "true")
- {
- show_hud = true;
- }
+ // For Viewer 2.0 we are not using the web-based tutorial
+ // If we reverse that decision, put this code back and use
+ // login.cgi to send a different URL with content that matches
+ // the Viewer 2.0 UI.
+ //LLSD use_tutorial = (*it)["use_tutorial"];
+ //if(use_tutorial.asString() == "true")
+ //{
+ // show_hud = true;
+ //}
}
}
// Either we want to show tutorial because this is the first login
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index ea49f9c32e..26f9824f9c 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -32,6 +32,8 @@
#include "llviewerprecompiledheaders.h" // must be first include
+#include "llagent.h"
+
#include "llflatlistview.h"
#include "llfloaterreg.h"
#include "llnotifications.h"
@@ -46,6 +48,8 @@
#include "llchiclet.h"
#include "lltoastpanel.h"
#include "llnotificationmanager.h"
+#include "llnotificationsutil.h"
+#include "llspeakers.h"
//---------------------------------------------------------------------------------
LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLDockableFloater(NULL, key),
@@ -348,6 +352,8 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
}
// Initialize chiclet.
+ mChiclet->setChicletSizeChangedCallback(boost::bind(&LLIMWellWindow::RowPanel::onChicletSizeChanged, this, mChiclet, _2));
+ mChiclet->enableCounterControl(true);
mChiclet->setCounter(chicletCounter);
mChiclet->setSessionId(sessionId);
mChiclet->setIMSessionName(name);
@@ -362,6 +368,16 @@ LLIMWellWindow::RowPanel::RowPanel(const LLSysWellWindow* parent, const LLUUID&
}
//---------------------------------------------------------------------------------
+void LLIMWellWindow::RowPanel::onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param)
+{
+ LLTextBox* text = getChild<LLTextBox>("contact_name");
+ S32 new_text_left = mChiclet->getRect().mRight + CHICLET_HPAD;
+ LLRect text_rect = text->getRect();
+ text_rect.mLeft = new_text_left;
+ text->setRect(text_rect);
+}
+
+//---------------------------------------------------------------------------------
LLIMWellWindow::RowPanel::~RowPanel()
{
}
@@ -608,6 +624,23 @@ void LLNotificationWellWindow::addItem(LLSysWellItem::Params p)
}
}
+void LLNotificationWellWindow::closeAll()
+{
+ // Need to clear notification channel, to add storable toasts into the list.
+ clearScreenChannels();
+ std::vector<LLPanel*> items;
+ mMessageList->getItems(items);
+ for (std::vector<LLPanel*>::iterator
+ iter = items.begin(),
+ iter_end = items.end();
+ iter != iter_end; ++iter)
+ {
+ LLSysWellItem* sys_well_item = dynamic_cast<LLSysWellItem*>(*iter);
+ if (sys_well_item)
+ onItemClose(sys_well_item);
+ }
+}
+
//////////////////////////////////////////////////////////////////////////
// PRIVATE METHODS
void LLNotificationWellWindow::initChannel()
@@ -709,15 +742,15 @@ BOOL LLIMWellWindow::postBuild()
void LLIMWellWindow::sessionAdded(const LLUUID& session_id,
const std::string& name, const LLUUID& other_participant_id)
{
- if (mMessageList->getItemByValue(session_id) == NULL)
- {
- S32 chicletCounter = LLIMModel::getInstance()->getNumUnread(session_id);
- if (chicletCounter > -1)
- {
- addIMRow(session_id, chicletCounter, name, other_participant_id);
- reshapeWindow();
- }
- }
+ if (mMessageList->getItemByValue(session_id)) return;
+
+ // For im sessions started as voice call chiclet gets created on the first incoming message
+ if (gIMMgr->isVoiceCall(session_id)) return;
+
+ if (!gIMMgr->hasSession(session_id)) return;
+
+ addIMRow(session_id, 0, name, other_participant_id);
+ reshapeWindow();
}
//virtual
@@ -857,4 +890,112 @@ void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
}
}
+
+void LLIMWellWindow::addIMRow(const LLUUID& session_id)
+{
+ if (hasIMRow(session_id)) return;
+
+ LLIMModel* im_model = LLIMModel::getInstance();
+ addIMRow(session_id, 0, im_model->getName(session_id), im_model->getOtherParticipantID(session_id));
+ reshapeWindow();
+}
+
+bool LLIMWellWindow::hasIMRow(const LLUUID& session_id)
+{
+ return mMessageList->getItemByValue(session_id);
+}
+
+void LLIMWellWindow::onNewIM(const LLSD& data)
+{
+ LLUUID from_id = data["from_id"];
+ if (from_id.isNull() || gAgentID == from_id) return;
+
+ LLUUID session_id = data["session_id"];
+ if (session_id.isNull()) return;
+
+ if (!gIMMgr->isVoiceCall(session_id)) return;
+
+ if (hasIMRow(session_id)) return;
+
+ //first real message, time to create chiclet
+ addIMRow(session_id);
+}
+
+
+void LLIMWellWindow::closeAll()
+{
+ // Generate an ignorable alert dialog if there is an active voice IM sesion
+ bool need_confirmation = false;
+ const LLIMModel& im_model = LLIMModel::instance();
+ std::vector<LLSD> values;
+ mMessageList->getValues(values);
+ for (std::vector<LLSD>::iterator
+ iter = values.begin(),
+ iter_end = values.end();
+ iter != iter_end; ++iter)
+ {
+ LLIMSpeakerMgr* speaker_mgr = im_model.getSpeakerManager(*iter);
+ if (speaker_mgr && speaker_mgr->isVoiceActive())
+ {
+ need_confirmation = true;
+ break;
+ }
+ }
+ if ( need_confirmation )
+ {
+ //Bring up a confirmation dialog
+ LLNotificationsUtil::add
+ ("ConfirmCloseAll", LLSD(), LLSD(),
+ boost::bind(&LLIMWellWindow::confirmCloseAll, this, _1, _2));
+ }
+ else
+ {
+ closeAllImpl();
+ }
+}
+
+void LLIMWellWindow::closeAllImpl()
+{
+ std::vector<LLSD> values;
+ mMessageList->getValues(values);
+
+ for (std::vector<LLSD>::iterator
+ iter = values.begin(),
+ iter_end = values.end();
+ iter != iter_end; ++iter)
+ {
+ LLPanel* panel = mMessageList->getItemByValue(*iter);
+
+ RowPanel* im_panel = dynamic_cast <RowPanel*> (panel);
+ if (im_panel)
+ {
+ gIMMgr->leaveSession(*iter);
+ continue;
+ }
+
+ ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel);
+ if (obj_panel)
+ {
+ LLScriptFloaterManager::instance()
+ .removeNotificationByObjectId(*iter);
+ }
+ }
+}
+
+bool LLIMWellWindow::confirmCloseAll(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ switch(option)
+ {
+ case 0:
+ {
+ closeAllImpl();
+ return true;
+ }
+ default:
+ break;
+ }
+ return false;
+}
+
// EOF
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index fea145a17e..6cfa25b84d 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -147,6 +147,9 @@ public:
// Operating with items
void addItem(LLSysWellItem::Params p);
+ // Closes all notifications and removes them from the Notification Well
+ void closeAll();
+
protected:
/*virtual*/ const std::string& getAnchorViewName() { return NOTIFICATION_WELL_ANCHOR_NAME; }
@@ -188,9 +191,16 @@ public:
/*virtual*/ void sessionRemoved(const LLUUID& session_id);
/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
+ void onNewIM(const LLSD& data);
+
void addObjectRow(const LLUUID& object_id, bool new_message = false);
void removeObjectRow(const LLUUID& object_id);
+ void addIMRow(const LLUUID& session_id);
+ bool hasIMRow(const LLUUID& session_id);
+
+ void closeAll();
+
protected:
/*virtual*/ const std::string& getAnchorViewName() { return IM_WELL_ANCHOR_NAME; }
@@ -200,7 +210,8 @@ private:
void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
void delIMRow(const LLUUID& sessionId);
-
+ bool confirmCloseAll(const LLSD& notification, const LLSD& response);
+ void closeAllImpl();
/**
* Scrolling row panel.
@@ -215,6 +226,8 @@ private:
void onMouseLeave(S32 x, S32 y, MASK mask);
BOOL handleMouseDown(S32 x, S32 y, MASK mask);
private:
+ static const S32 CHICLET_HPAD = 10;
+ void onChicletSizeChanged(LLChiclet* ctrl, const LLSD& param);
void onClosePanel();
public:
LLIMChiclet* mChiclet;
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 9f69ed3964..83e0b53960 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -448,6 +448,7 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
mFormattedImage = NULL;
clearPackets();
unlockWorkMutex();
+ mFetcher->removeFromHTTPQueue(mID);
}
void LLTextureFetchWorker::clearPackets()
@@ -821,6 +822,13 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mFormattedImage.notNull())
{
cur_size = mFormattedImage->getDataSize(); // amount of data we already have
+ if (mFormattedImage->getDiscardLevel() == 0)
+ {
+ // We already have all the data, just decode it
+ mLoadedDiscard = mFormattedImage->getDiscardLevel();
+ mState = DECODE_IMAGE;
+ return false;
+ }
}
mRequestedSize = mDesiredSize;
mRequestedDiscard = mDesiredDiscard;
@@ -871,26 +879,16 @@ bool LLTextureFetchWorker::doWork(S32 param)
llinfos << "HTTP GET failed for: " << mUrl
<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
- if (cur_size == 0)
+ ++mHTTPFailCount;
+ if (mHTTPFailCount >= max_attempts)
{
- ++mHTTPFailCount;
- if (mHTTPFailCount >= max_attempts)
- {
- resetFormattedData();
- return true; // failed
- }
- else
- {
- mState = SEND_HTTP_REQ;
- return false; // retry
- }
+ resetFormattedData();
+ return true; // failed
}
else
{
- // mFormattedImage gauranteed to not be NULL since cur_size != 0
- mLoadedDiscard = mFormattedImage->getDiscardLevel();
- mState = DECODE_IMAGE;
- return false; // use what we have
+ mState = SEND_HTTP_REQ;
+ return false; // retry
}
}
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index b6e20608eb..9573b884eb 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -494,7 +494,7 @@ void LLGLTexMemBar::draw()
#endif
//----------------------------------------------------------------------------
- text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d HTP:%d",
+ text = llformat("Textures: %d Fetch: %d(%d) Pkts:%d(%d) Cache R/W: %d/%d LFS:%d IW:%d RAW:%d HTP:%d CRE:%d",
gTextureList.getNumImages(),
LLAppViewer::getTextureFetch()->getNumRequests(), LLAppViewer::getTextureFetch()->getNumDeletes(),
LLAppViewer::getTextureFetch()->mPacketCount, LLAppViewer::getTextureFetch()->mBadPacketCount,
@@ -502,7 +502,8 @@ void LLGLTexMemBar::draw()
LLLFSThread::sLocal->getPending(),
LLAppViewer::getImageDecodeThread()->getPending(),
LLImageRaw::sRawImageCount,
- LLAppViewer::getTextureFetch()->getNumHTTPRequests());
+ LLAppViewer::getTextureFetch()->getNumHTTPRequests(),
+ gTextureList.mCreateTextureList.size());
LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, h_offset + line_height*2,
text_color, LLFontGL::LEFT, LLFontGL::TOP);
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index f3db0ab170..57434bd1e4 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -72,6 +72,8 @@
#include "llrender.h"
#include "llbottomtray.h"
#include "llnavigationbar.h"
+#include "llfloatertools.h"
+#include "llpaneloutfitsinventory.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
@@ -119,12 +121,6 @@ static bool handleSetShaderChanged(const LLSD& newvalue)
return true;
}
-static bool handleSetSelfInvisible( const LLSD& newvalue)
-{
- LLVOAvatarSelf::onChangeSelfInvisible( newvalue.asBoolean() );
- return true;
-}
-
static bool handleReleaseGLBufferChanged(const LLSD& newvalue)
{
if (gPipeline.isInit())
@@ -525,6 +521,18 @@ bool toggle_show_favorites_panel(const LLSD& newvalue)
return true;
}
+bool toggle_show_appearance_editor(const LLSD& newvalue)
+{
+ LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean();
+ return true;
+}
+
+bool toggle_show_object_render_cost(const LLSD& newvalue)
+{
+ LLFloaterTools::sShowObjectCost = newvalue.asBoolean();
+ return true;
+}
+
////////////////////////////////////////////////////////////////////////////
void settings_setup_listeners()
@@ -545,7 +553,6 @@ void settings_setup_listeners()
gSavedSettings.getControl("WindLightUseAtmosShaders")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderGammaFull")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("RenderAvatarMaxVisible")->getSignal()->connect(boost::bind(&handleAvatarMaxVisibleChanged, _2));
- gSavedSettings.getControl("RenderAvatarInvisible")->getSignal()->connect(boost::bind(&handleSetSelfInvisible, _2));
gSavedSettings.getControl("RenderVolumeLODFactor")->getSignal()->connect(boost::bind(&handleVolumeLODChanged, _2));
gSavedSettings.getControl("RenderAvatarLODFactor")->getSignal()->connect(boost::bind(&handleAvatarLODChanged, _2));
gSavedSettings.getControl("RenderTerrainLODFactor")->getSignal()->connect(boost::bind(&handleTerrainLODChanged, _2));
@@ -668,6 +675,8 @@ void settings_setup_listeners()
gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&toggle_show_snapshot_button, _2));
gSavedSettings.getControl("ShowNavbarNavigationPanel")->getSignal()->connect(boost::bind(&toggle_show_navigation_panel, _2));
gSavedSettings.getControl("ShowNavbarFavoritesPanel")->getSignal()->connect(boost::bind(&toggle_show_favorites_panel, _2));
+ gSavedSettings.getControl("ShowDebugAppearanceEditor")->getSignal()->connect(boost::bind(&toggle_show_appearance_editor, _2));
+ gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 103a70e032..df62c9628d 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -160,36 +160,25 @@ public:
std::string media_type = content["content-type"].asString();
std::string::size_type idx1 = media_type.find_first_of(";");
std::string mime_type = media_type.substr(0, idx1);
- completeAny(status, mime_type);
- }
- virtual void error( U32 status, const std::string& reason )
- {
- if(status == 401)
- {
- // This is the "you need to authenticate" status.
- // Treat this like an html page.
- completeAny(status, "text/html");
- }
- else
- if(status == 403)
- {
- completeAny(status, "text/html");
- }
- else
- if(status == 404)
- {
- // 404 is content not found - sites often have bespoke 404 pages so
- // treat them like an html page.
- completeAny(status, "text/html");
- }
- else
- if(status == 406)
+ lldebugs << "status is " << status << ", media type \"" << media_type << "\"" << llendl;
+
+ // 2xx status codes indicate success.
+ // Most 4xx status codes are successful enough for our purposes.
+ // 499 is the error code for host not found, timeout, etc.
+ if( ((status >= 200) && (status < 300)) ||
+ ((status >= 400) && (status < 499)) )
{
- // 406 means the server sent something that we didn't indicate was acceptable
- // Eventually we should send what we accept in the headers but for now,
- // treat 406s like an html page.
- completeAny(status, "text/html");
+ // The probe was successful.
+
+ if(mime_type.empty())
+ {
+ // Some sites don't return any content-type header at all.
+ // Treat an empty mime type as text/html.
+ mime_type = "text/html";
+ }
+
+ completeAny(status, mime_type);
}
else
{
@@ -200,6 +189,7 @@ public:
mMediaImpl->mMediaSourceFailed = true;
}
}
+
}
void completeAny(U32 status, const std::string& mime_type)
@@ -582,8 +572,8 @@ bool LLViewerMedia::isInterestingEnough(const LLVOVolume *object, const F64 &obj
}
else
{
- llinfos << "object interest = " << object_interest << ", lowest loadable = " << sLowestLoadableImplInterest << llendl;
- if(object_interest > sLowestLoadableImplInterest)
+ lldebugs << "object interest = " << object_interest << ", lowest loadable = " << sLowestLoadableImplInterest << llendl;
+ if(object_interest >= sLowestLoadableImplInterest)
result = true;
}
@@ -929,6 +919,7 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mMimeTypeProbe(NULL),
mMediaAutoPlay(false),
mInNearbyMediaList(false),
+ mClearCache(false),
mIsUpdated(false)
{
@@ -1139,6 +1130,12 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent());
media_source->focus(mHasFocus);
+ if(mClearCache)
+ {
+ mClearCache = false;
+ media_source->clear_cache();
+ }
+
mMediaSource = media_source;
updateVolume();
@@ -1352,6 +1349,19 @@ std::string LLViewerMediaImpl::getCurrentMediaURL()
}
//////////////////////////////////////////////////////////////////////////////////////////
+void LLViewerMediaImpl::clearCache()
+{
+ if(mMediaSource)
+ {
+ mMediaSource->clear_cache();
+ }
+ else
+ {
+ mClearCache = true;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
void LLViewerMediaImpl::mouseDown(S32 x, S32 y, MASK mask, S32 button)
{
scaleMouse(&x, &y);
@@ -1633,7 +1643,12 @@ void LLViewerMediaImpl::navigateInternal()
if(scheme.empty() || "http" == scheme || "https" == scheme)
{
- LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), 10.0f);
+ // If we don't set an Accept header, LLHTTPClient will add one like this:
+ // Accept: application/llsd+xml
+ // which is really not what we want.
+ LLSD headers = LLSD::emptyMap();
+ headers["Accept"] = "*/*";
+ LLHTTPClient::getHeaderOnly( mMediaURL, new LLMimeDiscoveryResponder(this), headers, 10.0f);
}
else if("data" == scheme || "file" == scheme || "about" == scheme)
{
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index 7151186089..28fb379960 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -188,6 +188,7 @@ public:
std::string getCurrentMediaURL();
std::string getHomeURL() { return mHomeURL; }
void setHomeURL(const std::string& home_url) { mHomeURL = home_url; };
+ void clearCache();
std::string getMimeType() { return mMimeType; }
void scaleMouse(S32 *mouse_x, S32 *mouse_y);
void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y);
@@ -355,6 +356,7 @@ public:
bool mMediaAutoPlay;
std::string mMediaEntryURL;
bool mInNearbyMediaList; // used by LLFloaterNearbyMedia::refreshList() for performance reasons
+ bool mClearCache;
private:
BOOL mIsUpdated ;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index e04a54fbd6..a0ac9c2091 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -51,6 +51,7 @@
#include "llkeyboard.h"
#include "lltoolmgr.h"
#include "llvovolume.h"
+#include "llhelp.h"
//
// LLViewerMediaFocus
@@ -302,7 +303,7 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
{
media_impl->handleKeyHere(key, mask);
- if (key == KEY_ESCAPE)
+ if (KEY_ESCAPE == key)
{
// Reset camera zoom in this case.
if(mFocusedImplID.notNull())
@@ -315,6 +316,15 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent)
clearFocus();
}
+
+ if ( KEY_F1 == key && LLUI::sHelpImpl && mMediaControls.get())
+ {
+ std::string help_topic;
+ if (mMediaControls.get()->findHelpTopic(help_topic))
+ {
+ LLUI::sHelpImpl->showTopic(help_topic);
+ }
+ }
}
return true;
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 0be0b56bc3..23bcca9603 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -56,6 +56,7 @@
#include "llfloatercustomize.h"
#include "llfloaterchatterbox.h"
#include "llfloatergodtools.h"
+#include "llfloaterinventory.h"
#include "llfloaterland.h"
#include "llfloaterpay.h"
#include "llfloaterreporter.h"
@@ -438,6 +439,12 @@ void init_menus()
// menu holder appears on top of menu bar so you can see the menu title
// flash when an item is triggered (the flash occurs in the holder)
gViewerWindow->getRootView()->addChild(gMenuHolder);
+
+ // This removes tool tip view from main view and adds it
+ // to root view in front of menu holder.
+ // Otherwise tool tips for menu items would be overlapped by menu, since
+ // main view is behind of menu holder now.
+ gViewerWindow->getRootView()->addChild(gToolTipView);
gViewerWindow->setMenuBackgroundColor(false,
LLViewerLogin::getInstance()->isInProductionGrid());
@@ -633,6 +640,20 @@ class LLAdvancedCheckHUDInfo : public view_listener_t
}
};
+
+//////////////
+// FLYING //
+//////////////
+
+class LLAdvancedAgentFlyingInfo : public view_listener_t
+{
+ bool handleEvent(const LLSD&)
+ {
+ return gAgent.getFlying();
+ }
+};
+
+
///////////////////////
// CLEAR GROUP CACHE //
///////////////////////
@@ -2529,8 +2550,6 @@ void handle_object_edit()
void handle_object_inspect()
{
- // Disable sidepanel inspector
- /*
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
LLViewerObject* selected_objectp = selection->getFirstRootObject();
if (selected_objectp)
@@ -2539,9 +2558,11 @@ void handle_object_inspect()
key["task"] = "task";
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
- */
+ /*
+ // Old floater properties
LLFloaterReg::showInstance("inspect", LLSD());
+ */
}
//---------------------------------------------------------------------------
@@ -2640,7 +2661,7 @@ bool enable_object_edit()
enable = LLViewerParcelMgr::getInstance()->allowAgentBuild()
|| LLSelectMgr::getInstance()->getSelection()->isAttachment();
}
- else if (LLSelectMgr::getInstance()->selectGetModify())
+ else if (LLSelectMgr::getInstance()->selectGetAllValidAndObjectsFound())
{
enable = true;
}
@@ -5520,47 +5541,27 @@ void handle_viewer_disable_message_log(void*)
gMessageSystem->stopLogging();
}
-class LLShowFloater : public view_listener_t
+void handle_customize_avatar()
{
- bool handleEvent(const LLSD& userdata)
+ if (gAgentWearables.areWearablesLoaded())
{
- std::string floater_name = userdata.asString();
- if (floater_name == "appearance")
- {
- if (gAgentWearables.areWearablesLoaded())
- {
- gAgent.changeCameraToCustomizeAvatar();
- }
- }
- else if (floater_name == "toolbar")
- {
- LLToolBar::toggle(NULL);
- }
- else if (floater_name == "buy land")
- {
- handle_buy_land();
- }
- else if (floater_name == "script errors")
- {
- LLFloaterScriptDebug::show(LLUUID::null);
- }
- else if (floater_name == "complaint reporter")
- {
- // Prevent menu from appearing in screen shot.
- gMenuHolder->hideMenus();
- LLFloaterReporter::showFromMenu(COMPLAINT_REPORT);
- }
- else if (floater_name == "buy currency")
- {
- LLFloaterBuyCurrency::buyCurrency();
- }
- else
- {
- LLFloaterReg::toggleInstance(floater_name);
- }
- return true;
+ gAgent.changeCameraToCustomizeAvatar();
}
-};
+}
+
+void handle_report_abuse()
+{
+ // Prevent menu from appearing in screen shot.
+ gMenuHolder->hideMenus();
+ LLFloaterReporter::showFromMenu(COMPLAINT_REPORT);
+}
+
+void handle_buy_currency()
+{
+ LLFloaterBuyCurrency::buyCurrency();
+}
+
+
class LLFloaterVisible : public view_listener_t
{
@@ -5568,11 +5569,6 @@ class LLFloaterVisible : public view_listener_t
{
std::string floater_name = userdata.asString();
bool new_value = false;
- if (floater_name == "toolbar")
- {
- new_value = LLToolBar::visible(NULL);
- }
- else
{
new_value = LLFloaterReg::instanceVisible(floater_name);
}
@@ -5596,7 +5592,15 @@ class LLShowSidetrayPanel : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string panel_name = userdata.asString();
- LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ // Open up either the sidepanel or new floater.
+ if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ {
+ LLFloaterInventory::showAgentInventory();
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ }
return true;
}
};
@@ -5851,47 +5855,68 @@ void confirm_replace_attachment(S32 option, void* user_data)
}
}
-class LLAttachmentDrop : public view_listener_t
+bool callback_attachment_drop(const LLSD& notification, const LLSD& response)
{
- bool handleEvent(const LLSD& userdata)
+ // Called when the user clicked on an object attached to them
+ // and selected "Drop".
+ LLUUID object_id = notification["payload"]["object_id"].asUUID();
+ LLViewerObject *object = gObjectList.findObject(object_id);
+
+ if (!object)
{
- // Called when the user clicked on an object attached to them
- // and selected "Drop".
- LLViewerObject *object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- if (!object)
- {
- llwarns << "handle_drop_attachment() - no object to drop" << llendl;
- return true;
- }
+ llwarns << "handle_drop_attachment() - no object to drop" << llendl;
+ return true;
+ }
- LLViewerObject *parent = (LLViewerObject*)object->getParent();
- while (parent)
+ LLViewerObject *parent = (LLViewerObject*)object->getParent();
+ while (parent)
+ {
+ if(parent->isAvatar())
{
- if(parent->isAvatar())
- {
- break;
- }
- object = parent;
- parent = (LLViewerObject*)parent->getParent();
+ break;
}
+ object = parent;
+ parent = (LLViewerObject*)parent->getParent();
+ }
- if (!object)
+ if (!object)
+ {
+ llwarns << "handle_detach() - no object to detach" << llendl;
+ return true;
+ }
+
+ if (object->isAvatar())
+ {
+ llwarns << "Trying to detach avatar from avatar." << llendl;
+ return true;
+ }
+
+ // reselect the object
+ LLSelectMgr::getInstance()->selectObjectAndFamily(object);
+
+ LLSelectMgr::getInstance()->sendDropAttachment();
+
+ return true;
+}
+
+class LLAttachmentDrop : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLSD payload;
+ LLViewerObject *object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+
+ if (object)
{
- llwarns << "handle_detach() - no object to detach" << llendl;
- return true;
+ payload["object_id"] = object->getID();
}
-
- if (object->isAvatar())
+ else
{
- llwarns << "Trying to detach avatar from avatar." << llendl;
+ llwarns << "Drop object not found" << llendl;
return true;
}
- // The sendDropAttachment() method works on the list of selected
- // objects. Thus we need to clear the list, make sure it only
- // contains the object the user clicked, send the message,
- // then clear the list.
- LLSelectMgr::getInstance()->sendDropAttachment();
+ LLNotificationsUtil::add("AttachmentDrop", LLSD(), payload, &callback_attachment_drop);
return true;
}
};
@@ -7607,6 +7632,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
+ commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar));
// View menu
view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook");
@@ -7703,6 +7729,9 @@ void initialize_menus()
// Advanced Other Settings
view_listener_t::addMenu(new LLAdvancedClearGroupCache(), "Advanced.ClearGroupCache");
+ // Advanced > Shortcuts
+ view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying");
+
// Advanced > Render > Types
view_listener_t::addMenu(new LLAdvancedToggleRenderType(), "Advanced.ToggleRenderType");
view_listener_t::addMenu(new LLAdvancedCheckRenderType(), "Advanced.CheckRenderType");
@@ -7931,9 +7960,11 @@ void initialize_menus()
view_listener_t::addMenu(new LLLandEdit(), "Land.Edit");
view_listener_t::addMenu(new LLLandEnableBuyPass(), "Land.EnableBuyPass");
+ commit.add("Land.Buy", boost::bind(&handle_buy_land));
// Generic actions
- view_listener_t::addMenu(new LLShowFloater(), "ShowFloater");
+ commit.add("ReportAbuse", boost::bind(&handle_report_abuse));
+ commit.add("BuyCurrency", boost::bind(&handle_buy_currency));
view_listener_t::addMenu(new LLShowHelp(), "ShowHelp");
view_listener_t::addMenu(new LLPromptShowURL(), "PromptShowURL");
view_listener_t::addMenu(new LLShowAgentProfile(), "ShowAgentProfile");
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 48794bbc1a..6bad8843fd 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -40,12 +40,12 @@
#include "llfloaterreg.h"
#include "llfloaterbuycurrency.h"
#include "llfloatersnapshot.h"
-#include "llimage.h"
-#include "llimagebmp.h"
-#include "llimagepng.h"
-#include "llimagej2c.h"
-#include "llimagejpeg.h"
-#include "llimagetga.h"
+#include "llimage.h"
+#include "llimagebmp.h"
+#include "llimagepng.h"
+#include "llimagej2c.h"
+#include "llimagejpeg.h"
+#include "llimagetga.h"
#include "llinventorymodel.h" // gInventory
#include "llresourcedata.h"
#include "llfloaterperms.h"
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index ea40f2aae1..6a31bbfa1e 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1078,6 +1078,28 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
gCacheName->get(mFromID, mFromGroup, boost::bind(&inventory_offer_mute_callback,_1,_2,_3,_4,this));
}
+ // *NOTE dzaporozhan
+ // Restored from viewer-1-23 to fix EXT-3520
+ // Saves Group Notice Attachments to inventory.
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_ImprovedInstantMessage);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_MessageBlock);
+ msg->addBOOLFast(_PREHASH_FromGroup, FALSE);
+ msg->addUUIDFast(_PREHASH_ToAgentID, mFromID);
+ msg->addU8Fast(_PREHASH_Offline, IM_ONLINE);
+ msg->addUUIDFast(_PREHASH_ID, mTransactionID);
+ msg->addU32Fast(_PREHASH_Timestamp, NO_TIMESTAMP); // no timestamp necessary
+ std::string name;
+ LLAgentUI::buildFullname(name);
+ msg->addStringFast(_PREHASH_FromAgentName, name);
+ msg->addStringFast(_PREHASH_Message, "");
+ msg->addU32Fast(_PREHASH_ParentEstateID, 0);
+ msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
+ msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
+
std::string from_string; // Used in the pop-up.
std::string chatHistory_string; // Used in chat history.
@@ -1129,6 +1151,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// Show falls through to accept.
case IOR_ACCEPT:
+ msg->addU8Fast(_PREHASH_Dialog, (U8)(mIM + 1));
+ msg->addBinaryDataFast(_PREHASH_BinaryBucket, &(mFolderID.mData), sizeof(mFolderID.mData));
+ msg->sendReliable(mHost);
+
//don't spam them if they are getting flooded
if (check_offer_throttle(mFromName, true))
{
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index e066546bd8..8252b7df00 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -588,7 +588,7 @@ void LLViewerTextureList::updateImages(F32 max_time)
F32 total_max_time = max_time;
max_time -= updateImagesFetchTextures(max_time);
- max_time = llmax(max_time, total_max_time*.25f); // at least 25% of max_time
+ max_time = llmax(max_time, total_max_time*.50f); // at least 50% of max_time
max_time -= updateImagesCreateTextures(max_time);
if (!mDirtyTextureList.empty())
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index e3de2891a1..6c73cc18db 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -1117,7 +1117,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
{
mActive = FALSE;
- if (gSavedSettings.getBOOL("AllowIdleAFK"))
+ if (gSavedSettings.getS32("AFKTimeout"))
{
gAgent.setAFK();
}
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b4c45c23d4..ecd6b05ded 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2021,43 +2021,6 @@ void LLVOAvatarSelf::onCustomizeEnd()
}
}
-// static
-void LLVOAvatarSelf::onChangeSelfInvisible(BOOL newvalue)
-{
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if (avatarp)
- {
- if (newvalue)
- {
- // we have just requested to set the avatar's baked textures to invisible
- avatarp->setInvisible(TRUE);
- }
- else
- {
- avatarp->setInvisible(FALSE);
- }
- }
-}
-
-void LLVOAvatarSelf::setInvisible(BOOL newvalue)
-{
- if (newvalue)
- {
- setCompositeUpdatesEnabled(FALSE);
- for (U32 i = 0; i < mBakedTextureDatas.size(); i++ )
- {
- setNewBakedTexture(mBakedTextureDatas[i].mTextureIndex, IMG_INVISIBLE);
- }
- gAgent.sendAgentSetAppearance();
- }
- else
- {
- setCompositeUpdatesEnabled(TRUE);
- invalidateAll();
- gAgent.sendAgentSetAppearance();
- }
-}
-
// HACK: this will null out the avatar's local texture IDs before the TE message is sent
// to ensure local texture IDs are not sent to other clients in the area.
// this is a short-term solution. The long term solution will be to not set the texture
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index c7bd4eaadc..dc70996f0b 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -308,8 +308,6 @@ public:
// Visibility
//--------------------------------------------------------------------
public:
- static void onChangeSelfInvisible(BOOL newvalue);
- void setInvisible(BOOL newvalue);
bool sendAppearanceMessage(LLMessageSystem *mesgsys) const;
/** Appearance
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index fd4e7bb91f..69d2458217 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -229,7 +229,6 @@ void LLVoiceChannel::handleStatusChange(EStatusType type)
{
// if forceably removed from channel
// update the UI and revert to default channel
- LLNotificationsUtil::add("VoiceChannelDisconnected", mNotifyArgs);
deactivate();
}
mIgnoreNextSessionLeave = FALSE;
@@ -317,8 +316,6 @@ void LLVoiceChannel::activate()
}
}
- sCurrentVoiceChannelChangedSignal(this->mSessionID);
-
if (mState == STATE_NO_CHANNEL_INFO)
{
// responsible for setting status to active
@@ -328,6 +325,9 @@ void LLVoiceChannel::activate()
{
setState(STATE_CALL_STARTED);
}
+
+ //do not send earlier, channel should be initialized, should not be in STATE_NO_CHANNEL_INFO state
+ sCurrentVoiceChannelChangedSignal(this->mSessionID);
}
void LLVoiceChannel::getChannelInfo()
@@ -741,6 +741,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
case STATUS_LEFT_CHANNEL:
if (callStarted() && !mIgnoreNextSessionLeave && !sSuspended)
{
+ // *TODO: use it to show DECLINE voice notification
if (mState == STATE_RINGING)
{
// other user declined call
@@ -748,8 +749,7 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
}
else
{
- // other user hung up
- LLNotificationsUtil::add("VoiceChannelDisconnectedP2P", mNotifyArgs);
+ // other user hung up
}
deactivate();
}
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index 1889ca78c3..cfa1f05ec0 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -113,23 +113,15 @@ static void setUUIDFromStringHash(LLUUID &uuid, const std::string &str)
static int scale_mic_volume(float volume)
{
// incoming volume has the range [0.0 ... 2.0], with 1.0 as the default.
- // Map it as follows: 0.0 -> 40, 1.0 -> 44, 2.0 -> 75
-
- volume -= 1.0f; // offset volume to the range [-1.0 ... 1.0], with 0 at the default.
- int scaled_volume = 44; // offset scaled_volume by its default level
- if(volume < 0.0f)
- scaled_volume += ((int)(volume * 4.0f)); // (44 - 40)
- else
- scaled_volume += ((int)(volume * 31.0f)); // (75 - 44)
-
- return scaled_volume;
+ // Map it to Vivox levels as follows: 0.0 -> 30, 1.0 -> 50, 2.0 -> 70
+ return 30 + (int)(volume * 20.0f);
}
static int scale_speaker_volume(float volume)
{
// incoming volume has the range [0.0 ... 1.0], with 0.5 as the default.
- // Map it as follows: 0.0 -> 0, 0.5 -> 50, 1.0 -> 100
- return (int)(volume * 100.0f);
+ // Map it to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70
+ return 30 + (int)(volume * 40.0f);
}
class LLViewerVoiceAccountProvisionResponder :
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index d24edacd13..f98aa361e0 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -204,8 +204,8 @@ void LLVOVolume::markDead()
if (!mDead)
{
LLMediaDataClientObject::ptr_t obj = new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false);
- sObjectMediaClient->removeFromQueue(obj);
- sObjectMediaNavigateClient->removeFromQueue(obj);
+ if (sObjectMediaClient) sObjectMediaClient->removeFromQueue(obj);
+ if (sObjectMediaNavigateClient) sObjectMediaNavigateClient->removeFromQueue(obj);
// Detach all media impls from this object
for(U32 i = 0 ; i < mMediaImplList.size() ; i++)
@@ -222,15 +222,18 @@ void LLVOVolume::markDead()
void LLVOVolume::initClass()
{
// gSavedSettings better be around
- const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay");
- const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay");
- const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries");
- const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize");
- const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize");
- sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries,
- max_sorted_queue_size, max_round_robin_queue_size);
- sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay,
- max_retries, max_sorted_queue_size, max_round_robin_queue_size);
+ if (gSavedSettings.getBOOL("PrimMediaMasterEnabled"))
+ {
+ const F32 queue_timer_delay = gSavedSettings.getF32("PrimMediaRequestQueueDelay");
+ const F32 retry_timer_delay = gSavedSettings.getF32("PrimMediaRetryTimerDelay");
+ const U32 max_retries = gSavedSettings.getU32("PrimMediaMaxRetries");
+ const U32 max_sorted_queue_size = gSavedSettings.getU32("PrimMediaMaxSortedQueueSize");
+ const U32 max_round_robin_queue_size = gSavedSettings.getU32("PrimMediaMaxRoundRobinQueueSize");
+ sObjectMediaClient = new LLObjectMediaDataClient(queue_timer_delay, retry_timer_delay, max_retries,
+ max_sorted_queue_size, max_round_robin_queue_size);
+ sObjectMediaNavigateClient = new LLObjectMediaNavigateClient(queue_timer_delay, retry_timer_delay,
+ max_retries, max_sorted_queue_size, max_round_robin_queue_size);
+ }
}
// static
@@ -1719,14 +1722,15 @@ LLVector3 LLVOVolume::getApproximateFaceNormal(U8 face_id)
void LLVOVolume::requestMediaDataUpdate(bool isNew)
{
- sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew));
+ if (sObjectMediaClient)
+ sObjectMediaClient->fetchMedia(new LLMediaDataClientObjectImpl(this, isNew));
}
bool LLVOVolume::isMediaDataBeingFetched() const
{
// I know what I'm doing by const_casting this away: this is just
// a wrapper class that is only going to do a lookup.
- return sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false));
+ return (sObjectMediaClient) ? sObjectMediaClient->isInQueue(new LLMediaDataClientObjectImpl(const_cast<LLVOVolume*>(this), false)) : false;
}
void LLVOVolume::cleanUpMediaImpls()
@@ -1925,7 +1929,7 @@ void LLVOVolume::mediaNavigated(LLViewerMediaImpl *impl, LLPluginClassMedia* plu
// "bounce back" to the current URL from the media entry
mediaNavigateBounceBack(face_index);
}
- else
+ else if (sObjectMediaNavigateClient)
{
llinfos << "broadcasting navigate with URI " << new_location << llendl;
@@ -1994,7 +1998,8 @@ void LLVOVolume::mediaEvent(LLViewerMediaImpl *impl, LLPluginClassMedia* plugin,
void LLVOVolume::sendMediaDataUpdate()
{
- sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false));
+ if (sObjectMediaClient)
+ sObjectMediaClient->updateMedia(new LLMediaDataClientObjectImpl(this, false));
}
void LLVOVolume::removeMediaImpl(S32 texture_index)
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index 0405b9d28b..b789bd3650 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -356,7 +356,7 @@ BOOL LLWearable::importFile( LLFILE* file )
if( num_parameters != mVisualParamIndexMap.size() )
{
- llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. " << llendl;
+ llwarns << "Wearable parameter mismatch. Reading in " << num_parameters << " from file, but created " << mVisualParamIndexMap.size() << " from avatar parameters. type: " << mType << llendl;
}
// parameters
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 82d388ab7e..7a579b248e 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -127,6 +127,7 @@ public:
void setClothesColor( S32 te, const LLColor4& new_color, BOOL upload_bake );
void revertValues();
+ void saveValues();
BOOL isOnTop() const;
@@ -143,7 +144,6 @@ private:
void createLayers(S32 te);
void createVisualParams();
- void saveValues();
void syncImages(te_map_t &src, te_map_t &dst);
void destroyTextures();
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index bd7619f7e5..5636256856 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -249,9 +249,13 @@ LLWearable* LLWearableList::createNewWearable( EWearableType type )
wearable->setParamsToDefaults();
wearable->setTexturesToDefaults();
+ //mark all values (params & images) as saved
+ wearable->saveValues();
+
// Send to the dataserver
wearable->saveNewAsset();
+
return wearable;
}
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index b6995d2122..88e77f11ee 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -60,17 +60,14 @@
name="Red"
value="1 0 0 1" />
<color
- name="Green"
- value="0 1 0 1" />
- <color
name="Blue"
value="0 0 1 1" />
<color
name="Yellow"
value="0.114 0.65 0.1" />
<color
- name="Unused?"
- value="1 0.5 0 1" />
+ name="Green"
+ value="0 .39 .10 1" />
<color
name="Transparent"
value="0 0 0 0" />
@@ -378,7 +375,7 @@
reference="White_25" />
<color
name="InventorySearchStatusColor"
- reference="Black" />
+ reference="EmphasisColor" />
<color
name="LabelDisabledColor"
reference="White_25" />
@@ -435,7 +432,7 @@
reference="DkGray" />
<color
name="MenuBarGodBgColor"
- reference="DkGray2" />
+ reference="Green" />
<color
name="MenuDefaultBgColor"
reference="DkGray2" />
@@ -687,5 +684,7 @@
<color
name="ChatToastAgentNameColor"
reference="EmphasisColor" />
-
+ <color
+ name="ColorSwatchBorderColor"
+ value="0.45098 0.517647 0.607843 1"/>
</colors>
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 0317d55768..412f8b6d68 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -50,8 +50,10 @@ with the same filename but different name
<texture name="Arrow_Right_Off" file_name="navbar/Arrow_Right_Off.png" preload="true" />
<texture name="Arrow_Right_Press" file_name="navbar/Arrow_Right_Press.png" preload="true" />
+<!--
<texture name="Arrow_Left" file_name="widgets/Arrow_Left.png" preload="true" />
<texture name="Arrow_Right" file_name="widgets/Arrow_Right.png" preload="true" />
+-->
<texture name="Arrow_Small_Up" file_name="widgets/Arrow_Small_Up.png" preload="true" />
<texture name="Arrow_Small_Left" file_name="widgets/Arrow_Small_Left.png" preload="true" />
@@ -454,6 +456,7 @@ with the same filename but different name
<texture name="SegmentedBtn_Left_Press" file_name="widgets/SegmentedBtn_Left_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Disabled" file_name="widgets/SegmentedBtn_Left_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Selected" file_name="widgets/SegmentedBtn_Left_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="SegmentedBtn_Left_Selected_Over" file_name="widgets/SegmentedBtn_Left_Selected_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Selected_Press" file_name="widgets/SegmentedBtn_Left_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Selected_Disabled" file_name="widgets/SegmentedBtn_Left_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
diff --git a/indra/newview/skins/default/xui/en/floater_aaa.xml b/indra/newview/skins/default/xui/en/floater_aaa.xml
index f89ad2f997..6956b73371 100644
--- a/indra/newview/skins/default/xui/en/floater_aaa.xml
+++ b/indra/newview/skins/default/xui/en/floater_aaa.xml
@@ -18,6 +18,7 @@
single_instance="true"
width="320">
<string name="nudge_parabuild">Nudge 1</string>
+ <string name="test_the_vlt">This string is extracted.</string>
<chat_history
allow_html="true"
bg_readonly_color="ChatHistoryBgColor"
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 1239152c32..81e6503407 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1093,11 +1093,11 @@
<name_list.columns
label="Count"
name="count"
- width="70" />
+ width="60" />
<name_list.columns
label="Most Recent"
name="mostrecent"
- width="160" />
+ width="170" />
</name_list>
</panel>
<panel
@@ -1672,9 +1672,7 @@ Only large parcels can be listed in search.
name="replace_texture_help"
width="300"
word_wrap="true">
- Objects using this texture will show the movie or web page after you click the play arrow.
-
-Select the thumbnail to choose a different texture.
+ Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail to choose a different texture.
</text>
<check_box
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
index a0cb94eb69..54b6edb0ec 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="950"
+ height="650"
layout="topleft"
name="avatar_texture_debug"
help_topic="avatar_texture_debug"
@@ -16,9 +16,9 @@
length="1"
height="16"
layout="topleft"
- left="10"
+ left="30"
name="label"
- top="24"
+ top="40"
width="80">
Baked Textures
</text>
@@ -27,7 +27,7 @@
length="1"
height="16"
layout="topleft"
- left_pad="60"
+ left_pad="50"
name="composite_label"
top_delta="0"
width="120">
@@ -40,16 +40,37 @@
layout="topleft"
left_pad="530"
name="Dump"
- top_delta="1"
+ top_delta="0"
width="150" />
+ <scroll_container
+ color="DkGray2"
+ opaque="true"
+ follows="all"
+ height="590"
+ layout="topleft"
+ left="5"
+ top_pad="5"
+ name="profile_scroll"
+ reserve_scroll_corner="false"
+ width="1240">
+ <panel
+ name="scroll_content_panel"
+ follows="left|top"
+ min_height="300"
+ layout="topleft"
+ top="0"
+ background_visible="false"
+ height="950"
+ left="0"
+ width="1250">
<texture_picker
height="143"
label="Hair"
layout="topleft"
left="10"
name="hair-baked"
- top="47"
+ top="17"
width="128" />
<texture_picker
height="143"
@@ -74,7 +95,7 @@
layout="topleft"
left="10"
name="head-baked"
- top="197"
+ top="167"
width="128" />
<texture_picker
height="143"
@@ -107,7 +128,7 @@
layout="topleft"
left="10"
name="eyes-baked"
- top="347"
+ top="317"
width="128" />
<texture_picker
height="143"
@@ -132,7 +153,7 @@
layout="topleft"
left="10"
name="upper-baked"
- top="497"
+ top="467"
width="128" />
<texture_picker
height="143"
@@ -197,7 +218,7 @@
layout="topleft"
left="10"
name="lower-baked"
- top="647"
+ top="617"
width="128" />
<texture_picker
height="143"
@@ -270,7 +291,7 @@
layout="topleft"
left="10"
name="skirt-baked"
- top="797"
+ top="767"
width="128" />
<texture_picker
height="143"
@@ -280,5 +301,6 @@
name="skirt"
top_delta="0"
width="128" />
-
+</panel>
+</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index d378b427f1..a797d54749 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -2,8 +2,8 @@
<floater
legacy_header_height="18"
can_dock="true"
- can_minimize="false"
- can_close="true"
+ can_minimize="true"
+ can_close="false"
center_horiz="true"
follows="bottom"
height="152"
@@ -108,7 +108,7 @@
image_unselected="Cam_Rotate_Out"
layout="topleft"
left="45"
- mouse_opaque="false"
+ mouse_opaque="false"
name="cam_rotate_stick"
quadrant="left"
scale_image="false"
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 275ab5bb8b..153a9c2c45 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -3,7 +3,7 @@
legacy_header_height="18"
can_minimize="false"
follows="left|top"
- height="540"
+ height="607"
layout="topleft"
left_delta="-3"
name="floater customize"
@@ -11,30 +11,51 @@
save_rect="true"
title="APPEARANCE"
top_delta="-185"
- width="494">
+ width="524">
+ <check_box
+ enabled="true"
+ height="23"
+ label="Show Attachments in Previews"
+ layout="topleft"
+ left="110"
+ name="show attachments"
+ tool_tip="Display attachments on your avatar in the preview panels below."
+ top="20"
+ width="146" />
<tab_container
- height="483"
+ height="517"
layout="topleft"
- left="0"
+ left="10"
name="customize tab container"
tab_min_width="96"
tab_position="left"
- top="24"
- width="492">
- <placeholder
- label="Body Parts"
- layout="topleft"
- name="body_parts_placeholder" />
+ tab_height="50"
+ top="50"
+ width="506">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="5"
+ name="body_parts_placeholder"
+ font="SansSerifSmallBold"
+ top="10"
+ width="100">
+ Body Parts
+ </text>
+ <placeholder />
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Shape"
layout="topleft"
- left_delta="0"
name="Shape"
- top_delta="0"
- width="389">
+ width="400">
<icon
follows="top|right"
height="18"
@@ -47,134 +68,132 @@
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left_delta="-325"
mouse_opaque="true"
- top_delta="3"
width="16" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left="299"
+ right="390"
name="Revert"
- top="458"
+ top="477"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Body"
label_selected="Body"
layout="topleft"
- left="8"
+ left="10"
name="Body"
- top="65"
+ top="63"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Head"
label_selected="Head"
layout="topleft"
left_delta="0"
name="Head"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Eyes"
label_selected="Eyes"
layout="topleft"
left_delta="0"
name="Eyes"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Ears"
label_selected="Ears"
layout="topleft"
left_delta="0"
name="Ears"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Nose"
label_selected="Nose"
layout="topleft"
left_delta="0"
name="Nose"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Mouth"
label_selected="Mouth"
layout="topleft"
left_delta="0"
name="Mouth"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Chin"
label_selected="Chin"
layout="topleft"
left_delta="0"
name="Chin"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Torso"
label_selected="Torso"
layout="topleft"
left_delta="0"
name="Torso"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Legs"
label_selected="Legs"
layout="topleft"
left_delta="0"
name="Legs"
- top_pad="16"
+ top_pad="4"
width="82" />
<radio_group
control_name="AvatarSex"
height="34"
layout="topleft"
- left_delta="0"
name="sex radio"
- top_pad="16"
+ top_pad="10"
width="82">
<radio_item
height="16"
label="Female"
layout="topleft"
- left="1"
name="radio"
- top="1"
+ value="0"
width="82" />
<radio_item
height="16"
label="Male"
layout="topleft"
- left_delta="0"
name="radio2"
- top_delta="16"
+ value="1"
+ top="32"
width="82" />
</radio_group>
<text
@@ -184,9 +203,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left="8"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -197,9 +216,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -210,9 +229,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -223,9 +242,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -233,11 +252,11 @@
type="string"
length="1"
follows="left|top"
- height="14"
+ height="16"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -247,9 +266,9 @@
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
width="373">
Put on a new shape by dragging one from your inventory
to your avatar. Alternately, you create a new one from
@@ -270,58 +289,58 @@ scratch and wear it.
<text
type="string"
length="1"
- bottom="486"
+ top="488"
follows="left|top|right"
font="SansSerif"
halign="right"
- height="28"
+ height="23"
layout="topleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Shape:
</text>
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Shape"
label_selected="Create New Shape"
layout="topleft"
- left="8"
+ left="10"
name="Create New"
top="104"
width="140" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
name="Save"
- top="458"
+ right="218"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
name="Save As"
- top_delta="0"
+ top="477"
+ right="304"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Skin"
layout="topleft"
- left_delta="0"
name="Skin"
- top_delta="0"
- width="389">
+ width="400">
<icon
follows="top|right"
height="18"
@@ -333,52 +352,51 @@ scratch and wear it.
top="4"
width="18" />
<icon
- follows="left|top"
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left="8"
mouse_opaque="true"
- top_delta="3"
width="16" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Skin Color"
label_selected="Skin Color"
layout="topleft"
- left_delta="0"
+ left="10"
name="Skin Color"
- top_pad="41"
+ top="63"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Face Detail"
label_selected="Face Detail"
layout="topleft"
left_delta="0"
name="Face Detail"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Makeup"
label_selected="Makeup"
layout="topleft"
left_delta="0"
name="Makeup"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Body Detail"
label_selected="Body Detail"
layout="topleft"
left_delta="0"
name="Body Detail"
- top_pad="16"
+ top_pad="4"
width="82" />
<text
type="string"
@@ -387,9 +405,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left="8"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -400,9 +418,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -413,9 +431,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -426,9 +444,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -438,9 +456,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -450,9 +468,9 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
width="373">
Put on a new skin by dragging one from your inventory
to your avatar. Alternately, you create a new one from
@@ -473,14 +491,14 @@ scratch and wear it.
<text
type="string"
length="1"
- bottom="486"
+ top="488"
follows="left|top|right"
font="SansSerif"
halign="right"
- height="28"
+ height="23"
layout="topleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Skin:
</text>
@@ -489,43 +507,43 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Head Tattoos"
layout="topleft"
- left="8"
+ left="10"
name="Head Tattoos"
tool_tip="Click to choose a picture"
- top="193"
- width="74" />
+ top="176"
+ width="82" />
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Upper Tattoos"
layout="topleft"
left_delta="0"
name="Upper Tattoos"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="74" />
+ top_delta="102"
+ width="82" />
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Lower Tattoos"
layout="topleft"
left_delta="0"
name="Lower Tattoos"
tool_tip="Click to choose a picture"
- top_delta="80"
- width="74" />
+ top_delta="102"
+ width="82" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Skin"
label_selected="Create New Skin"
layout="topleft"
@@ -535,45 +553,45 @@ scratch and wear it.
width="120" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
- border="true"
+ border="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
follows="left|top|right|bottom"
- height="481"
+ height="508"
label="Hair"
layout="topleft"
- left_delta="0"
name="Hair"
- top_delta="0"
- width="389">
+ width="400">
<icon
follows="top|right"
height="18"
@@ -586,50 +604,48 @@ scratch and wear it.
width="18" />
<icon
height="16"
+ top="10"
+ left="10"
layout="topleft"
- left="8"
mouse_opaque="true"
- top_delta="3"
width="16" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Color"
label_selected="Color"
layout="topleft"
- left_delta="0"
+ left="10"
name="Color"
- top_pad="41"
+ top="63"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Style"
label_selected="Style"
layout="topleft"
left_delta="0"
name="Style"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Eyebrows"
label_selected="Eyebrows"
layout="topleft"
- left_delta="0"
name="Eyebrows"
- top_pad="16"
+ top_pad="4"
width="82" />
<button
follows="left|top"
- height="16"
+ height="23"
label="Facial"
label_selected="Facial"
layout="topleft"
- left_delta="0"
name="Facial"
- top_pad="16"
+ top_pad="4"
width="82" />
<text
type="string"
@@ -638,9 +654,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left="8"
+ left="31"
name="title"
- top="8"
+ top="10"
width="355">
[DESC]
</text>
@@ -651,9 +667,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_no_modify"
- top_delta="0"
+ top="10"
width="355">
[DESC]: cannot modify
</text>
@@ -664,9 +680,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_loading"
- top_delta="0"
+ top="10"
width="355">
[DESC]: loading...
</text>
@@ -677,9 +693,9 @@ scratch and wear it.
font="SansSerif"
height="16"
layout="topleft"
- left_delta="0"
+ left="31"
name="title_not_worn"
- top_delta="0"
+ top="10"
width="355">
[DESC]: not worn
</text>
@@ -689,9 +705,9 @@ scratch and wear it.
follows="left|top|right"
height="14"
layout="topleft"
- left="8"
+ left="10"
name="path"
- top="24"
+ top="36"
width="373">
Located in [PATH]
</text>
@@ -701,9 +717,9 @@ scratch and wear it.
follows="left|top|right"
height="28"
layout="topleft"
- left_delta="0"
+ left="10"
name="not worn instructions"
- top_pad="8"
+ top="31"
width="373">
Put on a new hair by dragging one from your inventory
to your avatar. Alternately, you create a new one from
@@ -724,14 +740,14 @@ scratch and wear it.
<text
type="string"
length="1"
- bottom="486"
+ top="488"
follows="left|top|right"
font="SansSerif"
halign="right"
- height="28"
+ height="23"
layout="topleft"
name="Item Action Label"
- right="117"
+ right="132"
width="100">
Hair:
</text>
@@ -739,17 +755,17 @@ scratch and wear it.
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="108"
label="Texture"
layout="topleft"
- left="8"
+ left="10"
name="Texture"
tool_tip="Click to choose a picture"
- top="193"
- width="64" />
+ top="176"
+ width="82" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Hair"
label_selected="Create New Hair"
layout="topleft"
@@ -759,33 +775,33 @@ scratch and wear it.
width="120" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left="123"
+ right="218"
name="Save"
- top="458"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- left_pad="6"
+ right="304"
name="Save As"
- top_delta="0"
+ top="477"
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- left_pad="6"
+ right="390"
name="Revert"
- top_delta="0"
+ top="477"
width="82" />
</panel>
<panel
@@ -933,7 +949,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Eyes"
label_selected="Create New Eyes"
layout="topleft"
@@ -943,7 +959,7 @@ scratch and wear it.
width="120" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -953,7 +969,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -963,7 +979,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -972,10 +988,20 @@ scratch and wear it.
top_delta="0"
width="82" />
</panel>
- <placeholder
- label="Clothes"
- layout="topleft"
- name="clothes_placeholder" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="5"
+ name="clothes_placeholder"
+ font="SansSerifSmallBold"
+ top="125"
+ width="100">
+ Clothes
+ </text>
+ <placeholder />
<panel
border="true"
follows="left|top|right|bottom"
@@ -1016,7 +1042,6 @@ scratch and wear it.
top_pad="41"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -1029,7 +1054,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Shirt"
label_selected="Create New Shirt"
layout="topleft"
@@ -1039,7 +1064,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -1049,7 +1074,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -1059,7 +1084,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -1069,7 +1094,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -1222,7 +1247,6 @@ scratch and wear it.
top_pad="41"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -1235,7 +1259,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Pants"
label_selected="Create New Pants"
layout="topleft"
@@ -1245,7 +1269,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -1255,7 +1279,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -1265,7 +1289,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -1275,7 +1299,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -1532,7 +1556,6 @@ scratch and wear it.
top="65"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -1545,7 +1568,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Shoes"
label_selected="Create New Shoes"
layout="topleft"
@@ -1555,7 +1578,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -1565,7 +1588,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -1575,7 +1598,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -1585,7 +1608,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -1738,7 +1761,6 @@ scratch and wear it.
top="65"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -1751,7 +1773,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Socks"
label_selected="Create New Socks"
layout="topleft"
@@ -1761,7 +1783,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -1771,7 +1793,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -1781,7 +1803,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -1791,7 +1813,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -1956,7 +1978,6 @@ scratch and wear it.
top_delta="80"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -1969,7 +1990,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Jacket"
label_selected="Create New Jacket"
layout="topleft"
@@ -1979,7 +2000,7 @@ scratch and wear it.
width="140" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -1989,7 +2010,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -1999,7 +2020,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -2009,7 +2030,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -2162,7 +2183,6 @@ scratch and wear it.
top="65"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -2175,7 +2195,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Gloves"
label_selected="Create New Gloves"
layout="topleft"
@@ -2185,7 +2205,7 @@ scratch and wear it.
width="130" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -2195,7 +2215,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -2205,7 +2225,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -2215,7 +2235,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -2368,7 +2388,6 @@ scratch and wear it.
top="65"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -2381,7 +2400,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Undershirt"
label_selected="Create New Undershirt"
layout="topleft"
@@ -2391,7 +2410,7 @@ scratch and wear it.
width="160" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -2401,7 +2420,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -2411,7 +2430,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -2421,7 +2440,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -2574,7 +2593,6 @@ scratch and wear it.
top="65"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -2587,7 +2605,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Underpants"
label_selected="Create New Underpants"
layout="topleft"
@@ -2597,7 +2615,7 @@ scratch and wear it.
width="160" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -2607,7 +2625,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -2617,7 +2635,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -2627,7 +2645,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -2780,7 +2798,6 @@ scratch and wear it.
top="65"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -2793,7 +2810,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Skirt"
label_selected="Create New Skirt"
layout="topleft"
@@ -2803,7 +2820,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -2813,7 +2830,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -2823,7 +2840,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -2833,7 +2850,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -3080,7 +3097,7 @@ scratch and wear it.
width="16" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Alpha"
label_selected="Create New Alpha"
layout="topleft"
@@ -3090,7 +3107,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -3100,7 +3117,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -3110,7 +3127,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -3120,7 +3137,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -3298,7 +3315,7 @@ scratch and wear it.
width="64" />
<button
follows="left|top"
- height="24"
+ height="23"
label="Create New Tattoo"
label_selected="Create New Tattoo"
layout="topleft"
@@ -3308,7 +3325,7 @@ scratch and wear it.
width="120" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Take Off"
label_selected="Take Off"
layout="topleft"
@@ -3318,7 +3335,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
@@ -3328,7 +3345,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
@@ -3338,7 +3355,7 @@ scratch and wear it.
width="82" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
@@ -3350,12 +3367,12 @@ scratch and wear it.
</tab_container>
<scroll_container
follows="left|top|right|bottom"
- height="382"
+ height="409"
layout="topleft"
- left="197"
+ left="211"
mouse_opaque="false"
name="panel_container"
- top="94"
+ top="116"
width="292">
<scrolling_panel_list
follows="left|bottom"
@@ -3363,19 +3380,19 @@ scratch and wear it.
name="panel_list" />
</scroll_container>
<button
- bottom="536"
+ bottom="598"
follows="right|bottom"
- height="20"
+ height="23"
label="Make Outfit"
label_selected="Make Outfit"
layout="topleft"
name="make_outfit_btn"
- right="-216"
+ right="-218"
width="100" />
<button
- bottom="536"
+ bottom="598"
follows="right|bottom"
- height="20"
+ height="23"
label="Cancel"
label_selected="Cancel"
layout="topleft"
@@ -3383,13 +3400,13 @@ scratch and wear it.
right="-10"
width="100" />
<button
- bottom="536"
+ bottom="598"
follows="right|bottom"
- height="20"
+ height="23"
label="OK"
label_selected="OK"
layout="topleft"
name="Ok"
- right="-116"
+ right="-114"
width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
index 35f3e643c3..8c5af2283d 100644
--- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
@@ -65,11 +65,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left="8"
name="WL12am"
@@ -80,11 +78,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL3am"
@@ -95,11 +91,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL6am"
@@ -110,11 +104,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9am"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL9amHash"
@@ -125,11 +117,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL12pmHash"
@@ -140,11 +130,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL3pm"
@@ -155,11 +143,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL6pm"
@@ -170,11 +156,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9pm"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL9pm"
@@ -185,11 +169,9 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12am2"
follows="left|top|right"
- height="6"
+ height="16"
layout="topleft"
left_pad="10"
name="WL12am2"
@@ -200,9 +182,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12amHash"
follows="left|top|right"
font="SansSerif"
height="14"
@@ -210,135 +190,119 @@
left="20"
name="WL12amHash"
top="54"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3amHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL3amHash"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6amHash"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL6amHash"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9amHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL9amHash2"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12pmHash"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL12pmHash2"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL3pmHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL3pmHash"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL6pmHash"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL6pmHash"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL9pmHash"
follows="left|top|right"
font="SansSerif"
height="11"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL9pmHash"
top_delta="3"
- width="4">
+ width="6">
I
</text>
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WL12amHash2"
follows="left|top|right"
font="SansSerif"
height="14"
layout="topleft"
- left_pad="61"
+ left_pad="59"
name="WL12amHash2"
top_delta="-3"
- width="4">
+ width="6">
|
</text>
<button
@@ -346,9 +310,9 @@
label="Add Key"
label_selected="Add Key"
layout="topleft"
- left="550"
+ left="555"
name="WLAddKey"
- top="20"
+ top="30"
width="80" />
<button
height="20"
@@ -362,9 +326,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -378,9 +340,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -424,9 +384,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="WLCurKeyTimeText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -456,9 +414,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -481,9 +437,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -542,9 +496,7 @@
<text
type="string"
length="1"
- bg_visible="true"
border_visible="true"
- control_name="DayCycleText"
follows="left|top|right"
font="SansSerif"
height="16"
@@ -560,7 +512,7 @@
label="Play"
label_selected="Play"
layout="topleft"
- left_delta="0"
+ left_delta="60"
name="WLAnimSky"
top_pad="5"
width="50" />
@@ -581,7 +533,7 @@
left_pad="5"
name="WLUseLindenTime"
top_delta="0"
- width="140" />
+ width="150" />
<button
height="20"
label="Save Test Day"
diff --git a/indra/newview/skins/default/xui/en/floater_env_settings.xml b/indra/newview/skins/default/xui/en/floater_env_settings.xml
index 5e78037ee1..8c87bd42dd 100644
--- a/indra/newview/skins/default/xui/en/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml
@@ -98,7 +98,6 @@
Water Color
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.5 0.5 0.5 1"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 645c2973d8..57e92cdeec 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -8,18 +8,18 @@
left="0"
name="panel_im"
top="0"
- can_close="true"
can_dock="false"
- can_minimize="false"
+ can_minimize="true"
+ can_close="true"
visible="true"
- width="300"
+ width="360"
can_resize="true"
- min_width="300"
+ min_width="360"
min_height="350">
<layout_stack
follows="all"
height="320"
- width="300"
+ width="360"
layout="topleft"
orientation="horizontal"
name="im_panels"
@@ -30,14 +30,15 @@
layout="topleft"
follows="left"
label="IM Control Panel"
+ min_width="115"
auto_resize="false"
- user_resize="false" />
+ user_resize="true" />
<layout_panel
left="0"
top="0"
height="200"
- width="185"
- user_resize="false">
+ width="245"
+ user_resize="true">
<button
height="20"
follows="left|top"
@@ -63,17 +64,17 @@
parse_highlights="true"
allow_html="true"
left="1"
- width="180">
+ width="240">
</chat_history>
<line_editor
- bottom="0"
+ bottom="0"
follows="left|right|bottom"
font="SansSerifSmall"
height="20"
label="To"
layout="bottomleft"
name="chat_editor"
- width="180">
+ width="240">
</line_editor>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index cff0c29dfc..0bdcbf30df 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -2,8 +2,8 @@
<floater
legacy_header_height="18"
can_dock="true"
- can_close="true"
- can_minimize="false"
+ can_minimize="true"
+ can_close="false"
center_horiz="true"
follows="bottom"
height="110"
@@ -38,12 +38,12 @@
Fly Backwards (press Down Arrow or S)
</string>
<panel
- border="false"
+ border="false"
height="83"
- follows="left|top"
+ follows="left|top"
layout="topleft"
left="0"
- mouse_opaque="false"
+ mouse_opaque="false"
name="panel_actions"
top="0"
width="115">
@@ -130,7 +130,7 @@
</panel>
<!-- Width and height of this panel should be synchronized with panel_stand_stop_flying.xml -->
<panel
- border="false"
+ border="false"
height="27"
layout="topleft"
left="0"
@@ -141,7 +141,7 @@
follows="left|bottom"
height="23"
image_overlay="Move_Walk_Off"
- image_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
label=""
layout="topleft"
name="mode_walk_btn"
@@ -151,10 +151,10 @@
top="2"
width="31" />
<button
- follows="left|bottom"
+ follows="left|bottom"
height="23"
image_overlay="Move_Run_Off"
- image_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
label=""
layout="topleft"
left_pad="0"
@@ -168,7 +168,7 @@
follows="left|bottom"
height="23"
image_overlay="Move_Fly_Off"
- image_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
label=""
layout="topleft"
left_pad="0"
@@ -179,7 +179,7 @@
top="2"
width="31" />
<button
- visible="false"
+ visible="false"
follows="left|bottom"
height="20"
label="Stop Flying"
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index c8aab2c1e0..fb8893678d 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater
- border_visible = "false"
- border_drop_shadow_visible = "false"
- drop_shadow_visible = "false"
- border = "false"
+ border_visible="false"
+ border_drop_shadow_visible="false"
+ drop_shadow_visible="false"
+ border="false"
bg_opaque_image="Inspector_Background"
- bg_alpha_image="Toast_Background"
+ bg_alpha_image="Toast_Background"
bg_alpha_color="0 0 0 0"
legacy_header_height="18"
- can_minimize="false"
+ can_minimize="true"
can_tear_off="false"
can_resize="true"
can_drag_on_left="false"
- can_close="true"
+ can_close="false"
can_dock="true"
bevel_style="in"
height="300"
@@ -29,10 +29,10 @@
bg_readonly_color="ChatHistoryBgColor"
bg_writeable_color="ChatHistoryBgColor"
follows="all"
- left="5"
+ left="5"
top="20"
layout="topleft"
- height="275"
+ height="275"
name="chat_history"
parse_highlights="true"
text_color="ChatHistoryTextColor"
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index ae4d5042ef..c6bc093c6c 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -69,7 +69,29 @@ Calling [CALLEE_NAME]
word_wrap="true">
No Answer. Please try again later.
</text>
- <text
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby"
+ top="27"
+ width="315"
+ word_wrap="true">
+ You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby_P2P"
+ top="27"
+ width="315"
+ word_wrap="true">
+ [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ </text>
+ <text
font="SansSerif"
height="50"
layout="topleft"
@@ -80,7 +102,7 @@ No Answer. Please try again later.
word_wrap="true">
Leaving [CURRENT_CHAT].
</text>
- <button
+ <button
height="24"
label="Cancel"
label_selected="Cancel"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
index 8cc2c91ef5..3dc546aee3 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -39,6 +39,28 @@
name="Title">
Gesture: [NAME]
</floater.string>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerifSmall"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="name_text"
+ top="20"
+ font.style="BOLD"
+ width="100">
+ Name:
+ </text>
+ <line_editor
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_delta="84"
+ name="name"
+ top_delta="-4"
+ width="180" />
<text
type="string"
length="1"
@@ -48,7 +70,7 @@
layout="topleft"
left="10"
name="desc_label"
- top="25"
+ top_pad="10"
font.style="BOLD"
width="100">
Description:
diff --git a/indra/newview/skins/default/xui/en/floater_sell_land.xml b/indra/newview/skins/default/xui/en/floater_sell_land.xml
index 409f46b960..afc44c41b8 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -2,7 +2,8 @@
<floater
legacy_header_height="18"
can_minimize="false"
- height="450"
+ can_resize="true"
+ height="535"
layout="topleft"
name="sell land"
help_topic="sell_land"
@@ -12,7 +13,7 @@
<scroll_container
color="DkGray2"
follows="left|top|right|bottom"
- height="435"
+ height="520"
layout="topleft"
name="profile_scroll"
reserve_scroll_corner="true"
@@ -31,63 +32,47 @@
enabled="false"
follows="top|left"
height="135"
- layout="topleft"
left="60"
name="info_image"
top="20"
width="180" />
<text
- type="string"
- length="1"
top="150"
follows="top|left"
- layout="topleft"
left="16"
name="info_parcel_label"
width="48">
Parcel:
</text>
<text
- type="string"
- length="1"
top_delta="0"
follows="top|left"
height="16"
- layout="topleft"
left="56"
name="info_parcel"
right="-20">
PARCEL NAME
</text>
<text
- type="string"
- length="1"
follows="top|left"
- layout="topleft"
left="16"
name="info_size_label"
width="48">
Size:
</text>
<text
- type="string"
- length="1"
follows="top|left"
top_delta="0"
height="32"
- layout="topleft"
left="56"
name="info_size"
right="-20">
[AREA] m²
</text>
<text
- type="string"
- length="1"
follows="top|left"
font="SansSerifBig"
height="24"
- layout="topleft"
left="16"
name="info_action"
text_color="white"
@@ -96,42 +81,30 @@
To sell this parcel:
</text>
<text
- type="string"
- length="1"
follows="top|left"
font="SansSerif"
height="16"
- layout="topleft"
left="30"
name="price_label">
1. Set a price:
</text>
<text
- type="string"
- length="1"
follows="top|left"
height="16"
- layout="topleft"
left="40"
name="price_text">
Choose an appropriate price.
</text>
<text
- type="string"
- length="1"
height="16"
- layout="topleft"
left="40"
name="price_ld"
width="20">
L$
</text>
<line_editor
- type="string"
- length="1"
follows="top|left"
height="18"
- layout="topleft"
left_delta="20"
name="price"
top_delta="0"
@@ -139,10 +112,7 @@
0
</line_editor>
<text
- type="string"
- length="1"
height="16"
- layout="topleft"
left="40"
name="price_per_m"
top_delta="25"
@@ -150,22 +120,16 @@
(L$[PER_METER] per m²)
</text>
<text
- type="string"
- length="1"
follows="top|left"
font="SansSerif"
height="16"
- layout="topleft"
left="30"
name="sell_to_label">
2. Sell the land to:
</text>
<text
- type="string"
- length="1"
follows="top|left"
height="25"
- layout="topleft"
left="40"
word_wrap="true"
name="sell_to_text"
@@ -173,9 +137,8 @@
Choose whether to sell to anyone or a particular buyer.
</text>
<combo_box
- follows="top|right"
+ follows="top|left"
height="18"
- layout="topleft"
left_delta="0"
name="sell_to"
top_delta="32"
@@ -196,9 +159,8 @@
</combo_box>
<line_editor
enabled="false"
- follows="top|right"
+ follows="top|left"
height="18"
- layout="topleft"
left_delta="0"
name="sell_to_agent"
top_pad="4"
@@ -206,29 +168,22 @@
<button
height="20"
label="Select"
- layout="topleft"
left_pad="5"
name="sell_to_select_agent"
top_delta="0"
width="60" />
<text
- type="string"
- length="1"
follows="top|left"
font="SansSerif"
height="16"
- layout="topleft"
left="30"
name="sell_objects_label">
3. Sell the objects with the land?
</text>
<text
- type="string"
- length="1"
font="SansSerifSmall"
follows="top|left"
height="25"
- layout="topleft"
word_wrap="true"
left="40"
name="sell_objects_text">
@@ -236,16 +191,14 @@
</text>
<radio_group
top_pad="5"
- follows="top|right"
+ follows="top|left"
height="40"
- layout="topleft"
left="40"
name="sell_objects"
- right="420">
+ right="-20">
<radio_item
bottom="40"
height="0"
- layout="topleft"
left="10"
name="none"
visible="false" />
@@ -253,33 +206,27 @@
bottom="20"
height="16"
label="No, keep ownership of objects"
- layout="topleft"
left="10"
name="no" />
<radio_item
bottom="40"
height="16"
label="Yes, sell objects with land"
- layout="topleft"
left="10"
name="yes" />
</radio_group>
<button
height="20"
label="Show Objects"
- layout="topleft"
name="show_objects"
left="70"
top_pad="10"
width="110" />
<text
- type="string"
- length="1"
bottom_delta="30"
follows="top|left"
font="SansSerifBig"
height="16"
- layout="topleft"
left="16"
name="nag_message_label"
right="-20">
@@ -289,16 +236,14 @@
follows="bottom|left"
height="20"
label="Set Land For Sale"
- layout="topleft"
left_delta="0"
name="sell_btn"
top_pad="10"
width="130" />
<button
- follows="bottom|right"
+ follows="bottom|left"
height="20"
label="Cancel"
- layout="topleft"
left_pad="30"
name="cancel_btn"
top_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_settings_debug.xml b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
index ffb11f3f18..3ed2bd7206 100644
--- a/indra/newview/skins/default/xui/en/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/en/floater_settings_debug.xml
@@ -30,26 +30,29 @@
top_pad="10"
width="320"
word_wrap="true" />
- <combo_box
- follows="top|left"
- height="20"
- layout="topleft"
- left_delta="0"
- name="boolean_combo"
- top_pad="10"
- visible="false"
- width="100">
- <combo_box.item
- label="TRUE"
- name="TRUE"
- value="true" />
- <combo_box.item
- label="FALSE"
- name="FALSE"
- value="" />
- <combo_box.commit_callback
- function="CommitSettings" />
- </combo_box>
+ <radio_group
+ follows="top|left"
+ height="30"
+ layout="topleft"
+ left_delta="0"
+ name="boolean_combo"
+ top_pad="10"
+ visible="false"
+ tab_stop="true"
+ width="100">
+ <radio_item
+ top_pad="5"
+ label="TRUE"
+ name="TRUE"
+ value="true" />
+ <radio_item
+ top_pad="5"
+ label="FALSE"
+ name="FALSE"
+ value="" />
+ <commit_callback
+ function="CommitSettings" />
+ </radio_group>
<line_editor
height="20"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 8860ac1e50..ec54522d3e 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -2,8 +2,9 @@
<floater
legacy_header_height="18"
can_minimize="false"
+ can_close="true"
follows="left|top"
- height="526"
+ height="516"
layout="topleft"
name="Snapshot"
help_topic="snapshot"
@@ -14,94 +15,84 @@
name="unknown">
unknown
</floater.string>
- <text
- type="string"
- length="1"
- follows="top|left"
- height="15"
- layout="topleft"
- left="10"
- name="type_label"
- top="25"
- width="195">
- Snapshot destination
- </text>
<radio_group
- height="60"
+ height="58"
label="Snapshot type"
layout="topleft"
- left_delta="0"
+ left="10"
name="snapshot_type_radio"
- top_pad="5"
- width="195">
+ top="25"
+ width="205">
<radio_item
bottom="19"
height="16"
- label="Send via email"
+ label="Email"
layout="topleft"
name="postcard" />
<radio_item
bottom="38"
height="16"
- label="Save to your inventory (L$[AMOUNT])"
+ label="My inventory (L$[AMOUNT])"
layout="topleft"
name="texture" />
<radio_item
bottom="57"
height="16"
- label="Save to your hard drive"
+ label="Save to my computer"
layout="topleft"
name="local" />
</radio_group>
<text
type="string"
+ font="SansSerifSmall"
length="1"
follows="left|top"
- height="25"
+ height="14"
layout="topleft"
+ right="-5"
left_delta="0"
+ halign="right"
name="file_size_label"
top_pad="106"
width="195">
- File size: [SIZE] KB
+ [SIZE] KB
</text>
<button
follows="left|top"
- height="20"
- label="Refresh Snapshot"
+ height="22"
+ image_overlay="Refresh_Off"
layout="topleft"
- left_delta="0"
+ left="10"
name="new_snapshot_btn"
- top_delta="15"
- width="195" />
+ width="23" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Send"
layout="topleft"
- left_delta="0"
+ left_pad="5"
+ right="-5"
name="send_btn"
- top_pad="2"
- width="105" />
+ width="100" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Save (L$[AMOUNT])"
layout="topleft"
- left_delta="0"
+ right="-5"
name="upload_btn"
top_delta="0"
- width="105" />
+ width="100" />
<flyout_button
follows="left|top"
- height="20"
+ height="23"
label="Save"
layout="topleft"
- left_delta="0"
+ right="-5"
name="save_btn"
tool_tip="Save image to a file"
top_delta="0"
- width="105">
+ width="100">
<flyout_button.item
label="Save"
value="save" />
@@ -109,52 +100,51 @@
label="Save As..."
value="save as" />
</flyout_button>
- <button
+ <button
follows="left|top"
- height="20"
- label="Cancel"
- layout="topleft"
- left_pad="5"
- name="discard_btn"
- top_delta="0"
- width="85" />
- <button
- follows="left|top"
- height="20"
- label="More &gt;&gt;"
+ height="23"
+ label="More"
layout="topleft"
left="10"
name="more_btn"
tool_tip="Advanced options"
- top="270"
width="80" />
<button
follows="left|top"
- height="20"
- label="&lt;&lt; Less"
+ height="23"
+ label="Less"
layout="topleft"
left_delta="0"
name="less_btn"
tool_tip="Advanced options"
top_delta="0"
width="80" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Cancel"
+ layout="topleft"
+ right="-5"
+ left_pad="5"
+ name="discard_btn"
+ width="100" />
<text
type="string"
length="1"
follows="top|left"
- height="15"
+ height="12"
layout="topleft"
- left_delta="0"
+ left="10"
name="type_label2"
top_pad="5"
- width="115">
+ width="120">
Size
</text>
<text
type="string"
length="1"
follows="top|left"
- height="15"
+ height="12"
layout="topleft"
left_pad="5"
name="format_label"
@@ -163,13 +153,12 @@
Format
</text>
<combo_box
- height="20"
+ height="23"
label="Resolution"
layout="topleft"
left="10"
name="postcard_size_combo"
- top="312"
- width="115">
+ width="120">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -192,13 +181,13 @@
value="[i-1,i-1]" />
</combo_box>
<combo_box
- height="20"
+ height="23"
label="Resolution"
layout="topleft"
left_delta="0"
name="texture_size_combo"
top_delta="0"
- width="115">
+ width="120">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -221,13 +210,13 @@
value="[i-1,i-1]" />
</combo_box>
<combo_box
- height="20"
+ height="23"
label="Resolution"
layout="topleft"
left_delta="0"
name="local_size_combo"
top_delta="0"
- width="115">
+ width="120">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -262,12 +251,11 @@
value="[i-1,i-1]" />
</combo_box>
<combo_box
- height="20"
+ height="23"
label="Format"
layout="topleft"
left_pad="5"
name="local_format_combo"
- top_delta="0"
width="70">
<combo_box.item
label="PNG"
@@ -286,13 +274,13 @@
height="20"
increment="32"
label="Width"
- label_width="30"
+ label_width="40"
layout="topleft"
left="10"
max_val="6016"
min_val="32"
name="snapshot_width"
- top="337"
+ top_pad="10"
width="95" />
<spinner
allow_text_entry="false"
@@ -301,7 +289,7 @@
height="20"
increment="32"
label="Height"
- label_width="35"
+ label_width="40"
layout="topleft"
left_pad="5"
max_val="6016"
@@ -311,7 +299,7 @@
width="95" />
<check_box
bottom_delta="20"
- label="Constrain Proportions"
+ label="Constrain proportions"
layout="topleft"
left="10"
name="keep_aspect_check" />
@@ -321,32 +309,32 @@
height="15"
increment="1"
initial_value="75"
- label="Image Quality"
+ label="Image quality"
+ label_width="100"
layout="topleft"
left_delta="0"
max_val="100"
name="image_quality_slider"
top_pad="5"
- width="210" />
+ width="205" />
<text
type="string"
length="1"
follows="left|top"
- height="20"
+ height="13"
layout="topleft"
- left_delta="0"
+ left="10"
name="layer_type_label"
- top_pad="8"
+ top_pad="5"
width="50">
Capture:
</text>
<combo_box
- height="20"
+ height="23"
label="Image Layers"
layout="topleft"
- left_delta="50"
+ left="30"
name="layer_types"
- top_delta="-3"
width="145">
<combo_box.item
label="Colors"
@@ -362,33 +350,38 @@
value="objects" />
</combo_box>
<check_box
- bottom_delta="20"
- label="Show interface in snapshot"
+ label="Interface"
layout="topleft"
- left="10"
+ left="30"
+ top_pad="10"
+ width="180"
name="ui_check" />
<check_box
- bottom_delta="20"
- label="Show HUD objects in snapshot"
+ label="HUDs"
layout="topleft"
- left="10"
+ left="30"
+ top_pad="10"
+ width="180"
name="hud_check" />
<check_box
- bottom_delta="20"
label="Keep open after saving"
layout="topleft"
left="10"
+ top_pad="8"
+ width="180"
name="keep_open_check" />
<check_box
- bottom_delta="20"
- label="Freeze frame (fullscreen preview)"
+ label="Freeze frame (fullscreen)"
layout="topleft"
left="10"
+ top_pad="8"
+ width="180"
name="freeze_frame_check" />
<check_box
- bottom_delta="20"
label="Auto-refresh"
layout="topleft"
left="10"
+ top_pad="8"
+ width="180"
name="auto_snapshot_check" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_telehub.xml b/indra/newview/skins/default/xui/en/floater_telehub.xml
index bb463edd4d..da412ed8a0 100644
--- a/indra/newview/skins/default/xui/en/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/en/floater_telehub.xml
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Explicit left edge to avoid overlapping build tools -->
<floater
legacy_header_height="18"
height="250"
layout="topleft"
+ left="300"
name="telehub"
help_topic="telehub"
title="TELEHUB"
diff --git a/indra/newview/skins/default/xui/en/floater_test_widgets.xml b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
index a2055d8c52..84adabe4fa 100644
--- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
@@ -355,7 +355,6 @@ line to actually fit
<!-- "color_swatch" displays a color and spawns a color picker when
clicked. -->
<color_swatch
- border_color="1 0 0 1"
can_apply_immediately="true"
color="0.3 0.6 0.9 1"
follows="left|top"
@@ -368,7 +367,6 @@ line to actually fit
top="10"
width="80" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="1 0 1 1"
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 5e68850e30..e55453f772 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2264,7 +2264,6 @@ even though the user gets a free copy.
top="8"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
@@ -2676,6 +2675,7 @@ even though the user gets a free copy.
height="18"
layout="topleft"
left="10"
+ use_ellipsis="true"
read_only="true"
name="media_info"
width="180" />
diff --git a/indra/newview/skins/default/xui/en/floater_voice_controls.xml b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
index c1a211967c..474b703ae5 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
can_resize="true"
+ can_minimize="true"
+ can_close="false"
height="270"
layout="topleft"
min_height="146"
- min_width="190"
+ min_width="190"
name="floater_voice_controls"
title="Voice Controls"
save_visibility="true"
@@ -31,12 +33,14 @@
No one near
</string>
<panel
- bevel_style="in"
+ bevel_style="out"
+ border="true"
follows="left|right|top"
height="62"
layout="topleft"
left="0"
name="control_panel"
+ top="0"
width="282">
<panel
height="18"
@@ -64,7 +68,7 @@
name="user_text"
text_color="white"
top="4"
- use_ellipses="true"
+ use_ellipses="true"
value="Mya Avatar:"
width="210" />
<output_monitor
@@ -75,55 +79,18 @@
layout="topleft"
name="speaking_indicator"
right="-1"
- top="2"
+ top="2"
visible="true"
width="20" />
</panel>
- <layout_stack
- animate="false"
- bottom="10"
- clip="false"
+ <button
follows="left|right|top"
height="24"
- layout="bottomleft"
- orientation="horizontal"
- width="262">
- <layout_panel
- auto_resize="false"
- follows="left"
- layout="topleft"
- min_width="24"
- name="microphone_icon_panel"
- top="0"
- user_resize="false"
- width="24">
- <icon
- height="24"
- image_name="Microphone_On"
- layout="topleft"
- name="Microphone_On"
- top="0"
- width="24" />
- </layout_panel>
- <layout_panel
- auto_resize="false"
- layout="topleft"
- min_width="100"
- name="leave_btn_panel"
- top="0"
- user_resize="false"
- visible="false"
- width="100">
- <button
- follows="left|right|top"
- height="24"
- label="Leave Call"
- left="0"
- name="leave_call_btn"
- top="0"
- width="100" />
- </layout_panel>
- </layout_stack>
+ label="Leave Call"
+ left="91"
+ name="leave_call_btn"
+ top_pad="6"
+ width="100" />
</panel>
<avatar_list
follows="all"
@@ -143,4 +110,12 @@
name="non_avatar_caller"
top="70"
width="282" />
+ <view_border
+ bevel_style="out"
+ follows="left|top|right|bottom"
+ height="206"
+ layout="topleft"
+ left="0"
+ top="63"
+ width="282" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
index 439d68282f..7f31692ad9 100644
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ b/indra/newview/skins/default/xui/en/floater_water.xml
@@ -71,7 +71,6 @@
width="700">
<panel
border="true"
- border_color="EmphasisColor"
follows="all"
height="180"
label="Settings"
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index cedf83f8b1..00e00b9694 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -92,8 +92,8 @@ This is a really long description for an object being as how it is at least 80 c
height="13"
left_delta="0"
name="object_media_url"
- top_pad="-1"
- width="291"
+ bottom_pad="2"
+ width="200"
max_length = "50"
use_ellipses="true">
http://www.superdupertest.com
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_self.xml b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
index c85dbbb1bc..281ec5a7c3 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -54,25 +54,6 @@
<menu_item_call.on_enable
function="Attachment.EnableDrop" />
</menu_item_call>
- <!--menu_item_call
- label="My Profile"
- layout="topleft"
- name="Profile...">
- <menu_item_call.on_click
- function="ShowAgentProfile"
- parameter="agent" />
- </menu_item_call>
- <menu_item_call
- label="My Appearance"
- layout="topleft"
- name="Appearance...">
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
-
- </menu_item_call-->
<menu_item_separator
layout="topleft" />
@@ -88,11 +69,9 @@
</menu_item_call>
<menu_item_call
label="My Appearance"
- layout="topleft"
name="Appearance...">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
+ function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_self.xml b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
index c6ce612a76..9212d2d648 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -187,8 +187,7 @@
layout="topleft"
name="Appearance...">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
+ function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
@@ -200,14 +199,6 @@
function="SideTray.PanelPeopleTab"
parameter="friends_panel" />
</menu_item_call>
- <!--menu_item_call
- label="My Gestures"
- layout="topleft"
- name="Gestures...">
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="gestures" />
- </menu_item_call-->
<menu_item_call
label="My Groups"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_im_well_button.xml b/indra/newview/skins/default/xui/en/menu_im_well_button.xml
new file mode 100644
index 0000000000..f8dfba91ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_im_well_button.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="IM Well Button Context Menu">
+ <menu_item_call
+ label="Close All"
+ layout="topleft"
+ name="Close All">
+ <menu_item_call.on_click
+ function="IMWellChicletMenu.Action"
+ parameter="close all" />
+ <menu_item_call.on_enable
+ function="IMWellChicletMenu.EnableItem"
+ parameter="can close all" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
index ef0bf72058..01df208850 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml
@@ -48,7 +48,17 @@
label="Block"
name="block">
<menu_item_call.on_click
- function="InspectAvatar.Block"/>
+ function="InspectAvatar.ToggleMute"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableMute" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unblock"
+ name="unblock">
+ <menu_item_call.on_click
+ function="InspectAvatar.ToggleMute"/>
+ <menu_item_call.on_visible
+ function="InspectAvatar.EnableUnmute" />
</menu_item_call>
<menu_item_call
label="Report"
diff --git a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
index 9894a01701..9dc2611663 100644
--- a/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml
@@ -19,8 +19,7 @@
label="My Appearance"
name="my_appearance">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
+ function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 0f400777b8..d29dfa7034 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -471,6 +471,14 @@
function="Inventory.DoToSelected"
parameter="delete" />
</menu_item_call>
+ <menu_item_call
+ label="Delete System Folder"
+ layout="topleft"
+ name="Delete System Folder">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="delete_system_folder" />
+ </menu_item_call>
<menu_item_separator
layout="topleft" />
<menu_item_separator
diff --git a/indra/newview/skins/default/xui/en/menu_land.xml b/indra/newview/skins/default/xui/en/menu_land.xml
index d88a2f8d25..cc6d8ad9c1 100644
--- a/indra/newview/skins/default/xui/en/menu_land.xml
+++ b/indra/newview/skins/default/xui/en/menu_land.xml
@@ -6,7 +6,7 @@
label="About Land"
name="Place Information...">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="about_land" />
</menu_item_call>
<!-- <menu_item_call
@@ -28,8 +28,7 @@
label="Buy This Land"
name="Land Buy">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="buy land" />
+ function="Land.Buy" />
<menu_item_call.on_enable
function="World.EnableBuyLand" />
</menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index 53be40d7fd..7a0b11872a 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -16,7 +16,7 @@
name="Preferences..."
shortcut="control|P">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Toggle"
parameter="preferences" />
</menu_item_call>
<menu_item_separator />
@@ -53,7 +53,7 @@
label="About [APP_NAME]"
name="About Second Life">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="sl_about" />
</menu_item_call>
</menu>
@@ -175,16 +175,18 @@
name="UI Preview Tool"
shortcut="control|T">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Toggle"
parameter="ui_preview" />
</menu_item_call>
<menu_item_separator />
+ <!-- Broken
<menu_item_call
label="Show Side Tray"
name="Show Side Tray">
<menu_item_call.on_click
function="Advanced.ShowSideTray" />
</menu_item_call>
+ -->
<menu
label="UI Tests"
name="UI Tests"
@@ -194,7 +196,7 @@
name="Textbox"
shortcut="control|1">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="test_textbox" />
</menu_item_call>
<menu_item_call
@@ -202,7 +204,7 @@
name="Text Editor"
shortcut="control|2">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="test_text_editor" />
</menu_item_call>
<menu_item_call
@@ -210,14 +212,14 @@
name="Widgets"
shortcut="control|shift|T">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="test_widgets" />
</menu_item_call>
<menu_item_call
label="Inspectors"
name="Inspectors">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="test_inspectors" />
</menu_item_call>
</menu>
@@ -235,14 +237,14 @@
label="Show TOS"
name="TOS">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="message_tos" />
</menu_item_call>
<menu_item_call
label="Show Critical Message"
name="Critical">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="message_critical" />
</menu_item_call>
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_mini_map.xml b/indra/newview/skins/default/xui/en/menu_mini_map.xml
index 8d0edf018d..f5ea3e735b 100644
--- a/indra/newview/skins/default/xui/en/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/en/menu_mini_map.xml
@@ -51,7 +51,7 @@
label="World Map"
name="World Map">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="world_map" />
</menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_notification_well_button.xml b/indra/newview/skins/default/xui/en/menu_notification_well_button.xml
new file mode 100644
index 0000000000..263ac40f4e
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_notification_well_button.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Notification Well Button Context Menu">
+ <menu_item_call
+ label="Close All"
+ layout="topleft"
+ name="Close All">
+ <menu_item_call.on_click
+ function="NotificationWellChicletMenu.Action"
+ parameter="close all" />
+ <menu_item_call.on_enable
+ function="NotificationWellChicletMenu.EnableItem"
+ parameter="can close all" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_participant_list.xml b/indra/newview/skins/default/xui/en/menu_participant_list.xml
index 449202aaaa..faf33bd1b1 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -51,6 +51,8 @@
<menu_item_call.on_click
function="Avatar.Pay" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
<menu_item_check
label="Block Voice"
layout="topleft"
@@ -64,8 +66,6 @@
function="ParticipantList.EnableItem"
parameter="can_block" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
<menu_item_check
label="Block Text"
layout="topleft"
@@ -79,6 +79,8 @@
function="ParticipantList.EnableItem"
parameter="can_mute_text" />
</menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
<context_menu
label="Moderator Options &gt;"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 0891afaf76..b4ce32ea1d 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -32,8 +32,7 @@
layout="topleft"
name="Buy and Sell L$">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="buy currency" />
+ function="BuyCurrency" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
@@ -50,8 +49,7 @@
layout="topleft"
name="Appearance">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="appearance" />
+ function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
@@ -82,7 +80,7 @@
name="Gestures"
shortcut="control|G">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Toggle"
parameter="gestures" />
</menu_item_call>
<menu
@@ -240,30 +238,55 @@
layout="topleft"
name="World"
tear_off="true">
- <menu_item_check
- label="Move"
+ <menu_item_check
+ label="Mini-Map"
layout="topleft"
- name="Movement Controls">
+ name="Mini-Map"
+ shortcut="control|shift|M">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="moveview" />
+ parameter="mini_map" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="moveview" />
+ parameter="mini_map" />
</menu_item_check>
- <menu_item_check
- label="View"
+ <menu_item_check
+ label="World Map"
layout="topleft"
- name="Camera Controls">
+ name="World Map"
+ shortcut="control|M"
+ use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
- parameter="camera" />
+ parameter="world_map" />
<menu_item_check.on_click
function="Floater.Toggle"
- parameter="camera" />
+ parameter="world_map" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_call
+ label="Snapshot"
+ layout="topleft"
+ name="Take Snapshot"
+ shortcut="control|shift|S">
+ <menu_item_call.on_click
+ function="Floater.Show"
+ parameter="snapshot" />
+ </menu_item_call>
+ <menu_item_call
+ label="Landmark This Place"
+ layout="topleft"
+ name="Create Landmark Here">
+ <menu_item_call.on_click
+ function="World.CreateLandmark" />
+ <menu_item_call.on_enable
+ function="World.EnableCreateLandmark" />
+ </menu_item_call>
+ <menu
+ create_jump_keys="true"
+ label="About This Place"
+ layout="topleft"
+ name="Land"
+ tear_off="true">
<menu_item_call
label="About Land"
layout="topleft"
@@ -280,13 +303,15 @@
function="Floater.Show"
parameter="region_info" />
</menu_item_call>
+ </menu>
+ <menu_item_separator
+ layout="topleft" />
<menu_item_call
label="Buy Land"
layout="topleft"
name="Buy Land">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="buy land" />
+ function="Land.Buy" />
<menu_item_call.on_enable
function="World.EnableBuyLand" />
</menu_item_call>
@@ -295,7 +320,7 @@
layout="topleft"
name="My Land">
<menu_item_call.on_click
- function="ShowFloater"
+ function="Floater.Show"
parameter="land_holdings" />
</menu_item_call>
<menu
@@ -304,6 +329,28 @@
layout="topleft"
name="Land"
tear_off="true">
+ <menu_item_check
+ label="Move Controls"
+ layout="topleft"
+ name="Movement Controls">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="moveview" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="moveview" />
+ </menu_item_check>
+ <menu_item_check
+ label="View Controls"
+ layout="topleft"
+ name="Camera Controls">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="camera" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="camera" />
+ </menu_item_check>
<menu_item_check
label="Ban Lines"
layout="topleft"
@@ -350,32 +397,8 @@
</menu>
<menu_item_separator
layout="topleft" />
- <menu
- label="Landmarks"
- layout="topleft"
- name="Landmarks"
- tear_off="true">
- <menu_item_call
- label="Create Landmark Here"
- layout="topleft"
- name="Create Landmark Here">
- <menu_item_call.on_click
- function="World.CreateLandmark" />
- <menu_item_call.on_enable
- function="World.EnableCreateLandmark" />
- </menu_item_call>
- <menu_item_call
- label="Set Home to Here"
- layout="topleft"
- name="Set Home to Here">
- <menu_item_call.on_click
- function="World.SetHomeLocation" />
- <menu_item_call.on_enable
- function="World.EnableSetHomeLocation" />
- </menu_item_call>
- </menu>
<menu_item_call
- label="Home"
+ label="Teleport Home"
layout="topleft"
name="Teleport Home"
shortcut="control|shift|H">
@@ -384,31 +407,15 @@
<menu_item_call.on_enable
function="World.EnableTeleportHome" />
</menu_item_call>
- <menu_item_check
- label="Mini-Map"
- layout="topleft"
- name="Mini-Map"
- shortcut="control|shift|M">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="mini_map" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="mini_map" />
- </menu_item_check>
- <menu_item_check
- label="World Map"
- layout="topleft"
- name="World Map"
- shortcut="control|M"
- use_mac_ctrl="true">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="world_map" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="world_map" />
- </menu_item_check>
+ <menu_item_call
+ label="Set Home to Here"
+ layout="topleft"
+ name="Set Home to Here">
+ <menu_item_call.on_click
+ function="World.SetHomeLocation" />
+ <menu_item_call.on_enable
+ function="World.EnableSetHomeLocation" />
+ </menu_item_call>
<!-- <menu_item_check
label="Show Navigation Bar"
layout="topleft"
@@ -435,17 +442,6 @@
layout="topleft" />-->
<menu_item_separator
layout="topleft" />
- <menu_item_call
- label="Snapshot"
- layout="topleft"
- name="Take Snapshot"
- shortcut="control|shift|S">
- <menu_item_call.on_click
- function="Floater.Show"
- parameter="snapshot" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
<menu
create_jump_keys="true"
label="Sun"
@@ -487,7 +483,7 @@
parameter="midnight" />
</menu_item_call>
<menu_item_call
- label="Use the Estate Time"
+ label="Estate Time"
layout="topleft"
name="Revert to Region Default">
<menu_item_call.on_click
@@ -868,14 +864,6 @@
function="ToggleControl"
parameter="DebugPermissions" />
</menu_item_check>
- <!--menu_item_call
- label="Show Script Warning/Error Window"
- layout="topleft"
- name="Show Script Warning/Error Window">
- <menu_item_call.on_click
- function="ShowFloater"
- parameter="script errors" />
- </menu_item_call-->
<menu_item_separator
layout="topleft" />
<menu
@@ -1067,14 +1055,14 @@
function="ShowHelp"
parameter="f1_help" />
</menu_item_call>
- <menu_item_call
+ <!-- <menu_item_call
label="Tutorial"
layout="topleft"
name="Tutorial">
<menu_item_call.on_click
function="Floater.Show"
parameter="hud" />
- </menu_item_call>
+ </menu_item_call>-->
<menu_item_separator
layout="topleft" />
<menu_item_call
@@ -1082,8 +1070,7 @@
layout="topleft"
name="Report Abuse">
<menu_item_call.on_click
- function="ShowFloater"
- parameter="complaint reporter" />
+ function="ReportAbuse" />
</menu_item_call>
<menu_item_call
label="Report Bug"
@@ -1110,17 +1097,6 @@
name="Advanced"
tear_off="true"
visible="false">
- <menu_item_check
- label="Set Away After 30 Minutes"
- layout="topleft"
- name="Go Away/AFK When Idle">
- <menu_item_check.on_check
- function="CheckControl"
- parameter="AllowIdleAFK" />
- <menu_item_check.on_click
- function="ToggleControl"
- parameter="AllowIdleAFK" />
- </menu_item_check>
<menu_item_call
label="Stop Animating Me"
layout="topleft"
@@ -2537,7 +2513,7 @@
function="CheckControl"
parameter="TextureDisable" />
<menu_item_check.on_click
- function="ToggleControl"
+ function="ToggleControl"
parameter="TextureDisable" />
</menu_item_check>
<menu_item_check
@@ -3640,17 +3616,6 @@
parameter="all" />
</menu_item_call>
</menu>
- <menu_item_check
- label="Show Toolbar"
- layout="topleft"
- name="Show Toolbar">
- <menu_item_check.on_check
- function="FloaterVisible"
- parameter="toolbar" />
- <menu_item_check.on_click
- function="ShowFloater"
- parameter="toolbar" />
- </menu_item_check>
<menu
create_jump_keys="true"
label="Help"
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index bcf006f1a0..d4b712e048 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -370,6 +370,19 @@ Add this Ability to &apos;[ROLE_NAME]&apos;?
</notification>
<notification
+ icon="alertmodal.tga"
+ name="AttachmentDrop"
+ type="alertmodal">
+ You are about to drop your attachment.
+ Are you sure you want to continue?
+ <usetemplate
+ ignoretext="Confirm before dropping attachments"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="ClickUnimplemented"
type="alertmodal">
@@ -4328,7 +4341,6 @@ Hmm. Gesture [NAME] is missing from the database.
name="UnableToLoadGesture"
type="notifytip">
Unable to load gesture [NAME].
-Please try again.
</notification>
<notification
@@ -5761,6 +5773,17 @@ They will be blocked for a few seconds for your security.
</form>
</notification>
+ <notification
+ icon="alert.tga"
+ name="ConfirmCloseAll"
+ type="alertmodal">
+Are you sure you want to close all IMs?
+ <usetemplate
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Ok"/>
+ </notification>
+
<notification icon="notifytip.tga"
name="AttachmentSaved" type="notifytip">
Attachment has been saved.
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 3ed91cb48f..3416b2369d 100644
--- a/indra/newview/skins/default/xui/en/panel_activeim_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_activeim_row.xml
@@ -69,9 +69,9 @@
name="contact_name"
layout="topleft"
top="10"
- left_pad="20"
+ left_pad="10"
height="14"
- width="245"
+ width="255"
length="1"
follows="right|left"
use_ellipses="true"
diff --git a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
index f5fce65c73..f3a2297151 100644
--- a/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml
@@ -36,9 +36,9 @@
follows="all"
height="20"
label="Call"
- left_delta="40"
+ left_delta="10"
name="call_btn"
- width="100" />
+ width="160" />
<button
bottom="40"
follows="all"
@@ -46,14 +46,15 @@
label="Leave Call"
name="end_call_btn"
visible="false"
- width="100" />
+ />
<button
follows="all"
bottom="10"
height="20"
label="Voice Controls"
name="voice_ctrls_btn"
+ use_ellipses="true"
visible="false"
- width="100" />
+ />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 034f685ee9..3e2910458f 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -351,9 +351,9 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
height="23"
image_overlay="Unread_IM"
image_overlay_alignment="center"
- image_pressed="WellButton_Lit_Selected"
- image_pressed_selected="WellButton_Lit"
- image_selected="WellButton_Lit"
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Selected_Press"
label_color="Black"
left="0"
max_displayed_count="99"
@@ -391,9 +391,9 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
width="35">
<button
bottom_pad="3"
- image_selected="WellButton_Lit"
- image_pressed="WellButton_Lit_Selected"
- image_pressed_selected="WellButton_Lit "
+ image_pressed="WellButton_Lit"
+ image_pressed_selected="WellButton_Lit_Selected"
+ image_selected="PushButton_Selected_Press"
auto_resize="true"
halign="center"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_chat_header.xml b/indra/newview/skins/default/xui/en/panel_chat_header.xml
index 3e6ea84bf2..859822dd81 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -9,7 +9,7 @@
layout="topleft"
name="im_header"
width="310">
- <avatar_icon
+ <avatar_icon
follows="left"
height="18"
image_name="Generic_Person"
@@ -20,7 +20,7 @@
top="3"
width="18" />
<text_editor
- allow_scroll="false"
+ allow_scroll="false"
v_pad = "0"
read_only = "true"
follows="left|right"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
index f9ef038314..7aca40e8d9 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
index f4c03399fe..ed92b1e0f8 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
@@ -41,7 +41,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pants.xml b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
index ab105afd88..b764188e04 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
index 9a13dfa3c4..4b7235545f 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
index 154b9d959c..e886afa010 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
index d0f4d75444..6cccab1843 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_socks.xml b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
index acc6d482a7..fc7de00714 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
index 4f5c1c08b7..03e0bb70ef 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
index 715674e88b..20c56142fb 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
@@ -29,7 +29,6 @@
top="10"
width="64" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="80"
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index a5445a5783..86b30ebfce 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -24,9 +24,10 @@
follows="left|right|bottom"
height="23"
label="Group Profile"
- left_delta="28"
+ left_delta="10"
name="group_info_btn"
- width="125" />
+ use_ellipses="true"
+ width="160" />
<panel
background_visible="true"
bg_alpha_color="DkGray2"
@@ -43,24 +44,27 @@
follows="all"
height="23"
label="Call Group"
- left_delta="28"
+ left_delta="10"
name="call_btn"
- width="125" />
+ use_ellipses="true"
+ width="160" />
<button
bottom="40"
follows="all"
height="23"
label="Leave Call"
name="end_call_btn"
+ use_ellipses="true"
visible="false"
- width="125" />
+ />
<button
bottom="10"
follows="all"
height="23"
label="Open Voice Controls"
name="voice_ctrls_btn"
+ use_ellipses="true"
visible="false"
- width="125" />
+ />
</panel>
</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 1b70b95a93..e096715cee 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -78,7 +78,6 @@ Maximum 200 per group daily
image_unselected="AddItem_Off"
image_disabled="AddItem_Disabled"
layout="topleft"
- label="Create a new notice"
left="5"
name="create_new_notice"
tool_tip="Create a new notice"
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 0a3fd1699f..30e652befd 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -21,32 +21,32 @@
value="Unknown"
width="100" />
<button
- follows="left|top"
+ follows="left|top|right"
height="20"
label="Profile"
name="view_profile_btn"
width="100" />
<button
- follows="left|top"
+ follows="left|top|right"
height="20"
label="Add Friend"
name="add_friend_btn"
width="100" />
<button
- follows="left|top"
+ follows="left|top|right"
height="20"
label="Teleport"
name="teleport_btn"
width="100" />
<button
- follows="left|top"
+ follows="left|top|right"
height="20"
label="Share"
name="share_btn"
width="100" />
<!--Removing pay button to save space - will update spec - verified by Erica/Steve -->
<!-- <button
- follows="left|top"
+ follows="left|top|right"
height="20"
label="Pay"
name="pay_btn"
@@ -56,13 +56,14 @@
bg_alpha_color="DkGray2"
border="false"
top_pad="10"
- follows="left|bottom"
+ follows="left|bottom|right"
height="70"
left="1"
name="panel_call_buttons"
width="109">
<button
bottom="10"
+ follows="left|top|right"
height="20"
label="Call"
left_delta="5"
@@ -70,6 +71,7 @@
width="100" />
<button
bottom="35"
+ follows="left|top|right"
height="20"
label="Leave Call"
name="end_call_btn"
@@ -77,6 +79,7 @@
width="100" />
<button
bottom="10"
+ follows="left|top|right"
height="20"
label="Voice Controls"
name="voice_ctrls_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index 68e58b27ec..9f06e64560 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -60,6 +60,7 @@
layout="topleft"
left="10"
name="back_btn"
+ tool_tip="Back"
tab_stop="false"
top="0"
width="23" />
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
index 1f41a0d284..1f580831f9 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_security.xml
@@ -17,7 +17,7 @@
font="SansSerifSmall"
height="16"
initial_value="false"
- label="Only Allow Access to Specified URLs (by prefix)"
+ label="Only Allow Access to Specified URL patterns"
left="10"
mouse_opaque="true"
name="whitelist_enable"
@@ -81,10 +81,9 @@
height="40"
left="30"
text_color="0.6 0.0 0.0 1.0"
+ word_wrap="true"
name="home_url_fails_whitelist">
-Warning: the home page specified in the General tab
-fails to pass this whitelist. It has been disabled
-until a valid entry has been added.
+Warning: the home page specified in the General tab fails to pass this whitelist. It has been disabled until a valid entry has been added.
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
index e8e4a9dbb2..74265a51ca 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -149,6 +149,7 @@
<favorites_bar
follows="left|right|top"
+ font="SansSerif"
height="15"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index 9e7c9477d4..f15e75dee9 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -114,7 +114,7 @@
width="313">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Add"
layout="topleft"
left="0"
@@ -125,7 +125,7 @@
width="55" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="IM"
layout="topleft"
name="im"
@@ -135,7 +135,7 @@
width="40" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Call"
layout="topleft"
name="call"
@@ -146,7 +146,7 @@
<button
enabled="false"
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
name="show_on_map_btn"
@@ -156,7 +156,7 @@
width="50" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
name="teleport"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index db95d01b43..5c99022f35 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -1,61 +1,114 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="Outfits"
- height="510"
- width="333"
- follows="top|left"
- left="0"
- top_pad="0">
- <accordion
- single_expansion="true"
- height="510"
- layout="topleft"
- left="0"
- follows="top|left"
- name="outfits_accordion"
- top_pad="0"
- width="333">
- <accordion_tab
- expanded="false"
- layout="topleft"
- name="tab_cof"
- title="Current Outfit">
- <inventory_panel
+
+ <panel name="Outfits"
+ background_visible="true"
+ follows="all"
+ height="550"
+ label="Things"
+ layout="topleft"
+ min_height="350"
+ min_width="240"
+ width="330"
+ border="false">
+ <tab_container
+ follows="all"
+ height="500"
+ layout="topleft"
+ left="10"
+ name="appearance_tabs"
+ tab_min_width="100"
+ tab_height="30"
+ tab_position="top"
+ halign="center"
+ width="313">
+ <inventory_panel
+ label="MY OUTFITS"
+ help_topic="my_outfits_tab"
allow_multi_select="true"
+ follows="all"
border="false"
- height="460"
- left="0"
- top="0"
- mouse_opaque="true"
- name="cof_accordionpanel"
- start_folder="Current Outfit" />
- </accordion_tab>
- <accordion_tab
- expanded="true"
- layout="topleft"
- name="tab_outfits"
- title="My Outfits">
- <inventory_panel
- allow_multi_select="true"
- border="false"
- follows="all"
- left="0"
- top="0"
- height="460"
- mouse_opaque="true"
- name="outfitslist_accordionpanel"
- start_folder="My Outfits" />
- </accordion_tab>
- </accordion>
- <!--<button bottom="0"
- halign="center"
- height="23"
- label=">"
- enabled="false"
- mouse_opaque="false"
- name="selector"
- width="20"
- left="0"
- visible="false"
- follows="right|bottom"
- tool_tip="View outfit properties" />-->
+ left="0"
+ top="0"
+ height="500"
+ width="290"
+ mouse_opaque="true"
+ name="outfitslist_accordionpanel"
+ start_folder="My Outfits" />
+ <inventory_panel
+ label="WEARING"
+ help_topic="now_wearing_tab"
+ allow_multi_select="true"
+ border="false"
+ height="500"
+ width="290"
+ left="0"
+ top="0"
+ mouse_opaque="true"
+ name="cof_accordionpanel"
+ start_folder="Current Outfit" />
+ </tab_container>
+ <panel
+ background_visible="true"
+ follows="bottom|left"
+ height="50"
+ layout="topleft"
+ left="0"
+ visible="true"
+ name="bottom_panel"
+ top_pad="10"
+ width="313">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="18"
+ image_disabled="OptionsMenu_Disabled"
+ image_selected="OptionsMenu_Press"
+ image_unselected="OptionsMenu_Off"
+ layout="topleft"
+ left="10"
+ name="options_gear_btn"
+ top="6"
+ width="18" />
+ <dnd_button
+ follows="bottom|left"
+ height="18"
+ image_selected="TrashItem_Press"
+ image_unselected="TrashItem_Off"
+ layout="topleft"
+ right="-5"
+ name="trash_btn"
+ tool_tip="Remove selected item"
+ top="6"
+ width="18" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Edit Look"
+ layout="topleft"
+ left="10"
+ name="look_edit_btn"
+ top="26"
+ visible="false"
+ width="90" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Make Outfit"
+ layout="topleft"
+ name="make_outfit_btn"
+ tool_tip="Save appearance as an outfit"
+ top="26"
+ right="-110"
+ width="90" />
+ <button
+ follows="bottom|right"
+ height="23"
+ label="Wear"
+ layout="topleft"
+ name="wear_btn"
+ right="-10"
+ top="26"
+ tool_tip="Wear selected outfit"
+ width="90" />
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 87861e7901..8883c27c47 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -346,7 +346,7 @@ background_visible="true"
follows="bottom|left"
top="4"
left="0"
- height="19"
+ height="23"
label="Profile"
layout="topleft"
name="view_profile_btn"
@@ -356,7 +356,7 @@ background_visible="true"
follows="bottom|left"
top="4"
left_pad="2"
- height="19"
+ height="23"
label="IM"
layout="topleft"
name="im_btn"
@@ -366,7 +366,7 @@ background_visible="true"
follows="bottom|left"
top="4"
left_pad="2"
- height="19"
+ height="23"
label="Call"
layout="topleft"
name="call_btn"
@@ -376,7 +376,7 @@ background_visible="true"
follows="left|top"
top="4"
left_pad="2"
- height="19"
+ height="23"
label="Share"
layout="topleft"
name="share_btn"
@@ -385,7 +385,7 @@ background_visible="true"
follows="bottom|left"
top="4"
left_pad="2"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
name="teleport_btn"
@@ -395,7 +395,7 @@ background_visible="true"
follows="bottom|left"
top="4"
left="0"
- height="19"
+ height="23"
label="Group Profile"
layout="topleft"
name="group_info_btn"
@@ -405,7 +405,7 @@ background_visible="true"
follows="bottom|left"
top="4"
left_pad="2"
- height="19"
+ height="23"
label="Group Chat"
layout="topleft"
name="chat_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_pick_info.xml b/indra/newview/skins/default/xui/en/panel_pick_info.xml
index 0cf2a7afc3..f68202d287 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -103,7 +103,7 @@
name="buttons">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
left="0"
@@ -112,7 +112,7 @@
width="90" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
left_pad="10"
@@ -121,7 +121,7 @@
width="90" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Edit"
layout="topleft"
right="-1"
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 4facedc7ea..1fc553ff36 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -20,12 +20,9 @@
height="535"
layout="topleft"
left="6"
- name="empty_picks_panel_text"
+ name="picks_panel_text"
top="10"
- visible="false"
- width="313">
- There are no picks/classifieds here
- </text>
+ width="313"/>
<accordion
fit_parent="true"
follows="all"
@@ -132,7 +129,7 @@
<button
enabled="false"
follows="bottom|left"
- height="25"
+ height="23"
label="Info"
layout="topleft"
left="5"
@@ -144,7 +141,7 @@
<button
enabled="false"
follows="bottom|left"
- height="25"
+ height="23"
label="Teleport"
layout="topleft"
left_pad="5"
@@ -156,7 +153,7 @@
<button
enabled="false"
follows="bottom|left"
- height="25"
+ height="23"
label="Map"
layout="topleft"
left_pad="5"
diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml
index b25d9a7dfc..8fc2ae39f0 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -145,6 +145,7 @@
layout="topleft"
left="10"
name="back_btn"
+ tool_tip="Back"
tab_stop="false"
top="0"
width="23" />
@@ -517,7 +518,7 @@
width="60" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="About Land"
layout="topleft"
name="about_land_btn"
@@ -526,7 +527,7 @@
top="138"
width="90">
<click_callback
- function="ShowFloater"
+ function="Floater.Show"
parameter="about_land" />
</button>
</panel>
@@ -644,7 +645,7 @@
</text>
<button
follows="bottom|right"
- height="19"
+ height="23"
label="Region/Estate"
layout="topleft"
name="region_info_btn"
@@ -652,7 +653,7 @@
tab_stop="false"
width="105">
<click_callback
- function="ShowFloater"
+ function="Floater.Show"
parameter="region_info" />
</button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index d4a6c7f3b3..8a5c023133 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -72,7 +72,7 @@ background_visible="true"
width="313">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
left="5"
@@ -82,37 +82,38 @@ background_visible="true"
width="100" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
left_pad="5"
name="map_btn"
- tool_tip="Show selected area on the map"
top="0"
width="70" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Edit"
layout="topleft"
left_pad="5"
name="edit_btn"
+ tool_tip="Edit landmark information"
top="0"
width="70" />
<button
follows="bottom|right"
- height="19"
+ height="23"
image_disabled="ForwardArrow_Off"
image_selected="ForwardArrow_Press"
image_unselected="ForwardArrow_Off"
layout="topleft"
name="overflow_btn"
+ tool_tip="Show additional options"
right="-10"
top="0"
width="18" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="Close"
layout="topleft"
name="close_btn"
@@ -121,7 +122,7 @@ background_visible="true"
width="60" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
@@ -130,7 +131,7 @@ background_visible="true"
width="60" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="Save"
layout="topleft"
name="save_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
index 405ff02836..426a2b1f9e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -29,7 +29,6 @@
name="bubble_text_chat"
width="150" />
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0 0 0 1"
control_name="BackgroundChatColor"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index fff53c1de2..017c321767 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -16,13 +16,14 @@
control_name="ChatFontSize"
name="chat_font_size"
top="10"
- width="331">
+ width="440">
<radio_item
height="16"
label="Small"
layout="topleft"
left="0"
name="radio"
+ value="0"
top="10"
width="125" />
<radio_item
@@ -31,6 +32,7 @@
layout="topleft"
left_delta="145"
name="radio2"
+ value="1"
top_delta="0"
width="125" />
<radio_item
@@ -39,11 +41,11 @@
layout="topleft"
left_delta="170"
name="radio3"
+ value="2"
top_delta="0"
width="125" />
</radio_group>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="47"
@@ -73,7 +75,6 @@
Me
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
follows="left|top"
height="47"
@@ -103,7 +104,6 @@
Others
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.6 0.6 1 1"
follows="left|top"
@@ -135,7 +135,6 @@
IM
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.8 1 1 1"
follows="left|top"
@@ -167,7 +166,6 @@
System
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.82 0.82 0.99 1"
follows="left|top"
@@ -198,7 +196,6 @@
Errors
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.7 0.9 0.7 1"
follows="left|top"
@@ -229,7 +226,6 @@
Objects
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.7 0.9 0.7 1"
follows="left|top"
@@ -260,7 +256,6 @@
Owner
</text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
can_apply_immediately="true"
color="0.6 0.6 1 1"
follows="left|top"
@@ -340,6 +335,7 @@
layout="topleft"
left="0"
name="radio"
+ value="0"
top="0"
width="150" />
<radio_item
@@ -348,6 +344,7 @@
layout="topleft"
left_delta="145"
name="radio2"
+ value="1"
top_delta="0"
width="150" />
</radio_group>
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 b5c6b637e5..41bd7f3dcc 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -13,7 +13,7 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="language_textbox"
@@ -23,14 +23,13 @@
</text>
<combo_box
control_name="Language"
- follows="left|bottom"
+ follows="left|top"
height="23"
layout="topleft"
- left_delta="50"
+ left="50"
max_chars="135"
name="language_combobox"
- top_pad="10"
- width="170">
+ width="200">
<combo_box.item
enabled="true"
label="System default"
@@ -66,7 +65,6 @@
label="Italiano (Italian) - Beta"
name="Italian"
value="it" />
-
<combo_box.item
enabled="true"
label="Nederlands (Dutch) - Beta"
@@ -82,62 +80,54 @@
label="Portugués (Portuguese) - Beta"
name="Portugese"
value="pt" />
-
-
-
-
<combo_box.item
enabled="true"
label="日本語 (Japanese) - Beta"
name="(Japanese)"
value="ja" />
-
-
</combo_box>
<text
+ font="SansSerifSmall"
type="string"
length="1"
follows="left|top"
- height="10"
+ height="18"
layout="topleft"
- left_delta="175"
+ left_pad="5"
name="language_textbox2"
- top_delta="1"
- width="400">
+ width="200">
(Requires restart)
</text>
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
+ top_pad="15"
name="maturity_desired_prompt"
- top_pad="10"
- width="400">
+ width="200">
I want to access content rated:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
- left="90"
+ left_pad="5"
name="maturity_desired_textbox"
- top_pad="10"
- width="400">
+ width="200">
</text>
<combo_box
control_name="PreferredMaturity"
- follows="left|bottom"
+ follows="left|top"
height="23"
layout="topleft"
- left_delta="-10"
+ left="50"
name="maturity_desired_combobox"
- top_pad="-10"
- width="170">
+ width="200">
<combo_box.item
label="General, Moderate, Adult"
name="Desired_Adult"
@@ -155,23 +145,22 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="start_location_textbox"
- top_delta="20"
+ top_pad="10"
width="394">
Start location:
</text>
<combo_box
control_name="LoginLocation"
- follows="left|bottom"
+ follows="left|top"
height="23"
layout="topleft"
- left_delta="50"
name="start_location_combo"
- top_pad="10"
- width="170">
+ left="50"
+ width="200">
<combo_box.item
label="My Last Location"
name="MyLastLocation"
@@ -187,54 +176,48 @@
initial_value="true"
label="Show on login"
layout="topleft"
- left_delta="175"
+ left_pad="5"
name="show_location_checkbox"
- top_delta="1"
+ top_delta="5"
width="256" />
-
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="name_tags_textbox"
- top_pad="10"
+ top_pad="15"
width="400">
Name tags:
</text>
<radio_group
control_name="AvatarNameTagMode"
- height="30"
+ height="20"
layout="topleft"
- left_delta="50"
- name="Name_Tag_Preference"
- top_pad="10">
+ left="50"
+ name="Name_Tag_Preference">
<radio_item
- height="16"
label="Off"
layout="topleft"
- left="0"
name="radio"
- top_pad="0"
- width="98" />
+ value="0"
+ width="100" />
<radio_item
- height="16"
label="On"
layout="topleft"
left_pad="12"
name="radio2"
- top_delta="0"
- width="98" />
+ value="1"
+ width="100" />
<radio_item
- height="16"
label="Show briefly"
layout="topleft"
left_pad="12"
name="radio3"
- top_delta="0"
- width="98" />
+ value="2"
+ width="100" />
</radio_group>
<check_box
enabled_control="AvatarNameTagMode"
@@ -242,9 +225,8 @@
height="16"
label="Show my name"
layout="topleft"
- left_delta="0"
+ left="50"
name="show_my_name_checkbox1"
- top_pad="-7"
width="300" />
<check_box
enabled_control="AvatarNameTagMode"
@@ -255,7 +237,6 @@
layout="topleft"
left_delta="175"
name="small_avatar_names_checkbox"
- top_delta="0"
width="200" />
<check_box
enabled_control="AvatarNameTagMode"
@@ -271,92 +252,95 @@
type="string"
length="1"
follows="left|top"
- height="10"
+ height="15"
layout="topleft"
left="30"
name="effects_color_textbox"
- top_pad="5"
- width="400">
+ top_pad="15"
+ width="200">
My effects:
</text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="13"
+ layout="topleft"
+ left_pad="5"
+ name="title_afk_text"
+ width="190">
+ Away timeout:
+ </text>
<color_swatch
- border_color="0.45098 0.517647 0.607843 1"
control_name="EffectColor"
follows="left|top"
- height="48"
+ height="50"
layout="topleft"
- left_delta="50"
+ left="50"
name="effect_color_swatch"
tool_tip="Click to open Color Picker"
- top_pad="5"
- width="32" />
+ width="38" />
+ <combo_box
+ height="23"
+ layout="topleft"
+ control_name="AFKTimeout"
+ left_pad="160"
+ label="Away timeout:"
+ top_delta="0"
+ name="afk"
+ width="130">
+ <combo_box.item
+ label="2 minutes"
+ name="item0"
+ value="120" />
+ <combo_box.item
+ label="5 minutes"
+ name="item1"
+ value="300" />
+ <combo_box.item
+ label="10 minutes"
+ name="item2"
+ value="600" />
+ <combo_box.item
+ label="30 minutes"
+ name="item3"
+ value="1800" />
+ <combo_box.item
+ label="never"
+ name="item4"
+ value="0" />
+ </combo_box>
<text
type="string"
length="1"
follows="left|top"
- height="15"
- layout="topleft"
- left="30"
- name="title_afk_text"
- text_color="white"
- top_pad="-5"
- width="190">
- Away timeout:
- </text>
- <spinner
- control_name="AFKTimeout"
- decimal_digits="0"
- follows="left|top"
- halign="right"
- height="15"
- increment="1"
- initial_value="300"
- label=""
- label_width="0"
- layout="topleft"
- left_delta="50"
- max_val="600"
- min_val="30"
- name="afk_timeout_spinner"
- top_pad="5"
- width="50" />
- <text
- type="string"
- length="1"
- follows="left|top"
- halign="left"
- height="15"
- layout="topleft"
- left_pad="2"
- name="seconds_textbox"
- width="70">
- seconds
- </text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
+ height="13"
layout="topleft"
text_color="white"
left="30"
mouse_opaque="false"
name="text_box3"
- top_pad="10"
+ top_pad="15"
width="240">
Busy mode response:
</text>
<text_editor
control_name="BusyModeResponse2"
+ text_readonly_color="LabelDisabledColor"
+ bg_writeable_color="LtGray"
+ use_ellipses="false"
+ bg_visible="false"
+ border_visible="false"
+ hover="false"
+ text_color="LabelTextColor"
commit_on_focus_lost = "true"
follows="left|top"
- height="56"
+ height="50"
layout="topleft"
- left_delta="50"
+ left="50"
name="busy_response"
width="400"
- word_wrap="true"
- top_pad="5">
+ word_wrap="true">
log_in_to_change
</text_editor>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
index 04985d0fa9..f97ccafecc 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -28,7 +28,7 @@
follows="left|top"
height="15"
increment="0.025"
- initial_valu="1"
+ initial_value="1"
layout="topleft"
left_delta="52"
max_val="1.4"
@@ -656,6 +656,7 @@
layout="topleft"
left="3"
name="SunMoon"
+ value="0"
top="3"
width="156" />
<radio_item
@@ -664,6 +665,7 @@
layout="topleft"
left_delta="0"
name="LocalLights"
+ value="1"
top_delta="16"
width="156" />
</radio_group>
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 a65f7d3a54..83dc7cd854 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -268,24 +268,26 @@
name="use_external_browser"
top_pad="4"
width="480">
- <radio_item
- height="20"
- label="Use built-in browser"
- layout="topleft"
- left="0"
- name="internal"
- tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]."
- top="0"
- width="480" />
- <radio_item
- height="20"
- label="Use my browser (IE, Firefox)"
- layout="topleft"
- left_delta="0"
- name="external"
- tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
- top_delta="20"
- width="480" />
+ <radio_item
+ height="20"
+ label="Use built-in browser"
+ layout="topleft"
+ left="0"
+ name="internal"
+ value="0"
+ tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]."
+ top="0"
+ width="480" />
+ <radio_item
+ height="20"
+ label="Use my browser (IE, Firefox)"
+ layout="topleft"
+ left_delta="0"
+ name="external"
+ value="1"
+ tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
+ top_delta="20"
+ width="480" />
</radio_group>
<check_box
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 bffb28d16e..b14089c3a2 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
@@ -5,11 +5,12 @@
background_visible="false"
height="200"
layout="topleft"
+ help_topic="prim_media_controls"
mouse_opaque="false"
width="800">
<string name="control_background_image_name">Inspector_Background</string>
<string name="skip_step">0.2</string>
- <string name="min_width">300</string>
+ <string name="min_width">400</string>
<string name="min_height">120</string>
<string name="zoom_near_padding">1.0</string>
<string name="zoom_medium_padding">1.25</string>
@@ -398,6 +399,8 @@
function="MediaCtrl.ToggleMute" />
<button.mouseenter_callback
function="MediaCtrl.ShowVolumeSlider" />
+ <button.mouseleave_callback
+ function="MediaCtrl.HideVolumeSlider" />
</button>
<slider
orientation="vertical"
@@ -413,6 +416,10 @@
volume="true">
<slider.commit_callback
function="MediaCtrl.Volume"/>
+ <slider.mouseenter_callback
+ function="MediaCtrl.ShowVolumeSlider" />
+ <slider.mouseleave_callback
+ function="MediaCtrl.HideVolumeSlider" />
</slider>
</layout_panel>
<panel
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 638bc3cabd..342cf4144f 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -275,12 +275,12 @@
left="0"
name="profile_buttons_panel"
top_pad="2"
- bottom="10"
+ bottom="0"
height="19"
width="303">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Add Friend"
layout="topleft"
left="0"
@@ -291,7 +291,7 @@
width="77" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="IM"
layout="topleft"
name="im"
@@ -301,7 +301,7 @@
width="33" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Call"
layout="topleft"
name="call"
@@ -312,7 +312,7 @@
<button
enabled="false"
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
name="show_on_map_btn"
@@ -322,7 +322,7 @@
width="44" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
name="teleport"
@@ -332,7 +332,7 @@
width="67" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="▼"
layout="topleft"
name="overflow_btn"
@@ -352,14 +352,14 @@
width="303">
<button
follows="bottom|right"
- height="19"
+ height="23"
left="10"
label="Edit Profile"
name="edit_profile_btn"
width="130" />
<button
follows="bottom|right"
- height="19"
+ height="23"
label="Edit Appearance"
left_pad="10"
name="edit_appearance_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index 8e683bffc1..6324ec2bd8 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -26,18 +26,20 @@
top="2"
width="23" />
<text_editor
- read_only = "true"
- follows="top|left|right"
- font="SansSerifHugeBold"
- height="29"
- layout="topleft"
- left_pad="10"
- name="user_name"
- text_color="white"
- top="0"
- value="(Loading...)"
- use_ellipses="true"
- width="275" />
+ allow_scroll="false"
+ bg_visible="false"
+ read_only = "true"
+ follows="top|left|right"
+ font="SansSerifHugeBold"
+ height="29"
+ layout="topleft"
+ left_pad="10"
+ name="user_name"
+ text_color="white"
+ top="0"
+ value="(Loading...)"
+ use_ellipses="true"
+ width="275" />
<text
follows="top|left"
height="13"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
index 3384852f27..4f40e00815 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history_item.xml
@@ -55,6 +55,7 @@
left_pad="5"
right="-3"
name="profile_btn"
+ tool_tip="Show item info"
top="1"
visible="false"
width="20" />
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index 3dac1a9614..7f4b4aef82 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -85,72 +85,21 @@ left="0"
class="panel_outfits_inventory"
filename="panel_outfits_inventory.xml"
name="panel_outfits_inventory"
- height="510"
+ height="550"
min_height="510"
width="333"
top_pad="0"
- follows="top|left"
+ follows="all"
/>
- <panel
- visible="true"
- name="bottom_panel"
- height="50"
- left="0"
- top_pad="3"
- follows="bottom|left"
- width="333">
- <button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
- layout="topleft"
- left="10"
- name="options_gear_btn"
- top="6"
- width="18" />
- <button
- follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
- layout="topleft"
- left_pad="5"
- name="newlook_btn"
- tool_tip="Add new outfit"
- width="18" />
- <dnd_button
- follows="bottom|left"
- height="18"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
- layout="topleft"
- right="-5"
- name="trash_btn"
- tool_tip="Remove selected item"
- top="6"
- width="18" />
- <button
- follows="bottom|left"
- height="23"
- label="Wear"
- layout="topleft"
- name="wear_btn"
- right="-5"
- top_pad="0"
- width="90" />
- </panel>
- <!-- <button
- follows="bottom|left"
- height="23"
- label="New outfit"
- layout="topleft"
- left_pad="5"
- right="-10"
- width="100" />-->
+ <!-- <button
+ follows="bottom|left"
+ height="23"
+ label="New outfit"
+ layout="topleft"
+ left_pad="5"
+ right="-10"
+ name="newlook_btn"
+ width="100" />-->
<panel
class="panel_look_info"
filename="panel_look_info.xml"
@@ -158,6 +107,7 @@ left="0"
layout="topleft"
left="0"
name="panel_look_info"
+ top="35"
visible="false" />
<panel
class="panel_edit_wearable"
@@ -166,5 +116,7 @@ left="0"
layout="topleft"
left="0"
name="panel_edit_wearable"
+ top="35"
visible="false" />
-</panel> \ No newline at end of file
+</panel>
+
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index e04af2bad6..7b0b4b0bde 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -6,7 +6,7 @@
name="item properties"
help_topic="item_properties"
save_rect="true"
- title="Inventory Item Properties"
+ title="Object Profile"
width="333">
<panel.string
name="unknown">
@@ -50,15 +50,15 @@
width="23" />
<text
follows="top|left|right"
- font="SansSerifHugeBold"
+ font="SansSerifHuge"
height="26"
layout="topleft"
left_pad="10"
name="title"
- text_color="white"
+ text_color="LtGray"
top="0"
use_ellipses="true"
- value="Item Properties"
+ value="Object Profile"
width="275" />
<panel
follows="all"
@@ -71,7 +71,7 @@
width="313"
background_visible="true"
bg_alpha_color="DkGray2">
- <text
+ <text
type="string"
length="1"
follows="left|top"
@@ -79,7 +79,7 @@
layout="topleft"
left="5"
name="LabelItemNameTitle"
- top="5"
+ top="10"
width="78">
Name:
</text>
@@ -87,7 +87,7 @@
border_style="line"
border_thickness="1"
follows="left|top|right"
- height="16"
+ height="20"
layout="topleft"
left_delta="78"
max_length="63"
@@ -102,7 +102,7 @@
layout="topleft"
left="5"
name="LabelItemDescTitle"
- top_delta="20"
+ top_pad="10"
width="78">
Description:
</text>
@@ -115,7 +115,7 @@
left_delta="78"
max_length="127"
name="LabelItemDesc"
- top_delta="0"
+ top_delta="-5"
width="225" />
<text
type="string"
@@ -123,32 +123,41 @@
follows="left|top"
height="23"
layout="topleft"
- left="10"
+ left="5"
name="LabelCreatorTitle"
- top="65"
+top_pad="10"
width="78">
Creator:
</text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
<text
type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left_delta="78"
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
name="LabelCreatorName"
- top_delta="0"
+ top_delta="6"
width="140">
Nicole Linden
</text>
<button
follows="top|right"
height="23"
- label="Profile..."
+ label="Profile"
layout="topleft"
- left_delta="144"
+ right="-1"
name="BtnCreator"
- top_delta="0"
+ top_delta="-6"
width="78" />
<text
type="string"
@@ -156,32 +165,41 @@
follows="left|top"
height="23"
layout="topleft"
- left="10"
+ left="5"
name="LabelOwnerTitle"
- top="85"
+top_pad="5"
width="78">
Owner:
</text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
<text
type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left_delta="78"
+ follows="left|right"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
name="LabelOwnerName"
- top_delta="0"
+ top_delta="6"
width="140">
Thrax Linden
</text>
<button
follows="top|right"
height="23"
- label="Profile..."
+ label="Profile"
layout="topleft"
- left_delta="144"
+ right="-1"
name="BtnOwner"
- top_delta="0"
+ top_delta="-3"
width="78" />
<text
type="string"
@@ -189,9 +207,9 @@
follows="left|top"
height="23"
layout="topleft"
- left="10"
+ left="5"
name="LabelAcquiredTitle"
- top="105"
+top_pad="10"
width="78">
Acquired:
</text>
@@ -207,134 +225,146 @@
width="222">
Wed May 24 12:50:46 2006
</text>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="10"
- name="OwnerLabel"
- top="125"
- width="78">
- You:
- </text>
+ <panel
+ border="false"
+ follows="left|top"
+ layout="topleft"
+ mouse_opaque="false"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ name="perms_inv"
+ left="0"
+ top_pad="25"
+ height="155"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="13"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can:
+ </text>
<check_box
- height="23"
- label="Edit"
+ height="18"
+ label="Modify"
layout="topleft"
- left_pad="5"
+ left="20"
name="CheckOwnerModify"
- top_delta="0"
- width="78" />
+ top_pad="0"
+ width="90" />
<check_box
- height="23"
+ height="18"
label="Copy"
layout="topleft"
- left_delta="0"
+ left_pad="0"
name="CheckOwnerCopy"
- top_pad="5"
- width="88" />
+ width="90" />
<check_box
- height="23"
- label="Resell"
+ height="18"
+ label="Transfer"
layout="topleft"
- left_delta="0"
+ left_pad="0"
name="CheckOwnerTransfer"
- top_pad="5"
width="106" />
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="16"
layout="topleft"
left="10"
name="AnyoneLabel"
- top_pad="5"
- width="78">
+ top_pad="8"
+ width="100">
Anyone:
</text>
<check_box
- height="16"
+ height="18"
label="Copy"
layout="topleft"
- left_pad="5"
+ left_pad="0"
name="CheckEveryoneCopy"
- top_delta="0"
- width="130" />
+ top_delta="-2"
+ width="150" />
<text
type="string"
length="1"
follows="left|top"
- height="10"
+ height="16"
layout="topleft"
left="10"
name="GroupLabel"
- top_pad="5"
- width="78">
+ top_pad="8"
+ width="100">
Group:
</text>
<check_box
- height="16"
+ height="18"
label="Share"
layout="topleft"
- left_pad="5"
+ left_pad="0"
+ top_delta="-2"
name="CheckShareWithGroup"
- top_delta="5"
- width="106" />
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ width="150" />
<text
type="string"
length="1"
follows="left|top"
- height="25"
+ height="16"
layout="topleft"
left="10"
name="NextOwnerLabel"
- top_pad="5"
- width="78"
+ top_pad="8"
+ width="200"
word_wrap="true">
Next owner:
</text>
<check_box
- height="16"
- label="Edit"
+ height="18"
+ label="Modify"
layout="topleft"
- left_pad="5"
+ left="20"
+ top_pad="0"
name="CheckNextOwnerModify"
- top_delta="0"
- width="78" />
+ width="90" />
<check_box
- height="16"
+ height="18"
label="Copy"
layout="topleft"
- left_delta="0"
+ left_pad="0"
name="CheckNextOwnerCopy"
- top_pad="5"
- width="88" />
+ width="90" />
<check_box
- height="16"
- label="Resell"
+ height="18"
+ label="Transfer"
layout="topleft"
- left_delta="0"
+ left_pad="0"
name="CheckNextOwnerTransfer"
- top_pad="5"
+ tool_tip="Next owner can give away or resell this object"
width="106" />
+ </panel>
<check_box
- height="16"
+ height="18"
label="For Sale"
layout="topleft"
- left="10"
+ left="20"
name="CheckPurchase"
- top_pad="5"
- width="78" />
+ top_pad="20"
+ width="100" />
<combo_box
- height="19"
- left_pad="5"
+ height="23"
+ left_pad="0"
layout="topleft"
follows="left|top"
name="combobox sale copy"
- width="110">
+ width="170">
<combo_box.item
label="Copy"
name="Copy"
@@ -350,26 +380,14 @@
increment="1"
control_name="Edit Cost"
name="Edit Cost"
- label="Price:"
- label_width="100"
- left="10"
- width="192"
+ label="Price: L$"
+ label_width="75"
+ left="120"
+ width="170"
min_val="1"
- height="19"
+ height="23"
max_val="999999999"
- top_pad="5"/>
- <text
- type="string"
- length="1"
- height="15"
- follows="left|top"
- layout="topleft"
- left_delta="82"
- name="CurrencySymbol"
- top_delta="1"
- width="18">
- L$
- </text>
+ top_pad="10"/>
<!--line_editor
border_style="line"
border_thickness="1"
@@ -492,4 +510,22 @@
Price: L$
</text-->
</panel>
+ <panel
+ height="25"
+ layout="bottomright"
+ help_topic="button_tab"
+ name="button_panel"
+ left="5"
+ bottom="5"
+ width="313">
+ <button
+ follows="bottom|right"
+ height="25"
+ label="Cancel"
+ layout="topleft"
+ name="cancel_btn"
+ right="-1"
+ left_pad="10"
+ width="100" />
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
index eff2ca1fcd..5b379b54e3 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -487,7 +487,7 @@
height="25"
label="Open"
layout="topleft"
- left_pad="5"
+ left="5"
name="open_btn"
top="0"
width="60" />
@@ -509,23 +509,5 @@
name="buy_btn"
top="0"
width="60" />
- <button
- follows="bottom|right"
- height="25"
- label="Cancel"
- layout="topleft"
- name="cancel_btn"
- right="-1"
- top="0"
- width="70" />
- <button
- follows="bottom|right"
- height="25"
- label="Save"
- layout="topleft"
- name="save_btn"
- left_pad="-135"
- top="0"
- width="60" />
</panel>
</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 2f50c5ee6c..ec4723bd55 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2074,6 +2074,10 @@ this texture in your inventory
<!-- panel classified -->
<string name="ClassifiedClicksTxt">Clicks: [TELEPORT] teleport, [MAP] map, [PROFILE] profile</string>
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
+
+ <!-- panel picks -->
+ <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string>
+ <string name="PicksClassifiedsLoadingText">Loading...</string>
<!-- Multi Preview Floater -->
<string name="MultiPreviewTitle">Preview</string>
@@ -2842,6 +2846,10 @@ 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>
+ <!-- voice calls -->
+ <string name="started_call">Started a voice call</string>
+ <string name="joined_call">Joined the voice call</string>
+
<string name="ringing-im">
Joining Voice Chat...
</string>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index d7aa71a441..51f85e65e2 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -18,6 +18,6 @@
font="SansSerifSmall"
hover_glow_amount="0.15"
halign="center"
- pad_bottom="2"
+ pad_bottom="3"
scale_image="true">
</button>
diff --git a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
index 178c890c61..bda88857ae 100644
--- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
+++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<color_swatch alpha_background_image="color_swatch_alpha.tga"
- border_color="DefaultHighlightLight"
+ border_color="ColorSwatchBorderColor"
name="color_swatch">
<color_swatch.caption_text name="caption"
font="SansSerifSmall"
diff --git a/indra/newview/skins/default/xui/en/widgets/tab_container.xml b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
index 477c6fb8b8..3368fa88ef 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--
+label_pad_bottom - vertical padding under tab button labels
+label_pad_left - padding to the left of tab button labels
+-->
<tab_container tab_min_width="60"
tab_max_width="150"
- font_halign="center"
+ halign="center"
font="SansSerifSmall"
- tab_height="21">
+ tab_height="21"
+ label_pad_bottom="2"
+ label_pad_left="4">
<first_tab tab_top_image_unselected="TabTop_Left_Off"
tab_top_image_selected="TabTop_Left_Selected"
tab_bottom_image_unselected="Toolbar_Left_Off"
@@ -22,4 +28,4 @@
tab_bottom_image_selected="Toolbar_Right_Selected"
tab_left_image_unselected="TabTop_Middle_Off"
tab_left_image_selected="TabTop_Middle_Selected"/>
-</tab_container> \ No newline at end of file
+</tab_container>
diff --git a/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
index 6c559aa185..4f574d75d5 100644
--- a/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
+++ b/indra/newview/skins/default/xui/en/widgets/teleport_history_menu_item.xml
@@ -3,6 +3,6 @@
Based on menu_item_call.xml -->
<teleport_history_menu_item
back_item_font="SansSerif"
- current_item_font="SansSerif"
+ current_item_font="SansSerifBold"
forward_item_font="SansSerif"
/>
diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 5dd09e663b..855584a0db 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -11,7 +11,6 @@
allow_scroll="false"
text_readonly_color="LabelDisabledColor"
bg_writeable_color="FloaterDefaultBackgroundColor"
- border_color="DefaultHighlightLight"
use_ellipses="false"
bg_visible="false"
border_visible="false"
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 32fdd41be2..d2859db296 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -40,67 +40,73 @@ sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util'))
from llmanifest import LLManifest, main, proper_windows_path, path_ancestors
class ViewerManifest(LLManifest):
+ def is_packaging_viewer(self):
+ # This is overridden by the WindowsManifest sub-class,
+ # which has different behavior if it is not packaging the viewer.
+ return True
+
def construct(self):
super(ViewerManifest, self).construct()
self.exclude("*.svn*")
self.path(src="../../scripts/messages/message_template.msg", dst="app_settings/message_template.msg")
self.path(src="../../etc/message.xml", dst="app_settings/message.xml")
- if self.prefix(src="app_settings"):
- self.exclude("logcontrol.xml")
- self.exclude("logcontrol-dev.xml")
- self.path("*.pem")
- self.path("*.ini")
- self.path("*.xml")
- self.path("*.db2")
-
- # include the entire shaders directory recursively
- self.path("shaders")
- # ... and the entire windlight directory
- self.path("windlight")
- self.end_prefix("app_settings")
-
- if self.prefix(src="character"):
- self.path("*.llm")
- self.path("*.xml")
- self.path("*.tga")
- self.end_prefix("character")
-
- # Include our fonts
- if self.prefix(src="fonts"):
- self.path("*.ttf")
- self.path("*.txt")
- self.end_prefix("fonts")
-
- # skins
- if self.prefix(src="skins"):
- self.path("paths.xml")
- # include the entire textures directory recursively
- if self.prefix(src="*/textures"):
- self.path("*/*.tga")
- self.path("*/*.j2c")
- self.path("*/*.jpg")
- self.path("*/*.png")
- self.path("*.tga")
- self.path("*.j2c")
- self.path("*.jpg")
- self.path("*.png")
- self.path("textures.xml")
- self.end_prefix("*/textures")
- self.path("*/xui/*/*.xml")
- self.path("*/xui/*/widgets/*.xml")
- self.path("*/*.xml")
-
- # Local HTML files (e.g. loading screen)
- if self.prefix(src="*/html"):
- self.path("*.png")
- self.path("*/*/*.html")
- self.path("*/*/*.gif")
- self.end_prefix("*/html")
- self.end_prefix("skins")
-
- # Files in the newview/ directory
- self.path("gpu_table.txt")
+ if self.is_packaging_viewer():
+ if self.prefix(src="app_settings"):
+ self.exclude("logcontrol.xml")
+ self.exclude("logcontrol-dev.xml")
+ self.path("*.pem")
+ self.path("*.ini")
+ self.path("*.xml")
+ self.path("*.db2")
+
+ # include the entire shaders directory recursively
+ self.path("shaders")
+ # ... and the entire windlight directory
+ self.path("windlight")
+ self.end_prefix("app_settings")
+
+ if self.prefix(src="character"):
+ self.path("*.llm")
+ self.path("*.xml")
+ self.path("*.tga")
+ self.end_prefix("character")
+
+ # Include our fonts
+ if self.prefix(src="fonts"):
+ self.path("*.ttf")
+ self.path("*.txt")
+ self.end_prefix("fonts")
+
+ # skins
+ if self.prefix(src="skins"):
+ self.path("paths.xml")
+ # include the entire textures directory recursively
+ if self.prefix(src="*/textures"):
+ self.path("*/*.tga")
+ self.path("*/*.j2c")
+ self.path("*/*.jpg")
+ self.path("*/*.png")
+ self.path("*.tga")
+ self.path("*.j2c")
+ self.path("*.jpg")
+ self.path("*.png")
+ self.path("textures.xml")
+ self.end_prefix("*/textures")
+ self.path("*/xui/*/*.xml")
+ self.path("*/xui/*/widgets/*.xml")
+ self.path("*/*.xml")
+
+ # Local HTML files (e.g. loading screen)
+ if self.prefix(src="*/html"):
+ self.path("*.png")
+ self.path("*/*/*.html")
+ self.path("*/*/*.gif")
+ self.end_prefix("*/html")
+ self.end_prefix("skins")
+
+ # Files in the newview/ directory
+ self.path("gpu_table.txt")
def login_channel(self):
"""Channel reported for login and upgrade purposes ONLY;
@@ -163,6 +169,12 @@ class WindowsManifest(ViewerManifest):
else:
return ''.join(self.channel().split()) + '.exe'
+ def is_packaging_viewer(self):
+ # Some commands, files will only be included
+ # if we are packaging the viewer on windows.
+ # This manifest is also used to copy
+ # files during the build.
+ return 'package' in self.args['actions']
def test_msvcrt_and_copy_action(self, src, dst):
# This is used to test a dll manifest.
@@ -211,22 +223,25 @@ class WindowsManifest(ViewerManifest):
print "Doesn't exist:", src
def enable_crt_manifest_check(self):
- WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
+ if self.is_packaging_viewer():
+ WindowsManifest.copy_action = WindowsManifest.test_msvcrt_and_copy_action
def enable_no_crt_manifest_check(self):
- WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
+ if self.is_packaging_viewer():
+ WindowsManifest.copy_action = WindowsManifest.test_for_no_msvcrt_manifest_and_copy_action
def disable_manifest_check(self):
- del WindowsManifest.copy_action
+ if self.is_packaging_viewer():
+ del WindowsManifest.copy_action
def construct(self):
super(WindowsManifest, self).construct()
self.enable_crt_manifest_check()
- # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
- self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
-
+ if self.is_packaging_viewer():
+ # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe.
+ self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe())
# Plugin host application
self.path(os.path.join(os.pardir,
@@ -316,26 +331,53 @@ class WindowsManifest(ViewerManifest):
if self.prefix(src='../media_plugins/webkit/%s' % self.args['configuration'], dst="llplugin"):
self.path("media_plugin_webkit.dll")
self.end_prefix()
-
- if self.prefix(src="../../libraries/i686-win32/lib/release", dst="llplugin"):
- self.path("libeay32.dll")
- self.path("qtcore4.dll")
- self.path("qtgui4.dll")
- self.path("qtnetwork4.dll")
- self.path("qtopengl4.dll")
- self.path("qtwebkit4.dll")
- self.path("ssleay32.dll")
- self.end_prefix()
- # For WebKit/Qt plugin runtimes (image format plugins)
- if self.prefix(src="../../libraries/i686-win32/lib/release/imageformats", dst="llplugin/imageformats"):
- self.path("qgif4.dll")
- self.path("qico4.dll")
- self.path("qjpeg4.dll")
- self.path("qmng4.dll")
- self.path("qsvg4.dll")
- self.path("qtiff4.dll")
- self.end_prefix()
+ if self.args['configuration'].lower() == 'debug':
+ if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'),
+ dst="llplugin"):
+ self.path("libeay32.dll")
+ self.path("qtcored4.dll")
+ self.path("qtguid4.dll")
+ self.path("qtnetworkd4.dll")
+ self.path("qtopengld4.dll")
+ self.path("qtwebkitd4.dll")
+ self.path("qtxmlpatternsd4.dll")
+ self.path("ssleay32.dll")
+
+ # For WebKit/Qt plugin runtimes (image format plugins)
+ if self.prefix(src="imageformats", dst="imageformats"):
+ self.path("qgifd4.dll")
+ self.path("qicod4.dll")
+ self.path("qjpegd4.dll")
+ self.path("qmngd4.dll")
+ self.path("qsvgd4.dll")
+ self.path("qtiffd4.dll")
+ self.end_prefix()
+
+ self.end_prefix()
+ else:
+ if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'release'),
+ dst="llplugin"):
+ self.path("libeay32.dll")
+ self.path("qtcore4.dll")
+ self.path("qtgui4.dll")
+ self.path("qtnetwork4.dll")
+ self.path("qtopengl4.dll")
+ self.path("qtwebkit4.dll")
+ self.path("qtxmlpatterns4.dll")
+ self.path("ssleay32.dll")
+
+ # For WebKit/Qt plugin runtimes (image format plugins)
+ if self.prefix(src="imageformats", dst="imageformats"):
+ self.path("qgif4.dll")
+ self.path("qico4.dll")
+ self.path("qjpeg4.dll")
+ self.path("qmng4.dll")
+ self.path("qsvg4.dll")
+ self.path("qtiff4.dll")
+ self.end_prefix()
+
+ self.end_prefix()
self.disable_manifest_check()
@@ -346,6 +388,9 @@ class WindowsManifest(ViewerManifest):
self.path(src='../win_updater/%s/windows-updater.exe' % self.args['configuration'],
dst="updater.exe")
+ if not self.is_packaging_viewer():
+ self.package_file = "copied_deps"
+
def nsi_file_commands(self, install=True):
def wpath(path):
if path.endswith('/') or path.endswith(os.path.sep):
@@ -822,6 +867,7 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libopenjpeg.so.1.3.0", "libopenjpeg.so.1.3")
self.path("libalut.so")
self.path("libopenal.so", "libopenal.so.1")
+ self.path("libopenal.so", "libvivoxoal.so.1") # vivox's sdk expects this soname
try:
self.path("libkdu_v42R.so", "libkdu.so")
pass
@@ -843,7 +889,7 @@ class Linux_i686Manifest(LinuxManifest):
if self.prefix(src="vivox-runtime/i686-linux", dst="lib"):
self.path("libortp.so")
self.path("libsndfile.so.1")
- self.path("libvivoxoal.so.1")
+ #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OAL lib
self.path("libvivoxsdk.so")
self.path("libvivoxplatform.so")
self.end_prefix("lib")